From 8229dc4888393f53068325dc7ec3442575a4d495 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 21 Jan 2021 21:39:51 -0500 Subject: [PATCH 001/255] checkpoint belt support work. fixes for danish --- notes.md | 1 + src/kiri/conf.js | 2 +- src/kiri/init.js | 8 ++-- src/kiri/worker.js | 6 +-- src/mode/fdm/client.js | 2 +- src/mode/fdm/prepare.js | 4 +- src/mode/fdm/slice.js | 86 +++++++++++++++++++++++++++++++++++++++-- web/kiri/lang/da.js | 4 +- 8 files changed, 98 insertions(+), 15 deletions(-) diff --git a/notes.md b/notes.md index cd55f420..2e1407be 100644 --- a/notes.md +++ b/notes.md @@ -55,6 +55,7 @@ # CAM +* `B` tabs are not cut to exact height * `B` first rough step too far down in certain circumstances? * `B` trace open polys are not wound consistently * `B` path routing with tabs sometimes makes no sense diff --git a/src/kiri/conf.js b/src/kiri/conf.js index 0bef439a..b42cd45c 100644 --- a/src/kiri/conf.js +++ b/src/kiri/conf.js @@ -296,7 +296,7 @@ sliceSupportExtra: 0, sliceSupportAngle: 50, sliceSupportNozzle: 0, - sliceSupportEnable: false, + // sliceSupportEnable: false, sliceSolidMinArea: 1, sliceSolidLayers: 3, sliceBottomLayers: 3, diff --git a/src/kiri/init.js b/src/kiri/init.js index b954f2cf..861cf6c2 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -1650,18 +1650,18 @@ fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}), sliceSupportSize: UC.newInput(LANG.sp_size_s, {title:LANG.sp_size_l, bound:UC.bound(1.0,200.0), convert:UC.toFloat, modes:FDM}), sliceSupportOffset: UC.newInput(LANG.sp_offs_s, {title:LANG.sp_offs_l, bound:UC.bound(0.0,200.0), convert:UC.toFloat, modes:FDM}), - sliceSupportGap: UC.newInput(LANG.sp_gaps_s, {title:LANG.sp_gaps_l, bound:UC.bound(0,5), convert:UC.toInt, modes:FDM}), + sliceSupportGap: UC.newInput(LANG.sp_gaps_s, {title:LANG.sp_gaps_l, bound:UC.bound(0,5), convert:UC.toInt, modes:FDM, show:isNotBelt}), fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}), sliceSupportArea: UC.newInput(LANG.sp_area_s, {title:LANG.sp_area_l, bound:UC.bound(0.0,200.0), convert:UC.toFloat, modes:FDM}), sliceSupportExtra: UC.newInput(LANG.sp_xpnd_s, {title:LANG.sp_xpnd_l, bound:UC.bound(0.0,200.0), convert:UC.toFloat, modes:FDM}), fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}), - sliceSupportAngle: UC.newInput(LANG.sp_angl_s, {title:LANG.sp_angl_l, bound:UC.bound(0.0,90.0), convert:UC.toFloat, modes:FDM}), + sliceSupportAngle: UC.newInput(LANG.sp_angl_s, {title:LANG.sp_angl_l, bound:UC.bound(0.0,90.0), convert:UC.toFloat, modes:FDM, show:isNotBelt}), sliceSupportEnable: UC.newBoolean(LANG.sp_auto_s, onBooleanClick, {title:LANG.sp_auto_l, modes:FDM, show:isNotBelt}), sliceSupportGen: UC.newRow([ UI.ssaGen = UC.newButton(LANG.sp_detect, onButtonClick, {class: "f-col grow a-center"}) - ], { modes: FDM, class: "ext-buttons f-row grow" }), - fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}), + ], { modes: FDM, class: "ext-buttons f-row grow", show:isNotBelt }), + fdmSep: UC.newBlank({class:"pop-sep", modes:FDM, show:isNotBelt}), sliceSupportManual: UC.newRow([ (UI.ssmAdd = UC.newButton(undefined, onButtonClick, {icon:''})), (UI.ssmDun = UC.newButton(undefined, onButtonClick, {icon:''})), diff --git a/src/kiri/worker.js b/src/kiri/worker.js index 0d399c46..d41e5396 100644 --- a/src/kiri/worker.js +++ b/src/kiri/worker.js @@ -84,7 +84,7 @@ KIRI.worker = { if (z < 0.01) miny = Math.min(miny, y); } - widget.getBoundingBox(true); + let bb1 = widget.getBoundingBox(true); let track = widget.track; xpos = track.pos.x; ypos = settings.device.bedDepth / 2 + track.pos.y + miny; @@ -94,8 +94,8 @@ KIRI.worker = { widget.loadVertices(widget.vertices); widget._rotate(rotation,0,0,true); widget.center(false, true); - widget.getBoundingBox(true); - widget.belt = { xpos, ypos }; + let bb2 = widget.getBoundingBox(true); + widget.belt = { xpos, ypos, zmov: (bb2.max.z - bb1.max.z)/2 }; } widget.slice(settings, function(error) { diff --git a/src/mode/fdm/client.js b/src/mode/fdm/client.js index 46c9e9cd..64fd4191 100644 --- a/src/mode/fdm/client.js +++ b/src/mode/fdm/client.js @@ -35,7 +35,7 @@ restoreSupports(api.widgets.all()); }); api.event.on("settings.saved", (settings) => { - api.ui.fdmSupport.style.display = lastMode !== 'FDM' || settings.device.bedBelt ? 'none' : 'flex'; + // api.ui.fdmSupport.style.display = lastMode !== 'FDM' || settings.device.bedBelt ? 'none' : 'flex'; }); api.event.on("button.click", target => { switch (target) { diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index 63d7b99b..9f9dfb8e 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -216,6 +216,8 @@ let swidget = KIRI.newWidget(); swidget.slices = sslices; swidget.support = true; + swidget.rotinfo = widget.rotinfo; + swidget.belt = widget.belt; swidget.mesh = { widget: swidget, position: widget.mesh.position }; settings.widget[swidget.id] = { extruder: process.sliceSupportNozzle }; widgets.push(swidget); @@ -288,7 +290,7 @@ // establish offsets for (let widget of widgets) { let { rotinfo, belt } = widget; - // console.log({rotinfo, belt}); + console.log({rotinfo, belt, widget}); let offset = widget.mesh ? Object.clone(widget.mesh.position) : {x:0, y:0, z:0}; if (isBelt) { offset.x = rotinfo.xpos; diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index 17406b53..6bc6aa6c 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -23,7 +23,8 @@ infill: { check: 0x3322bb, face: 0x3322bb, line: 0x3322bb, opacity: 1 }, support: { check: 0xaa5533, face: 0xaa5533, line: 0xaa5533, opacity: 1 } }, - PROTO = Object.clone(COLOR); + PROTO = Object.clone(COLOR), + bwcomp = (1 / Math.cos(Math.PI/4)); let isThin = false; // force line rendering let isFlat = false; // force flat rendering @@ -210,6 +211,11 @@ // slices[0].output() // .setLayer('shadow', { line: 0xff0000, check: 0xff0000 }) // .addPolys(shadow); + if (isBelt) { + for (let col of fixed) { + col.z += widget.belt.zmov; + } + } } // create shells and diff inner fillable areas @@ -271,7 +277,7 @@ }, "infill"); } - // calculations only relevant when supports are enabled + // belt supports are their own thing if (!isBelt) { let auto = spro.sliceSupportEnable && spro.sliceSupportDensity > 0.0, minArea = spro.sliceSupportArea; @@ -282,6 +288,8 @@ forSlices(0.8, 0.9, slice => { doSupportFill(slice, lineWidth, spro.sliceSupportDensity, minArea); }, "support"); + } else if (false) { + doSupportBelt(slices, spro, fixed, shadow, doupdate); } // render if not explicitly disabled @@ -864,6 +872,77 @@ return true; }; + function doSupportBelt(slices, proc, fixed, shadow, doupdate) { + if (!fixed || fixed.length === 0) { + return; + } + + let minArea = proc.supportMinArea, + offset = proc.sliceSupportOffset, + min = minArea || 0.01; + + // find slice closest to z + function findSlice(z) { + let mind = Infinity, + mins = null; + for (let slice of slices) { + let d = Math.abs(slice.z - z); + if (d < mind) { + mind = d; + mins = slice; + } + } + return mins; + } + + // add support pillar to a slice + function addPillar(slice, sup) { + // ensure slice has offsets + if (!slice.offsets) { + // create inner clip offset from tops + POLY.expand(slice.topPolys(), offset, slice.z, slice.offsets = []); + } + // ensure slice has supports array + if (!slice.supports) { + slice.supports = []; + } + // calculate support rect + let dz = sup.z - slice.z; + let dy = dz; + let dw = bwcomp; + let center = BASE.newPoint(sup.x, sup.y + dy, slice.z); + let poly = [ BASE.newPolygon().centerRectangle(center, sup.dw, sup.dw * dw) ]; + let trim = []; + // poly = POLY.trimTo(poly, shadow); + POLY.subtract(poly, slice.offsets, trim, null, slice.z, min); + // if support is entirely culled, terminate projection + if (trim.length === 0) { + return false; + } + slice.supports.appendAll(trim); + return true; + } + + for (let sup of fixed) { + let slice = findSlice(sup.z); + let rem = addPillar(slice, sup); + let zmin = sup.z - sup.dh / 2; + let zmax = sup.z + sup.dh / 2; + while (slice.up && slice.up.z <= zmax) { + slice = slice.up; + if (!addPillar(slice, sup)) { + break; + } + } + while (slice.down && slice.down.z >= zmin) { + slice = slice.down; + if (!addPillar(slice, sup)) { + break; + } + } + } + } + /** * calculate external overhangs requiring support. * this is done bottom-up except for fixed supports (manual) @@ -961,6 +1040,7 @@ let zmin = sup.z - sup.dh / 2; let zmax = sup.z + sup.dh / 2; if (slice.z >= zmin && slice.z <= zmax) { + let dz = sup.z - slice.z; let center = BASE.newPoint(sup.x, sup.y, slice.z); supports.push(BASE.newPolygon().centerRectangle(center, sup.dw, sup.dw)); } @@ -984,7 +1064,7 @@ // set depth hint on support polys for infill density trimmed.forEach(function(trim) { - if (trim.area() < 0.1) return; + // if (trim.area() < 0.1) return; culled.push(trim.setZ(down.z)); }); diff --git a/web/kiri/lang/da.js b/web/kiri/lang/da.js index c50e2166..c45c63b0 100644 --- a/web/kiri/lang/da.js +++ b/web/kiri/lang/da.js @@ -135,7 +135,7 @@ kiri.lang['da'] = op_sped_s: "vis hastigheder", op_sped_l: "vis hastighed til farve bar\ni forhåndsvisning", op_auto_s: "auto fordel", - op_auto_l: "automatisk layoutplatform,\nnår nye dele tilføjes, + op_auto_l: "automatisk layoutplatform,\nnår nye dele tilføjes", op_free_s: "free layout", op_free_l: "permit dragable layout\nno effect in laser mode", op_invr_s: "vend zoom om", @@ -346,7 +346,7 @@ kiri.lang['da'] = cd_lift_s: "løft bor", cd_lift_l: "løft mellem dyk\nefter opholdsperiode\ni arbejdsområdets enheder\n0 for at deaktivere", cd_regi_s: "registrer", - cd_regi_l: "bore registreringshuller\ntil dobbeltsidede dele\uafhængigt af aktivering af\nboring, men bruger samme værktøj og indstillinger", + cd_regi_l: "bore registreringshuller\ntil dobbeltsidede dele\nuafhængigt af aktivering af\nboring, men bruger samme værktøj og indstillinger", // CNC CUTOUT TABS ct_menu: "tapper", From 1ce046feed4fc17deee048c3c127d7b19e2a8220 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 21 Jan 2021 21:40:26 -0500 Subject: [PATCH 002/255] bump rev 2.6.D9 --- package.json | 2 +- src/kiri.js | 2 +- src/license.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index ff05ee4c..ec1f15e0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grid-apps", - "version": "2.6.8D", + "version": "2.6.9D", "description": "grid.space 3d slice & modeling tools", "author": "Stewart Allen ", "license": "MIT", diff --git a/src/kiri.js b/src/kiri.js index 03574794..fd00c164 100644 --- a/src/kiri.js +++ b/src/kiri.js @@ -6,7 +6,7 @@ if (!self.kiri) { self.kiri = { - beta: 2608, + beta: 2609, driver: {}, // driver modules loader: [] // module loading: array of functions }; diff --git a/src/license.js b/src/license.js index 9d070655..9f143a82 100644 --- a/src/license.js +++ b/src/license.js @@ -3,7 +3,7 @@ let terms = { COPYRIGHT: "Copyright (C) Stewart Allen - All Rights Reserved", LICENSE: "See the license.md file included with the source distribution", - VERSION: "2.6.D8" + VERSION: "2.6.D9" }; if (typeof(module) === 'object') { From be8e2054d45d8a80f7dd24b96bca8ae84768b94a Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 21 Jan 2021 23:45:03 -0500 Subject: [PATCH 003/255] add hack to rotate support columm mid-points --- src/kiri/worker.js | 36 ++++++++++++++++++++++++++++++++++-- src/mode/fdm/slice.js | 7 +------ 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/src/kiri/worker.js b/src/kiri/worker.js index d41e5396..2c504c12 100644 --- a/src/kiri/worker.js +++ b/src/kiri/worker.js @@ -91,11 +91,43 @@ KIRI.worker = { widget.mesh = null; widget.points = null; - widget.loadVertices(widget.vertices); + + // this super ugly hack injects fake support faces + // into the widget mesh so they can be rotated and extracted + let fv = Array.from(widget.vertices); + let fvl = fv.length; + let fixed = Object.values(settings.widget[widget.id].support || {}); + for (let col of fixed) { + fv.push(col.x); + fv.push(col.y); + fv.push(col.z); + fv.push(col.x); + fv.push(col.y); + fv.push(col.z); + fv.push(col.x); + fv.push(col.y); + fv.push(col.z); + } + let f2l = fv.length; + let f32 = fv.toFloat32(); + // use falsified vertices + widget.loadVertices(f32); + + // widget.loadVertices(widget.vertices); widget._rotate(rotation,0,0,true); widget.center(false, true); let bb2 = widget.getBoundingBox(true); - widget.belt = { xpos, ypos, zmov: (bb2.max.z - bb1.max.z)/2 }; + + // hack part 2: recover rotated support column mid-points + for (let i=0; i { doSupportFill(slice, lineWidth, spro.sliceSupportDensity, minArea); }, "support"); - } else if (false) { + } else if (true) { doSupportBelt(slices, spro, fixed, shadow, doupdate); } From cbc9fb8da3c0adb2fcdd16d78157791ceb4f2919 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 22 Jan 2021 10:41:04 -0500 Subject: [PATCH 004/255] add setFocus() and multi-use 'v' key to refocus on center of all widgets --- src/kiri/init.js | 3 +++ src/kiri/main.js | 22 +++++++++++++++++++++- src/moto/ctrl.js | 9 +++++++++ src/moto/space.js | 22 +++++++++++++++------- 4 files changed, 48 insertions(+), 8 deletions(-) diff --git a/src/kiri/init.js b/src/kiri/init.js index 861cf6c2..3bd72f24 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -414,6 +414,9 @@ API.show.local(); break; case cca('v'): // toggle single slice view mode + if (API.view.get() === VIEWS.ARRANGE) { + API.space.set_focus(); + } if (API.var.layer_hi == API.var.layer_lo) { API.var.layer_lo = 0; } else { diff --git a/src/kiri/main.js b/src/kiri/main.js index da537b6d..a10a32c1 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -327,7 +327,8 @@ reload: reload, restore: restoreWorkspace, clear: clearWorkspace, - save: saveWorkspace + save: saveWorkspace, + set_focus: setFocus }, tweak, util: { @@ -368,6 +369,25 @@ work: KIRI.work }; + function setFocus(widgets) { + if (widgets === undefined) { + widgets = WIDGETS; + } else if (!Array.isArray) { + widgets = [ widgets ]; + } + let pos = { x:0, y:0, z:0 }; + for (let widget of widgets) { + pos.x += widget.track.pos.x; + pos.y += widget.track.pos.y; + pos.z += widget.track.pos.z; + } + pos.x /= widgets.length; + pos.y /= widgets.length; + pos.z /= widgets.length; + SPACE.platform.setCenter(pos.x, -pos.y, pos.z); + SPACE.view.setFocus(new THREE.Vector3(pos.x, pos.z, -pos.y)); + } + function reload() { API.event.emit('reload'); do_reload(100); diff --git a/src/moto/ctrl.js b/src/moto/ctrl.js index 0155dad6..34d6f439 100644 --- a/src/moto/ctrl.js +++ b/src/moto/ctrl.js @@ -181,6 +181,15 @@ MOTO.CTRL = function (object, domElement, notify, slider) { } }; + this.getTarget = function() { + return this.target; + }; + + this.setTarget = function(t) { + this.target = t; + this.target0 = this.target.clone(); + } + function isValue(v) { return v !== null && v !== undefined; } diff --git a/src/moto/space.js b/src/moto/space.js index b1b1111c..7906b4a2 100644 --- a/src/moto/space.js +++ b/src/moto/space.js @@ -16,7 +16,9 @@ PI2 = PI / 2, PI4 = PI / 4, ROUND = Math.round, + panX = 0, panY = 0, + panZ = 0, gridZOff = 0, platformZOff = 0, perspective = 35, @@ -896,6 +898,7 @@ add: function(o) { WORLD.add(o) }, remove: function(o) { WORLD.remove(o) }, setMaxZ: function(z) { panY = z / 2 }, + setCenter: function(x,y,z) { panX = x; panY = z, panZ = y }, isHidden: function() { return !showPlatform }, setHidden: function(b) { showPlatform = !b; platform.visible = !b }, setHiding: function(b) { hidePlatformBelow = b }, @@ -935,12 +938,12 @@ }, view: { - top: function() { tweenCam({left: 0, up: 0, panX: 0, panY: panY, panZ: 0}) }, - back: function() { tweenCam({left: PI, up: PI2, panX: 0, panY: panY, panZ: 0}) }, - home: function() { tweenCam({left: 0, up: PI4, panX: 0, panY: panY, panZ: 0}) }, - front: function() { tweenCam({left: 0, up: PI2, panX: 0, panY: panY, panZ: 0}) }, - right: function() { tweenCam({left: PI2, up: PI2, panX: 0, panY: panY, panZ: 0}) }, - left: function() { tweenCam({left: -PI2, up: PI2, panX: 0, panY: panY, panZ: 0}) }, + top: function() { tweenCam({left: 0, up: 0, panX, panY, panZ}) }, + back: function() { tweenCam({left: PI, up: PI2, panX, panY, panZ}) }, + home: function() { tweenCam({left: 0, up: PI4, panX, panY, panZ}) }, + front: function() { tweenCam({left: 0, up: PI2, panX, panY, panZ}) }, + right: function() { tweenCam({left: PI2, up: PI2, panX, panY, panZ}) }, + left: function() { tweenCam({left: -PI2, up: PI2, panX, panY, panZ}) }, reset: function() { viewControl.reset(); requestRefresh() }, load: function(cam) { viewControl.setPosition(cam) }, save: function() { return viewControl.getPosition(true) }, @@ -953,7 +956,12 @@ viewControl.setMouse(viewControl.mouseDefault); } }, - getFPS: function() { return fps } + getFPS: function() { return fps }, + getFocus: function() { return viewControl.getTarget() }, + setFocus: function(v) { + viewControl.setTarget(v); + refresh(); + }, }, mouse: { From f4f39ef014e46b2117af24fc58c7805ab85ffa51 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 22 Jan 2021 10:44:01 -0500 Subject: [PATCH 005/255] setFocus will not prioritize selection --- src/kiri/init.js | 2 +- src/kiri/main.js | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/kiri/init.js b/src/kiri/init.js index 3bd72f24..7d93c173 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -415,7 +415,7 @@ break; case cca('v'): // toggle single slice view mode if (API.view.get() === VIEWS.ARRANGE) { - API.space.set_focus(); + API.space.set_focus(API.selection.widgets()); } if (API.var.layer_hi == API.var.layer_lo) { API.var.layer_lo = 0; diff --git a/src/kiri/main.js b/src/kiri/main.js index a10a32c1..baf970af 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -374,6 +374,8 @@ widgets = WIDGETS; } else if (!Array.isArray) { widgets = [ widgets ]; + } else if (widgets.length === 0) { + widgets = WIDGETS; } let pos = { x:0, y:0, z:0 }; for (let widget of widgets) { From 20e0f0d7220fa74fe1d7bcb8db935ed87c1681b1 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 22 Jan 2021 14:19:13 -0500 Subject: [PATCH 006/255] add new keyboard shortcuts --- notes.md | 2 +- src/kiri/init.js | 1 + web/kiri/lang/en-help.html | 11 ++++++++--- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/notes.md b/notes.md index 2e1407be..3c543ad0 100644 --- a/notes.md +++ b/notes.md @@ -51,7 +51,7 @@ # FDM - BELT -* `B` fix supports for belt printing +* `B` finish supports for belt printing. clip below belt. add progress. # CAM diff --git a/src/kiri/init.js b/src/kiri/init.js index 7d93c173..5a1ad8e9 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -461,6 +461,7 @@ break; case cca('a'): // auto arrange items on platform platform.layout(); + API.space.set_focus(API.selection.widgets()); break; default: API.event.emit('keypress', evt); diff --git a/web/kiri/lang/en-help.html b/web/kiri/lang/en-help.html index 8a70359c..7bf9e672 100644 --- a/web/kiri/lang/en-help.html +++ b/web/kiri/lang/en-help.html @@ -83,6 +83,7 @@ CAM Tool Selection Grid Local Devices Preference panel + Work Profiles Mode Arrange @@ -96,11 +97,14 @@ Recent View - Top Home - Layer + Top + Front + Back Reset View - dragPan + Cycle Side Views + Focus (arrange) + Layer (slice/preview) Objects Duplicate @@ -128,6 +132,7 @@ Rotate Zoom Zoom + dragPan Objects Align face to bed From b482c79fa74f7cf2ecf65a5fbcfc22bd90a283d5 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 22 Jan 2021 15:33:18 -0500 Subject: [PATCH 007/255] change home/front default rotation in belt mode --- src/kiri/init.js | 3 +++ src/moto/space.js | 8 ++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/kiri/init.js b/src/kiri/init.js index 5a1ad8e9..6137dc9c 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -729,6 +729,9 @@ UI.deviceRound.checked = dev.bedRound; UI.deviceOrigin.checked = dev.outputOriginCenter || dev.originCenter; + // change home default in belt mode + API.const.SPACE.view.setHome(dev.bedBelt ? Math.PI/2 : 0); + // add extruder selection buttons if (dev.extruders) { let ext = API.lists.extruders = []; diff --git a/src/moto/space.js b/src/moto/space.js index 7906b4a2..1d3e7227 100644 --- a/src/moto/space.js +++ b/src/moto/space.js @@ -19,6 +19,7 @@ panX = 0, panY = 0, panZ = 0, + home = 0, gridZOff = 0, platformZOff = 0, perspective = 35, @@ -938,9 +939,9 @@ }, view: { - top: function() { tweenCam({left: 0, up: 0, panX, panY, panZ}) }, + top: function() { tweenCam({left: home, up: 0, panX, panY, panZ}) }, back: function() { tweenCam({left: PI, up: PI2, panX, panY, panZ}) }, - home: function() { tweenCam({left: 0, up: PI4, panX, panY, panZ}) }, + home: function() { tweenCam({left: home, up: PI4, panX, panY, panZ}) }, front: function() { tweenCam({left: 0, up: PI2, panX, panY, panZ}) }, right: function() { tweenCam({left: PI2, up: PI2, panX, panY, panZ}) }, left: function() { tweenCam({left: -PI2, up: PI2, panX, panY, panZ}) }, @@ -962,6 +963,9 @@ viewControl.setTarget(v); refresh(); }, + setHome: function(r) { + home = r || 0; + } }, mouse: { From 0be501d0d52f85f89a36b20ebea8a1c021493d3c Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 22 Jan 2021 21:06:28 -0500 Subject: [PATCH 008/255] disable brim threshold @ 0. limit support projection. set z mid in setFocus --- src/kiri/main.js | 2 +- src/mode/fdm/prepare.js | 3 +-- src/mode/fdm/slice.js | 4 ++-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/kiri/main.js b/src/kiri/main.js index baf970af..7a5215e1 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -387,7 +387,7 @@ pos.y /= widgets.length; pos.z /= widgets.length; SPACE.platform.setCenter(pos.x, -pos.y, pos.z); - SPACE.view.setFocus(new THREE.Vector3(pos.x, pos.z, -pos.y)); + SPACE.view.setFocus(new THREE.Vector3(pos.x, topZ / 2, -pos.y)); } function reload() { diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index 9f9dfb8e..1dc989c7 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -290,7 +290,6 @@ // establish offsets for (let widget of widgets) { let { rotinfo, belt } = widget; - console.log({rotinfo, belt, widget}); let offset = widget.mesh ? Object.clone(widget.mesh.position) : {x:0, y:0, z:0}; if (isBelt) { offset.x = rotinfo.xpos; @@ -482,7 +481,7 @@ lastout = rec; } // skip if brig trigger not met - if (firstLayerBrimTrig && mins > firstLayerBrimTrig) { + if (firstLayerBrimTrig > 0 && mins > firstLayerBrimTrig) { continue; } // add brim, if specified diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index 270fc3c4..14d57358 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -921,8 +921,8 @@ for (let sup of fixed) { let slice = findSlice(sup.z); let rem = addPillar(slice, sup); - let zmin = sup.z - sup.dh / 2; - let zmax = sup.z + sup.dh / 2; + let zmin = sup.z - (sup.dh * 0.75) / 2; + let zmax = sup.z + (sup.dh * 0.75) / 2; while (slice.up && slice.up.z <= zmax) { slice = slice.up; if (!addPillar(slice, sup)) { From 834a93adcbd4728a644b206d3da334841e861750 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 22 Jan 2021 21:14:34 -0500 Subject: [PATCH 009/255] bump rev 2.6.D10 --- package.json | 2 +- src/kiri.js | 2 +- src/license.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index ec1f15e0..7b0a6f72 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grid-apps", - "version": "2.6.9D", + "version": "2.6.10D", "description": "grid.space 3d slice & modeling tools", "author": "Stewart Allen ", "license": "MIT", diff --git a/src/kiri.js b/src/kiri.js index fd00c164..28bef6f5 100644 --- a/src/kiri.js +++ b/src/kiri.js @@ -6,7 +6,7 @@ if (!self.kiri) { self.kiri = { - beta: 2609, + beta: 2610, driver: {}, // driver modules loader: [] // module loading: array of functions }; diff --git a/src/license.js b/src/license.js index 9f143a82..544b3a98 100644 --- a/src/license.js +++ b/src/license.js @@ -3,7 +3,7 @@ let terms = { COPYRIGHT: "Copyright (C) Stewart Allen - All Rights Reserved", LICENSE: "See the license.md file included with the source distribution", - VERSION: "2.6.D9" + VERSION: "2.6.D10" }; if (typeof(module) === 'object') { From d51eede8940b5a1638d58380744cb83612998c85 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 22 Jan 2021 22:09:29 -0500 Subject: [PATCH 010/255] update focus when changing devices --- src/kiri/init.js | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/src/kiri/init.js b/src/kiri/init.js index 6137dc9c..dfcfe045 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -701,25 +701,24 @@ dproc = current.devproc[devicename], dev = current.device = CONF.device_from_code(code,mode), proc = current.process, - newdev = dproc === undefined; + newdev = dproc === undefined, // first time device is selected + predev = current.filter[mode], // previous device selection + chgdev = predev !== devicename; // device is changing // first time device use, add any print profiles and set to default if present - // if (newdev) { - // console.log('new device', code); - if (code.profiles) { - for (let profile of code.profiles) { - let profname = profile.processName; - if (!current.sproc[mode][profname]) { - console.log('adding profile', profname, 'to', mode); - current.sproc[mode][profname] = profile; - } - if (newdev && !current.devproc[devicename]) { - console.log('setting default profile for new device', devicename, 'to', profname); - current.devproc[devicename] = dproc = profname; - } + if (code.profiles) { + for (let profile of code.profiles) { + let profname = profile.processName; + if (!current.sproc[mode][profname]) { + console.log('adding profile', profname, 'to', mode); + current.sproc[mode][profname] = profile; + } + if (newdev && !current.devproc[devicename]) { + console.log('setting default profile for new device', devicename, 'to', profname); + current.devproc[devicename] = dproc = profname; } } - // } + } dev.new = false; dev.deviceName = devicename; @@ -729,9 +728,6 @@ UI.deviceRound.checked = dev.bedRound; UI.deviceOrigin.checked = dev.outputOriginCenter || dev.originCenter; - // change home default in belt mode - API.const.SPACE.view.setHome(dev.bedBelt ? Math.PI/2 : 0); - // add extruder selection buttons if (dev.extruders) { let ext = API.lists.extruders = []; @@ -821,6 +817,13 @@ } API.conf.save(); + + API.const.SPACE.view.setHome(dev.bedBelt ? Math.PI/2 : 0); + // when changing devices, update focus on widgets + if (chgdev) { + setTimeout(API.space.set_focus, 0); + } + UC.refresh(); if (dev.imageURL) { From d5463bea7f47eefd80e1a28e53eb01768af53eb8 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 23 Jan 2021 10:20:31 -0500 Subject: [PATCH 011/255] fix set focus with 0 widgets --- src/kiri/main.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/kiri/main.js b/src/kiri/main.js index 7a5215e1..6ee904e9 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -383,9 +383,11 @@ pos.y += widget.track.pos.y; pos.z += widget.track.pos.z; } - pos.x /= widgets.length; - pos.y /= widgets.length; - pos.z /= widgets.length; + if (widgets.length) { + pos.x /= widgets.length; + pos.y /= widgets.length; + pos.z /= widgets.length; + } SPACE.platform.setCenter(pos.x, -pos.y, pos.z); SPACE.view.setFocus(new THREE.Vector3(pos.x, topZ / 2, -pos.y)); } From af0111cb3254cccc03733e340e842ae2a4d282db Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 23 Jan 2021 17:21:30 -0500 Subject: [PATCH 012/255] remote notes --- notes.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/notes.md b/notes.md index 3c543ad0..7378e84a 100644 --- a/notes.md +++ b/notes.md @@ -51,6 +51,7 @@ # FDM - BELT +* `B` layer retract broken * `B` finish supports for belt printing. clip below belt. add progress. # CAM @@ -91,7 +92,7 @@ * `F` gcode output option as zip for multiple or flip ops or tool change * `F` ease-down should be engaged in all descending cutting operations * `F` entirely user-selectable origin - +* `F` maintain several part orientations + op chains in a single profile * `P` common part pre-analyze to speed up 'slice' and improve shadow (overhangs) * `P` redo all path route / planning in prepare to account for terrain before camOut From dba922753c88f837c3bd53c2465cf80b5c29b1c2 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 24 Jan 2021 00:13:09 -0500 Subject: [PATCH 013/255] checkpoint new support / rotation work --- notes.md | 5 +- src/add/three.js | 5 +- src/kiri/client.js | 32 ++++- src/kiri/main.js | 43 ++++--- src/kiri/widget.js | 12 +- src/kiri/worker.js | 263 ++++++++++++++++++++-------------------- src/mode/fdm/client.js | 44 +++++++ src/mode/fdm/prepare.js | 5 +- src/mode/fdm/slice.js | 7 +- 9 files changed, 254 insertions(+), 162 deletions(-) diff --git a/notes.md b/notes.md index 7378e84a..47b304e4 100644 --- a/notes.md +++ b/notes.md @@ -51,8 +51,9 @@ # FDM - BELT -* `B` layer retract broken -* `B` finish supports for belt printing. clip below belt. add progress. +* `B` layer retract broken? +* `B` infill / thin-fill is generating tons of small linear segments +* `B` finish supports for belt printing. add progress. # CAM diff --git a/src/add/three.js b/src/add/three.js index 6049dfcb..4baccf91 100644 --- a/src/add/three.js +++ b/src/add/three.js @@ -70,7 +70,10 @@ // return cached or refreshed (when update = true) bounding box GP.getBoundingBox = function(update) { - if (update || !this.boundingBox) this.computeBoundingBox(); + if (update || !this.boundingBox) { + this.boundingBox = null; + this.computeBoundingBox(); + } this.boundingBox.dim = this.boundingBox.max.clone().sub(this.boundingBox.min); return this.boundingBox; }; diff --git a/src/kiri/client.js b/src/kiri/client.js index 635798c8..c8ad3859 100644 --- a/src/kiri/client.js +++ b/src/kiri/client.js @@ -123,17 +123,18 @@ KIRI.work = { }, // widget sync - sync: function(widget) { - let widgets = widget ? [ widget ] : KIRI.api.widgets.all(); + sync: function() { + let widgets = KIRI.api.widgets.all(); widgets.forEach(widget => { if (widget.modified || !syncd[widget.id]) { syncd[widget.id] = true; let vertices = widget.getGeoVertices().buffer.slice(0); send("sync", { id: widget.id, + group: widget.group.id, + track: widget.track, vertices: vertices, position: widget.mesh.position, - tracking: widget.track }, done => { widget.modified = false; }, [vertices]); @@ -141,8 +142,31 @@ KIRI.work = { }); }, + rotate: function(settings, callback) { + send("rotate", { settings }, reply => { + if (reply.group) { + for (let widget of KIRI.Widget.Groups.forid(reply.group)) { + widget.belt = reply.belt; + } + } else if (callback) { + callback(); + } + }); + }, + + unrotate: function(settings, callback) { + send("unrotate", { settings }, reply => { + if (reply.group) { + for (let widget of KIRI.Widget.Groups.forid(reply.group)) { + widget.rotinfo = reply.rotinfo; + } + } else if (callback) { + callback(); + } + }); + }, + slice: function(settings, widget, callback) { - CLIENT.sync(widget); slicing[widget.id] = callback; send("slice", { diff --git a/src/kiri/main.js b/src/kiri/main.js index 6ee904e9..6e023939 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -355,7 +355,9 @@ return map; }, new: newWidget, - all: function() { return WIDGETS.slice() }, + all: () => { return WIDGETS.slice() }, + add: (widget) => { WIDGETS.push(widget) }, + filter: (fn) => { WIDGETS = WIDGETS.filter(fn) }, for: forAllWidgets, load: Widget.loadFromCatalog, meshes: meshArray, @@ -858,6 +860,9 @@ setOpacity(color.slicing_opacity); STACKS.clear(); + KIRI.client.clear(); + KIRI.client.sync(); + KIRI.client.rotate(settings); // for each widget, slice forAllWidgets(function(widget) { @@ -867,11 +872,12 @@ startTime = Date.now(), lastMsg, camOrLaser = mode === 'CAM' || mode === 'LASER', - stack = STACKS.create(widget.id, widget.mesh); + stack = widget.stack = STACKS.create(widget.id, widget.mesh); widget.stats.progress = 0; widget.setColor(color.slicing); widget.slice(settings, function(sliced, error) { + widget.rotinfo = null; let mark = Date.now(); // update UI info if (sliced) { @@ -881,22 +887,26 @@ } API.event.emit('slice', getMode()); } - // on done - segtimes[`${segNumber}_draw`] = widget.render(stack); - // rotate stack for belt beds - if (settings.device.bedBelt && widget.rotinfo) { - stack.obj.rotate(widget.rotinfo); - } - updateSliderMax(true); - setVisibleLayer(-1, 0); - if (scale === 1) { - // clear wireframe - widget.setWireframe(false, color.wireframe, color.wireframe_opacity); - widget.setOpacity(camOrLaser ? color.cam_sliced_opacity : color.sliced_opacity); - widget.setColor(color.deselected); - } // on the last exit, update ui and call the callback if (--countdown === 0 || error || errored) { + KIRI.client.unrotate(settings, () => { + forAllWidgets(widget => { + // on done + segtimes[`${segNumber}_draw`] = widget.render(stack); + // rotate stack for belt beds + if (widget.rotinfo) { + widget.stack.obj.rotate(widget.rotinfo); + } + if (scale === 1) { + // clear wireframe + widget.setWireframe(false, color.wireframe, color.wireframe_opacity); + widget.setOpacity(camOrLaser ? color.cam_sliced_opacity : color.sliced_opacity); + widget.setColor(color.deselected); + } + }); + updateSliderMax(true); + setVisibleLayer(-1, 0); + }); // mark slicing complete for prep/preview complete.slice = true; if (scale === 1) { @@ -2077,6 +2087,7 @@ let newWidgets = [], oldWidgets = js2o(SDB.getItem('ws-widgets'), []); forAllWidgets(function(widget) { + if (widget.synth) return; newWidgets.push(widget.id); oldWidgets.remove(widget.id); widget.saveState(); diff --git a/src/kiri/widget.js b/src/kiri/widget.js index ace821a8..110cccb3 100644 --- a/src/kiri/widget.js +++ b/src/kiri/widget.js @@ -32,6 +32,10 @@ let Group = Widget.Groups = { + list: () => { + return groups.slice() + }, + forid: function(id) { for (let i=0; i { - w._rotate(x, y, z, false); + w._rotate(x, y, z, temp); }); - this.center(); + this.center(false); }; PRO._rotate = function(x, y, z, temp) { diff --git a/src/kiri/worker.js b/src/kiri/worker.js index 2c504c12..f52922e7 100644 --- a/src/kiri/worker.js +++ b/src/kiri/worker.js @@ -10,7 +10,8 @@ let BASE = self.base, print: null, snap: null }, - cache = {}; + wgroup = {}, + wcache = {}; // catch clipper alerts and convert to console messages self.alert = function(o) { @@ -24,7 +25,9 @@ BASE.debug.disable(); const dispatch = KIRI.server = KIRI.worker = { - cache: cache, + group: wgroup, + + cache: wcache, decimate: function(data, send) { let { vertices, options } = data; @@ -38,135 +41,152 @@ KIRI.worker = { send.done(); }, + clear: function(data, send) { + current.snap = null; + current.print = null; + if (!data.id) { + dispatch.group = wgroup = {}; + dispatch.cache = wcache = {}; + send.done({ clear: true }); + return; + } + let had = wcache[data.id] !== undefined; + delete wcache[data.id]; + send.done({ + id: data.id, + had: had, + has: wcache[data.id] !== undefined + }); + }, + // widget sync sync: function(data, send) { + let group = wgroup[data.group]; + if (!group) { + group = []; + group.id = data.group; + wgroup[data.group] = group; + } let vertices = new Float32Array(data.vertices), - points = BASE.verticesToPoints(vertices, { maxpass: 0 }), - widget = KIRI.newWidget(data.id).setPoints(points); + widget = KIRI.newWidget(data.id, group).loadVertices(vertices); // do it here so cancel can work - cache[data.id] = widget; + wcache[data.id] = widget; // stored for possible future rotations widget.vertices = vertices; - - // fake mesh object to satisfy printing - widget.track = data.tracking; - widget.mesh = { - widget: widget, - position: data.position - }; - + // restore tracking object + widget.track = data.track; send.done(data.id); }, - slice: function(data, send) { - let { id, settings } = data; + rotate: function(data, send) { + let { settings } = data; + if (!settings.device.bedBelt) { + return send.done({}); + } - send.data({update:0.05, updateStatus:"slicing"}); - - let widget = cache[data.id], - last = time(), - xpos, - ypos, - now; - - try { - - let rotation = (Math.PI/180) * (settings.device.bedBelt ? 45 : 0); - if (rotation) { - // need min y for post-rotation offset in prepare - let vert = widget.vertices; - let miny = Infinity; + function mins(vert) { + let miny = Infinity, minz = Infinity; for (let i=0, l=vert.length; i { send.data({ progress }); }, { thin: true }); send.done({parsed: KIRI.codec.encode(layers)}); }, - clear: function(data, send) { - current.snap = null; - current.print = null; - if (!data.id) { - cache = {}; - send.done({ clear: true }); - return; - } - let had = cache[data.id] !== undefined; - delete cache[data.id]; - send.done({ - id: data.id, - had: had, - has: cache[data.id] !== undefined - }); - }, - config: function(data, send) { const update = {}; if (data.base) { diff --git a/src/mode/fdm/client.js b/src/mode/fdm/client.js index 64fd4191..c066f1e1 100644 --- a/src/mode/fdm/client.js +++ b/src/mode/fdm/client.js @@ -20,6 +20,18 @@ FDM.init = function(kiri, api) { API = api; SPACE = api.const.SPACE; + + function filterSynth() { + // remove synth widgets + api.widgets.filter((widget) => { + if (widget.track.synth) { + api.const.SPACE.platform.remove(widget.mesh); + kiri.Widget.Groups.remove(widget); + } + return !widget.track.synth + }); + } + api.event.on("mode.set", mode => { isFdmMode = mode === 'FDM'; lastMode = mode; @@ -28,6 +40,7 @@ api.event.on("view.set", view => { lastView = view; updateVisiblity(); + filterSynth(); }); api.event.on("settings.load", (settings) => { if (settings.mode !== 'FDM') return; @@ -98,6 +111,37 @@ } func.sdone(); updateVisiblity(); + + // synth support widget for each widget group + let synth = []; + for (let group of kiri.Widget.Groups.list()) { + let count = 0; + let merged = new THREE.Geometry(); + for (let widget of group) { + if (widget.sups) { + for (let sup of Object.values(widget.sups)) { + merged.merge(sup.box.geometry, sup.box.matrix); + count++; + } + } + } + if (!count) { + continue; + } + let bbg = new THREE.BufferGeometry().fromGeometry(merged); + let sw = kiri.newWidget(null, group); + let fwp = group[0].track.pos; + sw.loadGeometry(bbg); + sw._move(fwp.x, fwp.y, fwp.z); + api.widgets.add(sw); + sw.track.synth = true; + api.const.SPACE.platform.add(sw.mesh); + } + }); + api.event.on("slice.end", () => { + if (!isFdmMode) { + return; + } }); api.event.on("key.esc", () => { if (!isFdmMode) { diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index 1dc989c7..eb2b6ab6 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -89,7 +89,7 @@ // nest and offset tops POLY.nest(tops).forEach(function(poly) { poly.offset(-offset + nozzle / 2).forEach(function(brim) { - brim.move(widget.mesh.position); + brim.move(widget.track.pos); brims.push(brim); }); }); @@ -290,7 +290,8 @@ // establish offsets for (let widget of widgets) { let { rotinfo, belt } = widget; - let offset = widget.mesh ? Object.clone(widget.mesh.position) : {x:0, y:0, z:0}; + let offset = Object.clone(widget.track.pos); + // let offset = widget.mesh ? Object.clone(widget.mesh.position) : {x:0, y:0, z:0}; if (isBelt) { offset.x = rotinfo.xpos; offset.y = -belt.midy; diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index 14d57358..dbc1d9df 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -199,8 +199,9 @@ }); // fixed supports (generated ahead of time) - const fixed = Object.values(settings.widget[widget.id].support || {}); - let shadow = null; + let wannot = settings.widget[widget.id] || {}, + fixed = Object.values(wannot.support || {}), + shadow = null; if (fixed.length || spro.sliceSupportEnable) { // create shadow. TODO test if any supports set let alltops = slices.map(slice => slice.topPolys()).flat(); @@ -284,7 +285,7 @@ doSupportFill(slice, lineWidth, spro.sliceSupportDensity, minArea); }, "support"); } else if (true) { - doSupportBelt(slices, spro, fixed, shadow, doupdate); + // doSupportBelt(slices, spro, fixed, shadow, doupdate); } // render if not explicitly disabled From 5407bd19272ca178c7621a32d6c61bf4ad74a7ad Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 24 Jan 2021 00:17:28 -0500 Subject: [PATCH 014/255] fix widget rendering their own stack --- src/kiri/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kiri/main.js b/src/kiri/main.js index 6e023939..b5cb7eac 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -892,7 +892,7 @@ KIRI.client.unrotate(settings, () => { forAllWidgets(widget => { // on done - segtimes[`${segNumber}_draw`] = widget.render(stack); + segtimes[`${segNumber}_draw`] = widget.render(widget.stack); // rotate stack for belt beds if (widget.rotinfo) { widget.stack.obj.rotate(widget.rotinfo); From 1546b9d1ff5f14f2ba098eb5e45fea462fac19c9 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 24 Jan 2021 10:17:32 -0500 Subject: [PATCH 015/255] checkpoint support offset clipping --- notes.md | 2 + src/kiri/client.js | 1 - src/kiri/conf.js | 2 +- src/kiri/main.js | 2 +- src/kiri/slicer.js | 1 + src/mode/fdm/driver.js | 3 +- src/mode/fdm/slice.js | 215 ++++++++++++++++++----------------------- 7 files changed, 99 insertions(+), 127 deletions(-) diff --git a/notes.md b/notes.md index 47b304e4..9a1d4ba6 100644 --- a/notes.md +++ b/notes.md @@ -51,6 +51,8 @@ # FDM - BELT +* `B` when resize causes a part to move off-bed, move it back on +* `B` grouped widgets get placed off in space * `B` layer retract broken? * `B` infill / thin-fill is generating tons of small linear segments * `B` finish supports for belt printing. add progress. diff --git a/src/kiri/client.js b/src/kiri/client.js index c8ad3859..8d8068fa 100644 --- a/src/kiri/client.js +++ b/src/kiri/client.js @@ -168,7 +168,6 @@ KIRI.work = { slice: function(settings, widget, callback) { slicing[widget.id] = callback; - send("slice", { id: widget.id, settings: settings diff --git a/src/kiri/conf.js b/src/kiri/conf.js index b42cd45c..0bef439a 100644 --- a/src/kiri/conf.js +++ b/src/kiri/conf.js @@ -296,7 +296,7 @@ sliceSupportExtra: 0, sliceSupportAngle: 50, sliceSupportNozzle: 0, - // sliceSupportEnable: false, + sliceSupportEnable: false, sliceSolidMinArea: 1, sliceSolidLayers: 3, sliceBottomLayers: 3, diff --git a/src/kiri/main.js b/src/kiri/main.js index b5cb7eac..63c52294 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -892,7 +892,7 @@ KIRI.client.unrotate(settings, () => { forAllWidgets(widget => { // on done - segtimes[`${segNumber}_draw`] = widget.render(widget.stack); + segtimes[`${segNumber++}_draw`] = widget.render(widget.stack); // rotate stack for belt beds if (widget.rotinfo) { widget.stack.obj.rotate(widget.rotinfo); diff --git a/src/kiri/slicer.js b/src/kiri/slicer.js index f3013cc9..515bb1e9 100644 --- a/src/kiri/slicer.js +++ b/src/kiri/slicer.js @@ -221,6 +221,7 @@ zM = Math.max(p1.z, p2.z, p3.z), bm = Math.floor(zm * zScale), bM = Math.ceil(zM * zScale); + if (bm < 0) bm = 0; for (j = bm; j < bM; j++) { buckets[j].push(p1); buckets[j].push(p2); diff --git a/src/mode/fdm/driver.js b/src/mode/fdm/driver.js index f06e8e89..04f6d7ed 100644 --- a/src/mode/fdm/driver.js +++ b/src/mode/fdm/driver.js @@ -39,6 +39,7 @@ if (KIRI.client) // FDM.support_generate = KIRI.client.fdm_support_generate = function(ondone) { FDM.support_generate = function(ondone) { + KIRI.client.clear(); KIRI.client.sync(); let settings = API.conf.get(); let widgets = API.widgets.map(); @@ -51,7 +52,7 @@ if (KIRI.worker) KIRI.worker.fdm_support_generate = function(data, send) { const { settings } = data; - const widgets = Object.values(cache); + const widgets = Object.values(wcache); const fresh = widgets.filter(widget => FDM.supports(settings, widget)); send.done(KIRI.codec.encode(fresh.map(widget => { return { id: widget.id, diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index dbc1d9df..9ceb1c67 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -61,11 +61,13 @@ spro = settings.process, sdev = settings.device, isBelt = sdev.bedBelt, + isSynth = widget.track.synth, update_start = Date.now(), minSolid = spro.sliceSolidMinArea, solidLayers = spro.sliceSolidLayers, - vaseMode = spro.sliceFillType === 'vase', - doSolidLayers = solidLayers && !vaseMode, + vaseMode = spro.sliceFillType === 'vase' && !isSynth, + doSolidLayers = solidLayers && !vaseMode && !isSynth, + doSparseFill = !vaseMode && spro.sliceFillSparse > 0.0, metadata = settings.widget[widget.id] || {}, extruder = metadata.extruder || 0, sliceHeight = spro.sliceHeight, @@ -78,6 +80,7 @@ fillSpacing = lineWidth, fillOffset = lineWidth * fillOffsetMult, sliceFillAngle = spro.sliceFillAngle, + supportDensity = spro.sliceSupportDensity, view = widget.mesh && widget.mesh.newGroup ? widget.mesh.newGroup() : null; isFlat = settings.controller.lineType === "flat"; @@ -156,9 +159,9 @@ } function onSliceDone(slices) { - // slices = slices.filter(slice => slice.tops.length); // remove all empty slices above part but leave below // for multi-part (multi-extruder) setups where the void is ok + // also reverse because slicing occurs bottom-up let found = false; slices = slices.reverse().filter(slice => { if (slice.tops.length) { @@ -174,6 +177,41 @@ return; } + // for synth support widgets, merge tops + if (isSynth) { + for (let slice of slices) { + // union top support polys + let tops = slice.topPolys(); + let union = POLY.union(tops, null, true); + if (union.length < tops.length) { + slice.tops = []; + for (let u of union) { + slice.addTop(u); + } + } + // clip tops to other widgets in group + tops = slice.topPolys(); + for (let peer of widget.group) { + if (peer === widget) { + continue; + } + for (let pslice of peer.slices) { + if (Math.abs(pslice.z - slice.z) > sliceHeight * 2) { + continue; + } + let ptops = pslice.topPolys(); + let ntops = []; + POLY.subtract(tops, ptops, ntops, null, slice.z, 0); + tops = ntops; + } + } + slice.tops = []; + for (let t of tops) { + slice.addTop(t); + } + } + } + // calculate % complete and call onupdate() function doupdate(index, from, to, msg) { onupdate(0.5 + (from + ((index/slices.length) * (to-from))) * 0.5, msg); @@ -198,12 +236,9 @@ slice.solids = []; }); - // fixed supports (generated ahead of time) - let wannot = settings.widget[widget.id] || {}, - fixed = Object.values(wannot.support || {}), - shadow = null; - if (fixed.length || spro.sliceSupportEnable) { - // create shadow. TODO test if any supports set + // create shadow for clipping supports + let shadow = null; + if (true || spro.sliceSupportEnable) { let alltops = slices.map(slice => slice.topPolys()).flat(); shadow = POLY.union(alltops,null,0.1); if (spro.sliceSupportExtra) { @@ -221,13 +256,14 @@ slice.index < spro.sliceBottomLayers || slice.index > slices.length - spro.sliceTopLayers-1 || spro.sliceFillSparse > 0.95 - ) && !vaseMode; + ) && !vaseMode && !isSynth; let spaceMult = first ? spro.firstLayerLineMult || 1 : 1; let offset = shellOffset * spaceMult; let fillOff = fillOffset * spaceMult; - doShells(slice, spro.sliceShells, offset, fillOff, { + let count = isSynth ? 1 : spro.sliceShells; + doShells(slice, count, offset, fillOff, { vase: vaseMode, - thin: spro.detectThinWalls, + thin: spro.detectThinWalls && !isSynth, belt0: isBelt && first, widget: widget }); @@ -257,7 +293,7 @@ } // sparse layers only present when non-vase mose and sparse % > 0 - if (!vaseMode && spro.sliceFillSparse > 0.0) { + if (doSparseFill && !isSynth) { forSlices(0.5, 0.7, slice => { doSparseLayerFill(slice, { settings: settings, @@ -271,27 +307,31 @@ type: spro.sliceFillType }); }, "infill"); + } else if (isSynth && supportDensity) { + forSlices(0.5, 0.7, slice => { + for (let top of slice.tops) { + let offset = []; + POLY.expand(top.shells, -nozzleSize/4, slice.z, offset); + fillSupportPolys(offset, lineWidth, supportDensity, slice.z); + top.fill_lines = offset.map(o => o.fill).flat().filter(v => v); + } + }, "infill"); } // belt supports are their own thing - if (!isBelt) { - let auto = spro.sliceSupportEnable && spro.sliceSupportDensity > 0.0, - minArea = spro.sliceSupportArea; - + if (!isBelt && !isSynth && supportDensity && spro.sliceSupportEnable) { forSlices(0.7, 0.8, slice => { - doSupport(slice, spro, auto, fixed, shadow); + doSupport(slice, spro, shadow); }, "support"); forSlices(0.8, 0.9, slice => { - doSupportFill(slice, lineWidth, spro.sliceSupportDensity, minArea); + doSupportFill(slice, lineWidth, supportDensity, spro.sliceSupportArea); }, "support"); - } else if (true) { - // doSupportBelt(slices, spro, fixed, shadow, doupdate); } // render if not explicitly disabled if (render) { forSlices(0.9, 1.0, slice => { - doRender(slice); + doRender(slice, isSynth); }, "render"); } @@ -314,7 +354,7 @@ return Math.max(min,Math.min(max,v)); } - function doRender(slice) { + function doRender(slice, isSynth) { const output = slice.output(); const height = slice.height / 2; @@ -326,7 +366,7 @@ } output - .setLayer("shells", COLOR.shell) + .setLayer("shells", isSynth ? COLOR.support : COLOR.shell) .addPolys(top.shells, vopt({ offset, height })); // if (isThin && debug) { @@ -337,8 +377,8 @@ // .addPolys(top.last); // } - if (top.fill_lines) output - .setLayer("fill", COLOR.fill) + if (top.fill_lines && top.fill_lines.length) output + .setLayer("fill", isSynth ? COLOR.support : COLOR.fill) .addLines(top.fill_lines, vopt({ offset, height })); if (top.fill_sparse) output @@ -868,82 +908,10 @@ return true; }; - function doSupportBelt(slices, proc, fixed, shadow, doupdate) { - if (!fixed || fixed.length === 0) { - return; - } - - let minArea = proc.supportMinArea, - offset = proc.sliceSupportOffset, - min = minArea || 0.01; - - // find slice closest to z - function findSlice(z) { - let mind = Infinity, - mins = null; - for (let slice of slices) { - let d = Math.abs(slice.z - z); - if (d < mind) { - mind = d; - mins = slice; - } - } - return mins; - } - - // add support pillar to a slice - function addPillar(slice, sup) { - // ensure slice has offsets - if (!slice.offsets) { - // create inner clip offset from tops - POLY.expand(slice.topPolys(), offset, slice.z, slice.offsets = []); - } - // ensure slice has supports array - if (!slice.supports) { - slice.supports = []; - } - // calculate support rect - let dz = sup.z - slice.z; - let dy = dz; - let dw = bwcomp; - let center = BASE.newPoint(sup.x, sup.y + dy, slice.z); - let poly = [ BASE.newPolygon().centerRectangle(center, sup.dw, sup.dw * dw) ]; - let trim = []; - // poly = POLY.trimTo(poly, shadow); - POLY.subtract(poly, slice.offsets, trim, null, slice.z, min); - // if support is entirely culled, terminate projection - if (trim.length === 0) { - return false; - } - slice.supports.appendAll(trim); - return true; - } - - for (let sup of fixed) { - let slice = findSlice(sup.z); - let rem = addPillar(slice, sup); - let zmin = sup.z - (sup.dh * 0.75) / 2; - let zmax = sup.z + (sup.dh * 0.75) / 2; - while (slice.up && slice.up.z <= zmax) { - slice = slice.up; - if (!addPillar(slice, sup)) { - break; - } - } - while (slice.down && slice.down.z >= zmin) { - slice = slice.down; - if (!addPillar(slice, sup)) { - break; - } - } - } - } - /** - * calculate external overhangs requiring support. - * this is done bottom-up except for fixed supports (manual) + * calculate external overhangs requiring support */ - function doSupport(slice, proc, auto, fixed, shadow) { + function doSupport(slice, proc, shadow) { let minOffset = proc.sliceSupportOffset, maxBridge = proc.sliceSupportSpan || 5, minArea = proc.supportMinArea, @@ -1002,7 +970,7 @@ let supports = []; // generate support polys from unsupported points - if (auto && slice.down) (function() { + if (slice.down) (function() { // check trace line support needs traces.forEach(function(trace) { trace.forEachSegment(function(p1, p2) { checkLineSupport(p1, p2, true) }); @@ -1027,22 +995,10 @@ }); })(); - if (supports.length === 0 && !(fixed && fixed.length)) { + if (supports.length === 0) { return; } - if (fixed && fixed.length) { - for (let sup of fixed) { - let zmin = sup.z - sup.dh / 2; - let zmax = sup.z + sup.dh / 2; - if (slice.z >= zmin && slice.z <= zmax) { - let dz = sup.z - slice.z; - let center = BASE.newPoint(sup.x, sup.y, slice.z); - supports.push(BASE.newPolygon().centerRectangle(center, sup.dw, sup.dw)); - } - } - } - // then union supports supports = POLY.union(supports, null, true); @@ -1107,23 +1063,29 @@ supports = nsC; } - if (supports) supports.forEach(function (poly) { + if (supports) { + fillSupportPolys(supports, linewidth, density, slice.z); + } + + // re-assign new supports back to slice + slice.supports = supports; + }; + + function fillSupportPolys(polys, linewidth, density, z) { + // calculate fill density + let spacing = linewidth * (1 / density); + polys.forEach(function (poly) { // angle based on width/height ratio let angle = (poly.bounds.width() / poly.bounds.height() > 1) ? 90 : 0; - // calculate fill density - let spacing = linewidth * (1 / density); // inset support poly for fill lines 33% of nozzle width - let inset = POLY.offset([poly], -linewidth/3, {flat: true, z: slice.z}); + let inset = POLY.offset([poly], -linewidth/3, {flat: true, z}); // do the fill if (inset && inset.length > 0) { fillArea(inset, angle, spacing, poly.fill = []); } return true; }); - - // re-assign new supports back to slice - slice.supports = supports; - }; + } /** * @@ -1204,7 +1166,7 @@ FDM.supports = function(settings, widget) { let process = settings.process; let size = process.sliceSupportSize; - let min = process.sliceSupportArea || 0.1; + let min = process.sliceSupportArea || 1; let buf = new THREE.BufferGeometry(); buf.setAttribute('position', new THREE.BufferAttribute(widget.vertices, 3)); let mat = new THREE.MeshBasicMaterial(); @@ -1243,6 +1205,13 @@ if (point.added) { return; } + for (let added of add) { + let p2 = new THREE.Vector2(point.x, point.y); + let pm = new THREE.Vector2(added.mid.x, added.mid.y); + if (p2.distanceTo(pm) < 1) { + return; + } + } let ray = new THREE.Raycaster(point, dir); let int = ray.intersectObjects([ mesh, platform ], false); if (int && int.length && int[0].distance > 0.01) { From 9f1a9747e4aa36062ac956bb30f75a241ecf996d Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 24 Jan 2021 10:33:10 -0500 Subject: [PATCH 016/255] fix support gap layers --- src/kiri/conf.js | 2 +- src/mode/fdm/slice.js | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/kiri/conf.js b/src/kiri/conf.js index 0bef439a..6c036833 100644 --- a/src/kiri/conf.js +++ b/src/kiri/conf.js @@ -290,7 +290,7 @@ sliceFillType: "hex", sliceSupportDensity: 0.25, sliceSupportOffset: 1.0, - sliceSupportGap: 0.75, + sliceSupportGap: 1, sliceSupportSize: 5, sliceSupportArea: 0.1, sliceSupportExtra: 0, diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index 9ceb1c67..75c03a62 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -189,6 +189,7 @@ slice.addTop(u); } } + let gap = sliceHeight * spro.sliceSupportGap // clip tops to other widgets in group tops = slice.topPolys(); for (let peer of widget.group) { @@ -196,9 +197,10 @@ continue; } for (let pslice of peer.slices) { - if (Math.abs(pslice.z - slice.z) > sliceHeight * 2) { + if (Math.abs(pslice.z - slice.z) > gap) { continue; } + // TODO: offset pslice tops by spro.sliceSupportOffset let ptops = pslice.topPolys(); let ntops = []; POLY.subtract(tops, ptops, ntops, null, slice.z, 0); From 5af2e5a509bd282f8111f2204c561167f12664fd Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 24 Jan 2021 10:45:40 -0500 Subject: [PATCH 017/255] fix support z (y) touching bed. fix slice support offset --- src/mode/fdm/client.js | 2 ++ src/mode/fdm/slice.js | 7 +++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/mode/fdm/client.js b/src/mode/fdm/client.js index c066f1e1..432399ca 100644 --- a/src/mode/fdm/client.js +++ b/src/mode/fdm/client.js @@ -202,6 +202,8 @@ return; } if (!iw) return; + p1.y = Math.max(0, p1.y); + p2.y = Math.max(0, p2.y); let hy = (p1.y + p2.y) / 2; let dh = Math.abs(p1.y - p2.y); let dw = api.conf.get().process.sliceSupportSize / 2; diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index 75c03a62..8036ecd1 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -200,8 +200,11 @@ if (Math.abs(pslice.z - slice.z) > gap) { continue; } - // TODO: offset pslice tops by spro.sliceSupportOffset - let ptops = pslice.topPolys(); + // offset pslice tops by spro.sliceSupportOffset + if (!pslice.synth_off) { + pslice.synth_off = POLY.offset(pslice.topPolys(), nozzleSize/2 + spro.sliceSupportOffset); + } + let ptops = pslice.synth_off; let ntops = []; POLY.subtract(tops, ptops, ntops, null, slice.z, 0); tops = ntops; From b130b4a97216c708076846ee8e46a1db6dc935d4 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 24 Jan 2021 11:58:45 -0500 Subject: [PATCH 018/255] restore focus on page reload. fix center vs focus disparity. enable support gap in belt mode --- src/kiri/init.js | 4 +++- src/kiri/main.js | 2 +- src/moto/ctrl.js | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/kiri/init.js b/src/kiri/init.js index dfcfe045..36c0a8ba 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -1660,7 +1660,7 @@ fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}), sliceSupportSize: UC.newInput(LANG.sp_size_s, {title:LANG.sp_size_l, bound:UC.bound(1.0,200.0), convert:UC.toFloat, modes:FDM}), sliceSupportOffset: UC.newInput(LANG.sp_offs_s, {title:LANG.sp_offs_l, bound:UC.bound(0.0,200.0), convert:UC.toFloat, modes:FDM}), - sliceSupportGap: UC.newInput(LANG.sp_gaps_s, {title:LANG.sp_gaps_l, bound:UC.bound(0,5), convert:UC.toInt, modes:FDM, show:isNotBelt}), + sliceSupportGap: UC.newInput(LANG.sp_gaps_s, {title:LANG.sp_gaps_l, bound:UC.bound(0,5), convert:UC.toInt, modes:FDM}), fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}), sliceSupportArea: UC.newInput(LANG.sp_area_s, {title:LANG.sp_area_l, bound:UC.bound(0.0,200.0), convert:UC.toFloat, modes:FDM}), sliceSupportExtra: UC.newInput(LANG.sp_xpnd_s, {title:LANG.sp_xpnd_l, bound:UC.bound(0.0,200.0), convert:UC.toFloat, modes:FDM}), @@ -2182,6 +2182,8 @@ function init_two() { API.event.emit('init.two'); + API.space.set_focus(); + // call driver initializations, if present Object.values(KIRI.driver).forEach(driver => { if (driver.init) try { diff --git a/src/kiri/main.js b/src/kiri/main.js index 63c52294..8bc14cc7 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -390,7 +390,7 @@ pos.y /= widgets.length; pos.z /= widgets.length; } - SPACE.platform.setCenter(pos.x, -pos.y, pos.z); + SPACE.platform.setCenter(pos.x, -pos.y, topZ / 2); SPACE.view.setFocus(new THREE.Vector3(pos.x, topZ / 2, -pos.y)); } diff --git a/src/moto/ctrl.js b/src/moto/ctrl.js index 34d6f439..8115aa6c 100644 --- a/src/moto/ctrl.js +++ b/src/moto/ctrl.js @@ -187,7 +187,7 @@ MOTO.CTRL = function (object, domElement, notify, slider) { this.setTarget = function(t) { this.target = t; - this.target0 = this.target.clone(); + this.target0 = t.clone(); } function isValue(v) { From 1a284a622ade00106d38468a94829079374b817b Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 24 Jan 2021 13:16:39 -0500 Subject: [PATCH 019/255] update CR30 default profile --- src/dev/fdm/Creality.CR-30 | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/src/dev/fdm/Creality.CR-30 b/src/dev/fdm/Creality.CR-30 index 941d8a23..6b2bbae3 100644 --- a/src/dev/fdm/Creality.CR-30 +++ b/src/dev/fdm/Creality.CR-30 @@ -15,8 +15,7 @@ "G1 X200 E50 F800 ; extruder purge line", "G1 Z0.3 ; shift belt away 0.3mm", "G1 X0 E100 ; extruder purge line", - "G1 Z2 E98 ; shift belt away 2mm, retract extruder", - "G92 Z0 E-2 ; reset bed + extruder position", + "G92 Z0 E0 ; reset bed + extruder position", "M117 CR-30 Printing..." ], "post":[ @@ -68,20 +67,22 @@ "sliceFillOverlap": 0.3, "sliceFillSparse": 0.2, "sliceFillType": "hex", + "sliceAdaptive": false, + "sliceMinHeight": 0, "sliceSupportDensity": 0.25, - "sliceSupportOffset": 1.0, - "sliceSupportGap": 0.75, - "sliceSupportSize": 5, - "sliceSupportArea": 0.1, + "sliceSupportOffset": 0.4, + "sliceSupportGap": 1, + "sliceSupportSize": 6, + "sliceSupportArea": 1, "sliceSupportExtra": 0, "sliceSupportAngle": 50, "sliceSupportNozzle": 0, - "sliceSolidMinArea": 1, + "sliceSolidMinArea": 10, "sliceSolidLayers": 3, "sliceBottomLayers": 3, "sliceTopLayers": 3, - "firstLayerRate": 15, - "firstLayerPrintMult": 1.1, + "firstLayerRate": 10, + "firstLayerPrintMult": 1.15, "firstLayerYOffset": 0, "firstLayerBrim": 0, "outputTemp": 210, @@ -93,18 +94,16 @@ "outputShellMult": 1.25, "outputFillMult": 1.25, "outputSparseMult": 1.25, - "outputFanLayer": 1, - "outputRetractDist": 3, - "outputRetractSpeed": 40, + "outputFanLayer": 0, + "outputRetractDist": 4, + "outputRetractSpeed": 30, "outputRetractDwell": 30, "outputShortPoly": 100.0, "outputMinSpeed": 10.0, - "outputCoastDist": 0, + "outputCoastDist": 0.1, "outputWipeDistance": 0, - "outputLayerRetract": false, + "outputLayerRetract": true, "detectThinWalls": true, - "sliceMinHeight": 0, - "sliceAdaptive": false, "zHopDistance": 0, "antiBacklash": 0 }] From a82c62b73af2f1beaed5c7b01b9a75c43abf59e3 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 24 Jan 2021 18:35:19 -0500 Subject: [PATCH 020/255] fix double retractions --- src/mode/fdm/export.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/mode/fdm/export.js b/src/mode/fdm/export.js index 4ef4ea8d..772eb7a9 100644 --- a/src/mode/fdm/export.js +++ b/src/mode/fdm/export.js @@ -188,6 +188,11 @@ } function retract(zhop) { + if (retracted) { + // console.log({double_retract: zhop}); + return; + } + // console.log({retract:zhop}); retracted = retDist; moveTo({e:-retracted}, retSpeed, `e-retract ${retDist}`); if (zhop) moveTo({z:zpos + zhop}, seekMMM, "z-hop start"); @@ -383,6 +388,7 @@ // re-engage post-retraction before new extrusion if (out.emit && retracted) { + // console.log({engage:zhop}); // when enabled, resume previous Z if (zhop && pos.z != zpos) moveTo({z:zpos}, seekMMM, "z-hop end"); // re-engage retracted filament @@ -407,7 +413,7 @@ } // retract filament if point retract flag set - if (!retracted && out.retract) { + if (out.retract) { retract(zhop); } From 6ba89b1b8fd1a16bf02255ae47eae01eb96e2bc7 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 24 Jan 2021 20:38:45 -0500 Subject: [PATCH 021/255] bump rev 2.6.D11. rework rotation and bounds (again) --- package.json | 2 +- src/kiri.js | 2 +- src/kiri/init.js | 2 +- src/kiri/worker.js | 40 ++++++++++++++++------------------------ src/license.js | 2 +- src/mode/fdm/prepare.js | 14 ++++++++------ 6 files changed, 28 insertions(+), 34 deletions(-) diff --git a/package.json b/package.json index 7b0a6f72..dc9f1e62 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grid-apps", - "version": "2.6.10D", + "version": "2.6.11D", "description": "grid.space 3d slice & modeling tools", "author": "Stewart Allen ", "license": "MIT", diff --git a/src/kiri.js b/src/kiri.js index 28bef6f5..4110632e 100644 --- a/src/kiri.js +++ b/src/kiri.js @@ -6,7 +6,7 @@ if (!self.kiri) { self.kiri = { - beta: 2610, + beta: 2611, driver: {}, // driver modules loader: [] // module loading: array of functions }; diff --git a/src/kiri/init.js b/src/kiri/init.js index 36c0a8ba..7a246c8a 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -2182,7 +2182,7 @@ function init_two() { API.event.emit('init.two'); - API.space.set_focus(); + // API.space.set_focus(); // call driver initializations, if present Object.values(KIRI.driver).forEach(driver => { diff --git a/src/kiri/worker.js b/src/kiri/worker.js index f52922e7..3fcf597e 100644 --- a/src/kiri/worker.js +++ b/src/kiri/worker.js @@ -85,44 +85,36 @@ KIRI.worker = { return send.done({}); } - function mins(vert) { - let miny = Infinity, minz = Infinity; + function mins(vert, last = {}) { + let miny = last.miny || Infinity, + maxy = last.maxy || -Infinity; for (let i=0, l=vert.length; i - All Rights Reserved", LICENSE: "See the license.md file included with the source distribution", - VERSION: "2.6.D10" + VERSION: "2.6.D11" }; if (typeof(module) === 'object') { diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index eb2b6ab6..2df8ac20 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -291,12 +291,14 @@ for (let widget of widgets) { let { rotinfo, belt } = widget; let offset = Object.clone(widget.track.pos); - // let offset = widget.mesh ? Object.clone(widget.mesh.position) : {x:0, y:0, z:0}; if (isBelt) { - offset.x = rotinfo.xpos; - offset.y = -belt.midy; - offset.y += rotinfo.ypos * beltfact; - offset.z = rotinfo.ypos * beltfact; + let o = rotinfo.ypos * beltfact; + offset = { + x: rotinfo.xpos, + y: o - belt.midy,// - belt.miny, + z: o, + }; + // offset = { x:0, y:0, z:0 }; // locate the lowest point in slices and widget overall let minby = Infinity; for (let slice of widget.slices) { @@ -412,7 +414,7 @@ // if a declared extruder isn't used in a layer, use selected // extruder to fill the relevant purge blocks for later support track.forEach(ext => { - if (ext) { + if (ext && lastOut) { printPoint = purge(ext.extruder, track, layerout, printPoint, lastOut.z, lastExt); } }); From 27f1f6c44423abd5f057057262ad752234821aff Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 24 Jan 2021 20:50:10 -0500 Subject: [PATCH 022/255] fix grouped widget arrangement in belt mode --- notes.md | 4 ++-- src/kiri/main.js | 7 ++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/notes.md b/notes.md index 9a1d4ba6..f342ca0a 100644 --- a/notes.md +++ b/notes.md @@ -17,9 +17,9 @@ # FDM -* `B` large # linear points with linear infill (belt only?) +* `B` client/worker cache invalidated by latest rotation work * `B` fix adaptive slicing with multi-extruder -* `B` fix supports with grouped parts +* `B` fix support projection/end with grouped parts * `B` multi-extruder rendering of raft fails to offset the rest of the print * `B` multi-extruder purge blocks fail to generate properly for rafts diff --git a/src/kiri/main.js b/src/kiri/main.js index 8bc14cc7..26fd3870 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -1751,7 +1751,12 @@ if (isBelt) { let bounds = platformUpdateBounds(), movey = -(dev.bedDepth / 2 + bounds.min.y); - forAllWidgets(widget => widget.move(0, movey + 5, 0)); + forAllWidgets(widget => { + // only move the master widget in the group + if (widget.id === widget.group.id) { + widget.move(0, movey + 5, 0) + } + }); } platform.update_origin(); From ef6bc20292864eb77d38e02ae146c0214377e629 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 24 Jan 2021 21:03:54 -0500 Subject: [PATCH 023/255] keep widget in bounds when rotated or scaled --- src/kiri/main.js | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/kiri/main.js b/src/kiri/main.js index 26fd3870..2a1e4692 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -1191,9 +1191,33 @@ function updateSelectedBounds() { // update bounds on selection for drag limiting + let dvy = settings.device.bedDepth; + let dvx = settings.device.bedWidth; let bounds_sel = new THREE.Box3(); forSelectedWidgets(function(widget) { let wp = widget.track.pos; + let bx = widget.track.box; + let miny = wp.y - bx.h/2 + dvy/2; + let maxy = wp.y + bx.h/2 + dvy/2; + let minx = wp.x - bx.w/2 + dvx/2; + let maxx = wp.x + bx.w/2 + dvx/2; + + // keep widget in bounds when rotated or scaled + let ylo = miny < 0; + let yhi = maxy > dvy + if (ylo && !yhi) { + widget.move(0, -miny, 0); + } else if (yhi && !ylo) { + widget.move(0, dvy - maxy, 0); + } + let xlo = minx < 0; + let xhi = maxx > dvx; + if (xlo && !xhi) { + widget.move(-minx, 0, 0); + } else if (xhi && !xlo) { + widget.move(dvx - maxx, 0, 0); + } + let wb = widget.mesh.getBoundingBox().clone(); wb.min.x += wp.x; wb.max.x += wp.x; From 5765c2c6a28c4ded556339e81f6959c27b25d8db Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 25 Jan 2021 00:48:19 -0500 Subject: [PATCH 024/255] another sometimes-works case for multiple widgets --- notes.md | 9 +++------ src/kiri/worker.js | 11 ++++++++--- src/mode/fdm/prepare.js | 2 +- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/notes.md b/notes.md index f342ca0a..d34578c8 100644 --- a/notes.md +++ b/notes.md @@ -2,6 +2,7 @@ ## `C` cosmetic, `F` functional, `P` performance, `B` bug fix +* `B` client/worker cache invalidated by latest rotation work * `B` saved profile should be restored / defaulted when switching devices? * `B` normals possibly inverted on faces in 2D to 3D conversion * `B` normalize left, bottom, right pop menu time/click and value persistence @@ -11,13 +12,12 @@ * `P` allow selection to me decimated on demand (context menu?) * `P` improve decimation speed: omit point conversion or use wasm * `P` client/worker interface normalization -* `P` explore widget vertex reloading / replacing +* `P` explore widget vertex reloading / replacing (Onshape primarily) * `F` SVG import to 3D part like images # FDM -* `B` client/worker cache invalidated by latest rotation work * `B` fix adaptive slicing with multi-extruder * `B` fix support projection/end with grouped parts * `B` multi-extruder rendering of raft fails to offset the rest of the print @@ -51,10 +51,7 @@ # FDM - BELT -* `B` when resize causes a part to move off-bed, move it back on -* `B` grouped widgets get placed off in space -* `B` layer retract broken? -* `B` infill / thin-fill is generating tons of small linear segments +* `B` multiple parts with one angled against origin "floats" in preview * `B` finish supports for belt printing. add progress. # CAM diff --git a/src/kiri/worker.js b/src/kiri/worker.js index 3fcf597e..89a8ce49 100644 --- a/src/kiri/worker.js +++ b/src/kiri/worker.js @@ -100,12 +100,16 @@ KIRI.worker = { return { miny, maxy }; } - for (let group of Object.values(wgroup)) { + function gmin(group) { let minv = {}; for (let w of group) { minv = mins(w.vertices, minv); } - let { miny, maxy } = minv; + return minv; + } + + for (let group of Object.values(wgroup)) { + let { miny, maxy } = gmin(group); let widget = group[0]; let track = widget.track; @@ -113,8 +117,9 @@ KIRI.worker = { let ypos = settings.device.bedDepth / 2 + track.pos.y + miny; let rotation = (Math.PI / 180) * 45; - widget.belt = { xpos, ypos }; widget.rotate(rotation,0,0,true); + let minr = gmin(group); + widget.belt = { xpos, ypos, yadd: minr.maxy - minr.miny }; for (let others of group.slice(1)) { others.belt = widget.belt; } diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index 2df8ac20..5cb7f2de 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -295,7 +295,7 @@ let o = rotinfo.ypos * beltfact; offset = { x: rotinfo.xpos, - y: o - belt.midy,// - belt.miny, + y: o - belt.midy - belt.yadd/2, z: o, }; // offset = { x:0, y:0, z:0 }; From 876f6c9d442e058f09efa04d0412388495a076d9 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 25 Jan 2021 08:49:42 -0500 Subject: [PATCH 025/255] add optional seprate infill speed. fix 'a' arrange behavior --- notes.md | 2 ++ src/kiri/conf.js | 1 + src/kiri/init.js | 14 +++++++++++--- src/kiri/print.js | 3 ++- web/kiri/lang/en.js | 2 ++ 5 files changed, 18 insertions(+), 4 deletions(-) diff --git a/notes.md b/notes.md index d34578c8..3356d276 100644 --- a/notes.md +++ b/notes.md @@ -15,6 +15,7 @@ * `P` explore widget vertex reloading / replacing (Onshape primarily) * `F` SVG import to 3D part like images +* `F` bundle current profile into exported device # FDM @@ -23,6 +24,7 @@ * `B` multi-extruder rendering of raft fails to offset the rest of the print * `B` multi-extruder purge blocks fail to generate properly for rafts +* `F` test outlining solid projected areas * `F` slicing controls per user-defined z-region * `F` control for size of purge block (with 0=disabled) * `F` add separate fill speed control diff --git a/src/kiri/conf.js b/src/kiri/conf.js index 6c036833..23cd2423 100644 --- a/src/kiri/conf.js +++ b/src/kiri/conf.js @@ -287,6 +287,7 @@ sliceFillAngle: 45, sliceFillOverlap: 0.3, sliceFillSparse: 0.5, + sliceFillRate: 0, sliceFillType: "hex", sliceSupportDensity: 0.25, sliceSupportOffset: 1.0, diff --git a/src/kiri/init.js b/src/kiri/init.js index 7a246c8a..3b6c45a6 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -459,9 +459,15 @@ renderMode++; API.function.slice(); break; - case cca('a'): // auto arrange items on platform - platform.layout(); - API.space.set_focus(API.selection.widgets()); + case cca('a'): + if (API.view.get() === VIEWS.ARRANGE) { + // auto arrange items on platform + platform.layout(); + API.space.set_focus(API.selection.widgets()); + } else { + // go to arrange view + API.view.set(VIEWS.ARRANGE); + } break; default: API.event.emit('keypress', evt); @@ -1653,6 +1659,8 @@ sliceFillSparse: UC.newInput(LANG.fi_pcnt_s, {title:LANG.fi_pcnt_l, convert:UC.toFloat, bound:UC.bound(0.0,1.0), modes:FDM}), sliceFillAngle: UC.newInput(LANG.fi_angl_s, {title:LANG.fi_angl_l, convert:UC.toFloat, modes:FDM}), sliceFillOverlap: UC.newInput(LANG.fi_over_s, {title:LANG.fi_over_l, convert:UC.toFloat, bound:UC.bound(0.0,2.0), modes:FDM}), + fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}), + sliceFillRate: UC.newInput(LANG.ou_feed_s, {title:LANG.fi_rate_l, convert:UC.toInt, bound:UC.bound(0,300), modes:FDM}), fdmSupport: UC.newGroup(LANG.sp_menu, null, {modes:FDM, marker:false}), sliceSupportNozzle: UC.newSelect(LANG.sp_nozl_s, {title:LANG.sp_nozl_l, modes:FDM}, "extruders"), diff --git a/src/kiri/print.js b/src/kiri/print.js index 86a12c12..2543eba6 100644 --- a/src/kiri/print.js +++ b/src/kiri/print.js @@ -442,6 +442,7 @@ firstPrintMult = process.firstLayerPrintMult, printSpeed = opt.speed || (firstLayer ? firstShellSpeed : process.outputFeedrate), fillSpeed = opt.speed || opt.fillSpeed || (firstLayer ? firstFillSpeed || firstShellSpeed : process.outputFeedrate), + infillSpeed = process.sliceFillRate || opt.infillSpeed || fillSpeed || printSpeed, moveSpeed = process.outputSeekrate, origin = startPoint.add(offset), zhop = process.zHopDistance || 0, @@ -779,7 +780,7 @@ // then output solid and sparse fill outputFills(next.fill_lines); - outputSparse(next.fill_sparse, sparseMult); + outputSparse(next.fill_sparse, sparseMult, infillSpeed); lastTop = next; } diff --git a/web/kiri/lang/en.js b/web/kiri/lang/en.js index 82547eb2..d080f085 100644 --- a/web/kiri/lang/en.js +++ b/web/kiri/lang/en.js @@ -200,6 +200,8 @@ kiri.lang['en-us'] = { fi_angl_l: "base angle in degrees", fi_over_s: "overlap", fi_over_l: "overlap with shell and fill\nas % of nozzle width\nhigher bonds better\n0.0 - 1.0", + // fi_rate_s: "print speed", + fi_rate_l: "extrusion speed for infill\nset to 0 to use default\noutput print speeds", // FDM FIRST LAYER fl_menu: "base", From 69eca2a0313762b054f4486796831bb35c8409b0 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 25 Jan 2021 12:38:40 -0500 Subject: [PATCH 026/255] fix z layer output height (manifested as first layer half height) --- src/mode/fdm/export.js | 2 +- src/mode/fdm/prepare.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mode/fdm/export.js b/src/mode/fdm/export.js index 772eb7a9..6ee04fe1 100644 --- a/src/mode/fdm/export.js +++ b/src/mode/fdm/export.js @@ -314,7 +314,7 @@ if (gcodeLayer && gcodeLayer.length) { appendAllSub(gcodeLayer); } else { - append(`;; --- layer ${layer} (${subst.height} @ ${subst.z}) ---`); + append(`;; --- layer ${layer} (${subst.height} @ ${subst.z.round(3)}) ---`); } if (layer > 0 && process.outputLayerRetract) { diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index 5cb7f2de..f0d1f2ea 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -385,7 +385,7 @@ if (layerout.length && minidx !== lastIndex) { layerout.last().retract = true; } - layerout.z = z; + layerout.z = z + slice.height / 2; layerout.height = layerout.height || slice.height; // detect extruder change and print purge block if (!lastOut || lastOut.extruder !== slice.extruder) { @@ -690,7 +690,7 @@ .addPolys(moves, { thin: true, z: opts.z }); // force level when present if (level.z) { - opts.z = level.z; + opts.z = level.z - height; } Object.values(prints).forEach(array => { array.forEach(poly => { From fa5a2643905f21a1cbaaacd9e833007e18bb1b62 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 25 Jan 2021 17:05:48 -0500 Subject: [PATCH 027/255] move fill.js to fdm driver --- app.js | 4 ++-- src/kiri/export.js | 2 ++ src/kiri/main.js | 2 ++ src/{kiri => mode/fdm}/fill.js | 2 ++ 4 files changed, 8 insertions(+), 2 deletions(-) rename src/{kiri => mode/fdm}/fill.js (99%) diff --git a/app.js b/app.js index e746a517..c2f7f2c9 100644 --- a/app.js +++ b/app.js @@ -267,11 +267,11 @@ const script = { "kiri/ui", "kiri/lang", "kiri/lang-en", - "kiri/fill", "kiri/db", "kiri/slice", "kiri/layers", "kiri/client", + "mode/fdm/fill", "mode/fdm/driver", "mode/fdm/client", "mode/sla/driver", @@ -315,11 +315,11 @@ const script = { "geo/polygons", "geo/gyroid", "moto/pack", - "kiri/fill", "kiri/slice", "kiri/slicer", "kiri/slicer2", "kiri/layers", + "mode/fdm/fill", "mode/fdm/driver", "mode/fdm/slice", "mode/fdm/prepare", diff --git a/src/kiri/export.js b/src/kiri/export.js index 86a57025..5b66d9e8 100644 --- a/src/kiri/export.js +++ b/src/kiri/export.js @@ -31,10 +31,12 @@ } function callExport(callback, mode) { + let alert = API.show.alert("Exporting"); const gcode = []; KIRI.client.export(API.conf.get(), (line) => { gcode.push(line); }, (output) => { + API.hide.alert(alert); if (callback) { callback(gcode.join('\r\n'), output); } else { diff --git a/src/kiri/main.js b/src/kiri/main.js index 2a1e4692..3b54b457 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -965,6 +965,7 @@ hideSlider(true); + let alert = API.show.alert("Preparing Preview"); let isCam = MODE === MODES.CAM, pMode = getMode(); if (feature.preview) { @@ -1007,6 +1008,7 @@ segtimes[`${segNumber++}_${lastMsg}`] = Date.now() - startTime; } + API.hide.alert(alert); API.show.progress(0); if (!isCam) setOpacity(0); diff --git a/src/kiri/fill.js b/src/mode/fdm/fill.js similarity index 99% rename from src/kiri/fill.js rename to src/mode/fdm/fill.js index daf825d4..9a1245eb 100644 --- a/src/kiri/fill.js +++ b/src/mode/fdm/fill.js @@ -159,6 +159,8 @@ let span_y = bounds.max.y - bounds.min.y; let density = target.density(); let offset = target.offset() / 2; + let line = target.lineWidth(); + let mf = Math.max(span_x, span_y) / line; let tile = 1 + (1 - density); let tile_xc = Math.ceil(span_x / tile); let tile_yc = Math.ceil(span_y / tile); From bd7e6b220ce6ee5560545b40c12784188dc12543 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 25 Jan 2021 17:54:28 -0500 Subject: [PATCH 028/255] default CR30 to 60C bed --- src/dev/fdm/Creality.CR-30 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dev/fdm/Creality.CR-30 b/src/dev/fdm/Creality.CR-30 index 6b2bbae3..24b4de59 100644 --- a/src/dev/fdm/Creality.CR-30 +++ b/src/dev/fdm/Creality.CR-30 @@ -87,7 +87,7 @@ "firstLayerBrim": 0, "outputTemp": 210, "outputFanMax": 255, - "outputBedTemp": 70, + "outputBedTemp": 60, "outputFeedrate": 50, "outputFinishrate": 50, "outputSeekrate": 80, From 4b06370df88756a4907896b620ff4fa879f13172 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Tue, 26 Jan 2021 00:02:24 -0500 Subject: [PATCH 029/255] bump rev 2.6.D12 --- package.json | 2 +- src/kiri.js | 2 +- src/license.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index dc9f1e62..35ad7130 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grid-apps", - "version": "2.6.11D", + "version": "2.6.12D", "description": "grid.space 3d slice & modeling tools", "author": "Stewart Allen ", "license": "MIT", diff --git a/src/kiri.js b/src/kiri.js index 4110632e..a2be33c4 100644 --- a/src/kiri.js +++ b/src/kiri.js @@ -6,7 +6,7 @@ if (!self.kiri) { self.kiri = { - beta: 2611, + beta: 2612, driver: {}, // driver modules loader: [] // module loading: array of functions }; diff --git a/src/license.js b/src/license.js index 5f388c81..57e07157 100644 --- a/src/license.js +++ b/src/license.js @@ -3,7 +3,7 @@ let terms = { COPYRIGHT: "Copyright (C) Stewart Allen - All Rights Reserved", LICENSE: "See the license.md file included with the source distribution", - VERSION: "2.6.D11" + VERSION: "2.6.D12" }; if (typeof(module) === 'object') { From 0071d69ec19ffc7864d200303d6f74336770ad20 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Tue, 26 Jan 2021 09:03:02 -0500 Subject: [PATCH 030/255] add module version overrides --- app.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/app.js b/app.js index c2f7f2c9..9fb6ef11 100644 --- a/app.js +++ b/app.js @@ -25,6 +25,7 @@ let level; let setupFn; let cacheDir; let startTime; +let oversion; let lastmod; let logger; let debug; @@ -144,7 +145,8 @@ function initModule(mod, file, dir) { require_fresh(file)({ api: api, adm: { - reload: prepareScripts + reload: prepareScripts, + setver: (ver) => { oversion = ver } }, const: { args: {}, @@ -471,11 +473,12 @@ function handleSetup(req, res, next) { } function handleVersion(req, res, next) { - if (req.app.path === "/kiri/" && req.url.indexOf(version) < 0) { + let vstr = oversion || version; + if (req.app.path === "/kiri/" && req.url.indexOf(vstr) < 0) { if (req.url.indexOf("?") > 0) { - return http.redirect(res, `${req.url},ver:${version}`); + return http.redirect(res, `${req.url},ver:${vstr}`); } else { - return http.redirect(res, `${req.url}?ver:${version}`); + return http.redirect(res, `${req.url}?ver:${vstr}`); } } else { next(); From 13b0538c2814b945817f9887500b995682a2146b Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Tue, 26 Jan 2021 13:56:14 -0500 Subject: [PATCH 031/255] a couple of bug fixes for automatic supports --- src/mode/fdm/prepare.js | 5 +++-- src/mode/fdm/slice.js | 1 - 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index f0d1f2ea..cb7c7870 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -213,12 +213,13 @@ sslices.push(sslice); } if (sslices.length) { - let swidget = KIRI.newWidget(); + let swidget = KIRI.newWidget(null,widget.group); swidget.slices = sslices; swidget.support = true; swidget.rotinfo = widget.rotinfo; swidget.belt = widget.belt; - swidget.mesh = { widget: swidget, position: widget.mesh.position }; + swidget.track = Object.clone(widget.track); + swidget.mesh = { widget: swidget, position: swidget.track.pos }; settings.widget[swidget.id] = { extruder: process.sliceSupportNozzle }; widgets.push(swidget); } diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index 8036ecd1..9ae4988f 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -1231,7 +1231,6 @@ let c = geo.vertices[face.c]; // skip tiny faces if (BASE.newPolygon().addPoints([a,b,c]).area() < min) { - skip++; return; } tp(new THREE.Vector3().add(a).add(b).add(c).divideScalar(3)); From 61bff786eacc27ea60b155e99c687ba5455eb14e Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Tue, 26 Jan 2021 14:22:54 -0500 Subject: [PATCH 032/255] add missing height on synth support slices --- src/mode/fdm/prepare.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index cb7c7870..67753902 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -46,7 +46,6 @@ find, layerout = [], slices = [], - sliceEntry, print = self.worker.print = KIRI.newPrint(settings, widgets), beltYoff = device.bedDepth / 2, beltfact = Math.cos(Math.PI/4), @@ -210,6 +209,7 @@ let sslice = KIRI.newSlice(slice.z); sslice.extruder = process.sliceSupportNozzle; sslice.supports = slice.supports.slice(); + sslice.height = slice.height; sslices.push(sslice); } if (sslices.length) { From cbf003f2143e5ccb7ec45ef40937525ae962a6c6 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Tue, 26 Jan 2021 20:07:17 -0500 Subject: [PATCH 033/255] fix preview progress. scale slicing time to widget vertices. allow objects past platform max y in belt mode --- notes.md | 1 + src/kiri/export.js | 4 ++-- src/kiri/main.js | 24 ++++++++++++++++++------ src/kiri/widget.js | 4 ++++ src/mode/fdm/prepare.js | 10 ++++------ 5 files changed, 29 insertions(+), 14 deletions(-) diff --git a/notes.md b/notes.md index 3356d276..02d9056b 100644 --- a/notes.md +++ b/notes.md @@ -14,6 +14,7 @@ * `P` client/worker interface normalization * `P` explore widget vertex reloading / replacing (Onshape primarily) +* `F` expose grouping feature * `F` SVG import to 3D part like images * `F` bundle current profile into exported device diff --git a/src/kiri/export.js b/src/kiri/export.js index 5b66d9e8..c87a673f 100644 --- a/src/kiri/export.js +++ b/src/kiri/export.js @@ -491,8 +491,8 @@ $('admin-gridlocal').onclick = admin_gridlocal; } catch (e) { console.log(e) } - // preview of the generated GCODE - if (preview && gcode) $('code-preview-textarea').value = gcode; + // preview of the generated GCODE (first 64k max) + if (preview && gcode) $('code-preview-textarea').value = gcode.substring(0,65535); // show dialog API.modal.show('print'); diff --git a/src/kiri/main.js b/src/kiri/main.js index 3b54b457..c6d1a9a3 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -855,7 +855,15 @@ totalProgress, track = {}, mode = settings.mode, - now = Date.now(); + now = Date.now(), + totvert = 0, + defvert; + + // determing this widgets % of processing time estimated by vertex count + for (let widget of WIDGETS) { + totvert += widget.getVertices().count; + } + defvert = totvert / WIDGETS.length; setOpacity(color.slicing_opacity); @@ -872,7 +880,8 @@ startTime = Date.now(), lastMsg, camOrLaser = mode === 'CAM' || mode === 'LASER', - stack = widget.stack = STACKS.create(widget.id, widget.mesh); + stack = widget.stack = STACKS.create(widget.id, widget.mesh), + factor = (widget.getVertices().count / defvert); widget.stats.progress = 0; widget.setColor(color.slicing); @@ -889,6 +898,7 @@ } // on the last exit, update ui and call the callback if (--countdown === 0 || error || errored) { + let alert = scale === 1 ? API.show.alert("Rendering") : null; KIRI.client.unrotate(settings, () => { forAllWidgets(widget => { // on done @@ -902,6 +912,7 @@ widget.setWireframe(false, color.wireframe, color.wireframe_opacity); widget.setOpacity(camOrLaser ? color.cam_sliced_opacity : color.sliced_opacity); widget.setColor(color.deselected); + API.hide.alert(alert); } }); updateSliderMax(true); @@ -939,7 +950,7 @@ startTime = mark; } // on update - track[widget.id] = update; + track[widget.id] = (update || 0) * factor; totalProgress = 0; forAllWidgets(function(w) { totalProgress += (track[w.id] || 0); @@ -965,7 +976,6 @@ hideSlider(true); - let alert = API.show.alert("Preparing Preview"); let isCam = MODE === MODES.CAM, pMode = getMode(); if (feature.preview) { @@ -1008,11 +1018,11 @@ segtimes[`${segNumber++}_${lastMsg}`] = Date.now() - startTime; } - API.hide.alert(alert); API.show.progress(0); if (!isCam) setOpacity(0); if (feature.preview && output.length) { + let alert = API.show.alert("Rendering") startTime = Date.now(); STACKS.clear(); const stack = STACKS.create('print', SPACE.platform.world) @@ -1026,6 +1036,7 @@ ri.dy = settings.device.bedDepth / 2; stack.obj.rotate(WIDGETS[0].rotinfo); } + API.hide.alert(alert); segtimes[`${segNumber}_draw`] = Date.now() - startTime; } @@ -1193,6 +1204,7 @@ function updateSelectedBounds() { // update bounds on selection for drag limiting + let isBelt = settings.device.bedBelt; let dvy = settings.device.bedDepth; let dvx = settings.device.bedWidth; let bounds_sel = new THREE.Box3(); @@ -1206,7 +1218,7 @@ // keep widget in bounds when rotated or scaled let ylo = miny < 0; - let yhi = maxy > dvy + let yhi = !isBelt && maxy > dvy if (ylo && !yhi) { widget.move(0, -miny, 0); } else if (yhi && !ylo) { diff --git a/src/kiri/widget.js b/src/kiri/widget.js index 110cccb3..af00fe36 100644 --- a/src/kiri/widget.js +++ b/src/kiri/widget.js @@ -258,6 +258,10 @@ } }; + PRO.getVertices = function() { + return this.mesh.geometry.attributes.position; + }; + /** * @param {THREE.Geometry} geometry * @returns {Widget} diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index 67753902..0bfc34bf 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -35,8 +35,7 @@ firstLayerMult = process.firstLayerPrintMult, firstLayerBrim = process.firstLayerBrim, firstLayerBrimTrig = process.firstLayerBrimTrig, - maxLayers = 0, - layer = 0, + layerno = 0, zoff = 0, meshIndex, lastIndex, @@ -231,7 +230,6 @@ // find max layers (for updates) // generate list of used extruders for purge blocks for (let widget of widgets) { - maxLayers = Math.max(maxLayers, widget.slices.length); let extruder = (settings.widget[widget.id] || {}).extruder || 0; if (!extruders[extruder]) { extruders[extruder] = {}; @@ -426,13 +424,13 @@ } // retract after last layer - if (layer === maxLayers && layerout.length) { + if (layerno === cake.length - 1 && layerout.length) { layerout.last().retract = true; } // notify progress - layerout.layer = layer++; - update((layer / maxLayers) * 0.5, "prepare"); + layerout.layer = layerno++; + update((layerno / cake.length) * 0.5, "prepare"); slices = []; layerout = []; From fae3f267729dcb4ce35c1e58afb8054f498771e0 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Tue, 26 Jan 2021 20:07:50 -0500 Subject: [PATCH 034/255] bump rev 2.6.D13 --- package.json | 2 +- src/kiri.js | 2 +- src/license.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 35ad7130..401d8a25 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grid-apps", - "version": "2.6.12D", + "version": "2.6.13D", "description": "grid.space 3d slice & modeling tools", "author": "Stewart Allen ", "license": "MIT", diff --git a/src/kiri.js b/src/kiri.js index a2be33c4..0bc5e67e 100644 --- a/src/kiri.js +++ b/src/kiri.js @@ -6,7 +6,7 @@ if (!self.kiri) { self.kiri = { - beta: 2612, + beta: 2613, driver: {}, // driver modules loader: [] // module loading: array of functions }; diff --git a/src/license.js b/src/license.js index 57e07157..08d8db53 100644 --- a/src/license.js +++ b/src/license.js @@ -3,7 +3,7 @@ let terms = { COPYRIGHT: "Copyright (C) Stewart Allen - All Rights Reserved", LICENSE: "See the license.md file included with the source distribution", - VERSION: "2.6.D12" + VERSION: "2.6.D13" }; if (typeof(module) === 'object') { From 4632bfc057c45c6f9f777be868d1a88462cefe2f Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Tue, 26 Jan 2021 23:45:24 -0500 Subject: [PATCH 035/255] based on feedback, remove gcode header purge from wanhao --- notes.md | 4 ++++ src/dev/fdm/Wanhao.Duplicator_4s | 1 - src/dev/fdm/Wanhao.Duplicator_5s | 1 - src/dev/fdm/Wanhao.Duplicator_6 | 1 - src/dev/fdm/Wanhao.Duplicator_i3 | 1 - 5 files changed, 4 insertions(+), 4 deletions(-) diff --git a/notes.md b/notes.md index 02d9056b..4294bec1 100644 --- a/notes.md +++ b/notes.md @@ -123,3 +123,7 @@ * https://users.cs.jmu.edu/buchhofp/forensics/formats/pkzip.html * https://en.wikipedia.org/wiki/ZIP_(file_format) * https://stuk.github.io/jszip/ + +# Meta + +* free-space tetrahedron modeler with vertex mating diff --git a/src/dev/fdm/Wanhao.Duplicator_4s b/src/dev/fdm/Wanhao.Duplicator_4s index e5aca36d..2c9c6c59 100644 --- a/src/dev/fdm/Wanhao.Duplicator_4s +++ b/src/dev/fdm/Wanhao.Duplicator_4s @@ -11,7 +11,6 @@ "G1 Z0.25 F180 ; move z to 0.25mm over bed", "G92 E0 ; zero the extruded", "M109 S{temp} T{tool} ; wait for extruder to reach target temp", - "G1 E15 F200 ; purge 15mm from extruder", "G92 E0 ; zero the extruded", "G1 F225 ; set feed speed" ], diff --git a/src/dev/fdm/Wanhao.Duplicator_5s b/src/dev/fdm/Wanhao.Duplicator_5s index 280adb3b..67fa5433 100644 --- a/src/dev/fdm/Wanhao.Duplicator_5s +++ b/src/dev/fdm/Wanhao.Duplicator_5s @@ -11,7 +11,6 @@ "G1 Z0.25 F180 ; move z to 0.25mm over bed", "G92 E0 ; zero the extruded", "M109 S{temp} T{tool} ; wait for extruder to reach target temp", - "G1 E15 F200 ; purge 15mm from extruder", "G92 E0 ; zero the extruded", "G1 F225 ; set feed speed" ], diff --git a/src/dev/fdm/Wanhao.Duplicator_6 b/src/dev/fdm/Wanhao.Duplicator_6 index 54bf135d..7a73d2b5 100644 --- a/src/dev/fdm/Wanhao.Duplicator_6 +++ b/src/dev/fdm/Wanhao.Duplicator_6 @@ -11,7 +11,6 @@ "G1 Z0.25 F180 ; move z to 0.25mm over bed", "G92 E0 ; zero the extruded", "M109 S{temp} T{tool} ; wait for extruder to reach target temp", - "G1 E15 F200 ; purge 15mm from extruder", "G92 E0 ; zero the extruded", "G1 F225 ; set feed speed" ], diff --git a/src/dev/fdm/Wanhao.Duplicator_i3 b/src/dev/fdm/Wanhao.Duplicator_i3 index 54bf135d..7a73d2b5 100644 --- a/src/dev/fdm/Wanhao.Duplicator_i3 +++ b/src/dev/fdm/Wanhao.Duplicator_i3 @@ -11,7 +11,6 @@ "G1 Z0.25 F180 ; move z to 0.25mm over bed", "G92 E0 ; zero the extruded", "M109 S{temp} T{tool} ; wait for extruder to reach target temp", - "G1 E15 F200 ; purge 15mm from extruder", "G92 E0 ; zero the extruded", "G1 F225 ; set feed speed" ], From 22eb7eeff1ae584c348eca9c64fe4a281211250d Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Wed, 27 Jan 2021 00:00:48 -0500 Subject: [PATCH 036/255] and remove bed drop at end --- src/dev/fdm/Wanhao.Duplicator_4s | 1 - src/dev/fdm/Wanhao.Duplicator_5s | 1 - src/dev/fdm/Wanhao.Duplicator_6 | 1 - src/dev/fdm/Wanhao.Duplicator_i3 | 1 - 4 files changed, 4 deletions(-) diff --git a/src/dev/fdm/Wanhao.Duplicator_4s b/src/dev/fdm/Wanhao.Duplicator_4s index 2c9c6c59..11ce3cb9 100644 --- a/src/dev/fdm/Wanhao.Duplicator_4s +++ b/src/dev/fdm/Wanhao.Duplicator_4s @@ -18,7 +18,6 @@ "M107 ; turn off filament cooling fan", "M104 S0 T{tool} ; turn off right extruder", "M140 S0 T{tool} ; turn off bed", - "G1 Z{z_max} F1200 ; drop bed", "G28 X0 Y0 ; home XY axes", "M84 ; disable stepper motors" ], diff --git a/src/dev/fdm/Wanhao.Duplicator_5s b/src/dev/fdm/Wanhao.Duplicator_5s index 67fa5433..d082dc96 100644 --- a/src/dev/fdm/Wanhao.Duplicator_5s +++ b/src/dev/fdm/Wanhao.Duplicator_5s @@ -18,7 +18,6 @@ "M107 ; turn off filament cooling fan", "M104 S0 T{tool} ; turn off right extruder", "M140 S0 T{tool} ; turn off bed", - "G1 Z{z_max} F1200 ; drop bed", "G28 X0 Y0 ; home XY axes", "M84 ; disable stepper motors" ], diff --git a/src/dev/fdm/Wanhao.Duplicator_6 b/src/dev/fdm/Wanhao.Duplicator_6 index 7a73d2b5..a7d69a14 100644 --- a/src/dev/fdm/Wanhao.Duplicator_6 +++ b/src/dev/fdm/Wanhao.Duplicator_6 @@ -18,7 +18,6 @@ "M107 ; turn off filament cooling fan", "M104 S0 T{tool} ; turn off right extruder", "M140 S0 T{tool} ; turn off bed", - "G1 Z{z_max} F1200 ; drop bed", "G28 X0 Y0 ; home XY axes", "M84 ; disable stepper motors" ], diff --git a/src/dev/fdm/Wanhao.Duplicator_i3 b/src/dev/fdm/Wanhao.Duplicator_i3 index 7a73d2b5..a7d69a14 100644 --- a/src/dev/fdm/Wanhao.Duplicator_i3 +++ b/src/dev/fdm/Wanhao.Duplicator_i3 @@ -18,7 +18,6 @@ "M107 ; turn off filament cooling fan", "M104 S0 T{tool} ; turn off right extruder", "M140 S0 T{tool} ; turn off bed", - "G1 Z{z_max} F1200 ; drop bed", "G28 X0 Y0 ; home XY axes", "M84 ; disable stepper motors" ], From e8ce2f66d1a14e815ff21feec5dffb6b07ec36a1 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Wed, 27 Jan 2021 11:23:39 -0500 Subject: [PATCH 037/255] add unlocked / single axis scale / sizing. add label action for locking and scale --- notes.md | 3 ++- src/kiri/init.js | 44 ++++++++++++++++++++++++++++++++++++++------ web/kiri/index.css | 8 ++++++++ web/kiri/index.html | 6 +++--- 4 files changed, 51 insertions(+), 10 deletions(-) diff --git a/notes.md b/notes.md index 4294bec1..dec822aa 100644 --- a/notes.md +++ b/notes.md @@ -99,8 +99,9 @@ * `P` common part pre-analyze to speed up 'slice' and improve shadow (overhangs) * `P` redo all path route / planning in prepare to account for terrain before camOut -* `P` detect render message backlog and pause or warn +* `P` detect render message backlog and pause or warn? * `P` allow faster z movements when contouring (not plunging) +* `P` common / faster shadow generator using vertices shared with ledges # Laser diff --git a/src/kiri/init.js b/src/kiri/init.js index 3b6c45a6..db42243c 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -1999,9 +1999,17 @@ xv = parseFloat(UI.sizeX.was), yv = parseFloat(UI.sizeY.was), zv = parseFloat(UI.sizeZ.was), - xr = (UI.lockX.checked ? ra : 1), - yr = (UI.lockY.checked ? ra : 1), - zr = (UI.lockZ.checked ? ra : 1); + ta = e.target, + xc = UI.lockX.checked, + yc = UI.lockY.checked, + zc = UI.lockZ.checked, + xt = ta === UI.sizeX, + yt = ta === UI.sizeY, + zt = ta === UI.sizeZ, + tl = (xt && xc) || (yt && yc) || (zt && zc), + xr = ((tl && xc) || (!tl && xt) ? ra : 1), + yr = ((tl && yc) || (!tl && yt) ? ra : 1), + zr = ((tl && zc) || (!tl && zt) ? ra : 1); API.selection.scale(xr,yr,zr); UI.sizeX.was = UI.sizeX.value = xv * xr; UI.sizeY.was = UI.sizeY.value = yv * yr; @@ -2015,9 +2023,17 @@ xv = parseFloat(UI.scaleX.was), yv = parseFloat(UI.scaleY.was), zv = parseFloat(UI.scaleZ.was), - xr = (UI.lockX.checked ? ra : 1), - yr = (UI.lockY.checked ? ra : 1), - zr = (UI.lockZ.checked ? ra : 1); + ta = e.target, + xc = UI.lockX.checked, + yc = UI.lockY.checked, + zc = UI.lockZ.checked, + xt = ta === UI.scaleX, + yt = ta === UI.scaleY, + zt = ta === UI.scaleZ, + tl = (xt && xc) || (yt && yc) || (zt && zc), + xr = ((tl && xc) || (!tl && xt) ? ra : 1), + yr = ((tl && yc) || (!tl && yt) ? ra : 1), + zr = ((tl && zc) || (!tl && zt) ? ra : 1); API.selection.scale(xr,yr,zr); UI.scaleX.was = UI.scaleX.value = xv * xr; UI.scaleY.was = UI.scaleY.value = yv * yr; @@ -2053,6 +2069,22 @@ $('rot_z'), selectionRotate ]); + $('lab-axis').onclick = () => { + UI.lockX.checked = + UI.lockY.checked = + UI.lockZ.checked = !( + UI.lockX.checked || + UI.lockY.checked || + UI.lockZ.checked + ); + }; + + $('lab-scale').onclick = () => { + API.selection.scale(1 / UI.scaleX.was, 1 / UI.scaleY.was, 1 / UI.scaleZ.was); + UI.scaleX.value = UI.scaleY.value = UI.scaleZ.value = + UI.scaleX.was = UI.scaleY.was = UI.scaleZ.was = 1; + }; + UC.onBlur([ UI.toolName, UI.toolNum, diff --git a/web/kiri/index.css b/web/kiri/index.css index 2d07ad6c..f4a6211e 100644 --- a/web/kiri/index.css +++ b/web/kiri/index.css @@ -1500,3 +1500,11 @@ th, tr, td, label { border-top: 1px solid #ddd; margin: 5px 0 5px 0; } + +#lab-axis, #lab-scale { + padding: 0 6px 0 6px; + border-radius: 3px; +} +#lab-axis:hover, #lab-scale:hover { + background-color: rgba(0,0,0,0.2); +} diff --git a/web/kiri/index.html b/web/kiri/index.html index b6cf9d1d..e3760d58 100644 --- a/web/kiri/index.html +++ b/web/kiri/index.html @@ -222,9 +222,9 @@
-
-
-
+
+
+
From 9d37b2e678de53945b3cfc06bc3371b58ed3ba8b Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Wed, 27 Jan 2021 17:58:04 -0500 Subject: [PATCH 038/255] add hover-pop delay + grouping for left menu --- src/kiri/init.js | 14 ++++++++++++++ src/kiri/main.js | 14 +++++++------- src/kiri/ui.js | 33 +++++++++++++++++++++++++++++++++ web/kiri/index.css | 7 +++++-- web/kiri/index.html | 10 +++++----- 5 files changed, 64 insertions(+), 14 deletions(-) diff --git a/src/kiri/init.js b/src/kiri/init.js index db42243c..edddbef4 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -1464,6 +1464,10 @@ back: $('lt-back'), trash: $('lt-trash'), + ltsetup: $('lt-setup'), + ltfile: $('lt-file'), + ltview: $('lt-view'), + ltact: $('act-slice'), rotate: $('lt-rotate'), scale: $('lt-scale'), nozzle: $('lt-nozzle'), @@ -2085,6 +2089,16 @@ UI.scaleX.was = UI.scaleY.was = UI.scaleZ.was = 1; }; + let ltpops = []; + UC.hoverPop(UI.ltsetup, { group: ltpops, target: $('set-pop') }); + UC.hoverPop(UI.ltfile, { group: ltpops, target: $('file-pop') }); + UC.hoverPop(UI.ltview, { group: ltpops, target: $('pop-view') }); + UC.hoverPop(UI.ltact, { group: ltpops, target: $('pop-slice') }); + UC.hoverPop(UI.render, { group: ltpops, target: $('pop-render') }); + UC.hoverPop(UI.rotate, { group: ltpops, target: $('pop-rotate') }); + UC.hoverPop(UI.scale, { group: ltpops, target: $('pop-scale') }); + UC.hoverPop(UI.nozzle, { group: ltpops, target: $('pop-nozzle') }); + UC.onBlur([ UI.toolName, UI.toolNum, diff --git a/src/kiri/main.js b/src/kiri/main.js index c6d1a9a3..af3b23ea 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -1515,9 +1515,9 @@ let menu_show = selcount ? 'flex': ''; $('winfo').style.display = 'none'; if (selcount) { - UI.scale.classList.add('lt-enabled'); - UI.rotate.classList.add('lt-enabled'); - UI.nozzle.classList.add('lt-enabled'); + UI.scale.classList.add('lt-active'); + UI.rotate.classList.add('lt-active'); + UI.nozzle.classList.add('lt-active'); UI.trash.style.display = 'flex'; if (feature.meta && selcount === 1) { let sel = selection.widgets()[0]; @@ -1537,9 +1537,9 @@ } } } else { - UI.scale.classList.remove('lt-enabled'); - UI.rotate.classList.remove('lt-enabled'); - UI.nozzle.classList.remove('lt-enabled'); + UI.scale.classList.remove('lt-active'); + UI.rotate.classList.remove('lt-active'); + UI.nozzle.classList.remove('lt-active'); UI.trash.style.display = ''; } UI.nozzle.style.display = extruders && extruders.length > 1 ? 'flex' : ''; @@ -2489,7 +2489,7 @@ complete = {}; UI.back.style.display = ''; UI.render.style.display = ''; - UI.render.classList.add('lt-enabled'); + // UI.render.classList.add('lt-enabled'); // KIRI.work.clear(); STACKS.clear(); hideSlider(); diff --git a/src/kiri/ui.js b/src/kiri/ui.js index 8aa1b96b..a014f9db 100644 --- a/src/kiri/ui.js +++ b/src/kiri/ui.js @@ -47,6 +47,7 @@ setExpert, setHoverPop, hidePoppers, + hoverPop, bound, toInt, toFloat, @@ -882,4 +883,36 @@ return array; } + function hoverPop(el, opt = {}) { + if (Array.isArray(el)) { + opt.group = []; + return el.forEach(ev => hoverPop(ev, opt)); + } + let group = opt.group || []; + let closes = opt.closes || group; + let target = opt.target || el; + group.push(target); + if (closes !== group) { + closes.push(target); + } + el.addEventListener("mouseenter", (ev) => { + clearTimeout(closes.timer); + for (let close of closes) { + close.classList.remove("hoverpop"); + } + target.classList.add("hoverpop"); + }); + el.addEventListener("mouseleave", (ev) => { + closes.timer = setTimeout(() => { + target.classList.remove("hoverpop"); + }, 750); + }); + document.addEventListener("keydown", (ev) => { + if (ev.keyCode === 27 || ev.code === 'Escape') { + target.classList.remove("hoverpop"); + clearTimeout(closes.timer); + } + }); + } + })(); diff --git a/web/kiri/index.css b/web/kiri/index.css index f4a6211e..d41b7a59 100644 --- a/web/kiri/index.css +++ b/web/kiri/index.css @@ -471,10 +471,10 @@ th, tr, td, label { .lt-menu label { font-size: smaller; } -.lt-enabled { +.lt-enabled, .lt-active { color: var(--fg-gray); } -.lt-enabled:hover { +.lt-enabled:hover, .lt-active:hover { background-color: #eee; border: 1px solid #aaa; color: #000; @@ -482,6 +482,9 @@ th, tr, td, label { .lt-enabled:hover .pop-lcol { display: flex; } +.lt-active .hoverpop { + display: flex; +} @media only screen and (max-height : 800px) { .lt-menu, .pop-lcol { font-size: 16px !important; diff --git a/web/kiri/index.html b/web/kiri/index.html index e3760d58..ef601e46 100644 --- a/web/kiri/index.html +++ b/web/kiri/index.html @@ -72,7 +72,7 @@
-
+
@@ -90,7 +90,7 @@
-
+
@@ -105,7 +105,7 @@
-
+
@@ -127,7 +127,7 @@
-
+
@@ -146,7 +146,7 @@
-
+
From c53741169eb018655baebb47c56b08d31e9993c4 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Wed, 27 Jan 2021 18:21:01 -0500 Subject: [PATCH 039/255] ensure widgets are on platform when changing devices or modes --- src/kiri/main.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/kiri/main.js b/src/kiri/main.js index af3b23ea..2b7b6953 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -84,6 +84,7 @@ for_groups: forSelectedGroups, for_meshes: forSelectedMeshes, for_widgets: forSelectedWidgets, + update_bounds: updateSelectedBounds, delete: function() { platform.delete(selection.widgets()) }, export: exportSelection }; @@ -1202,13 +1203,16 @@ updateSelectedBounds(); } - function updateSelectedBounds() { + function updateSelectedBounds(widgets) { // update bounds on selection for drag limiting let isBelt = settings.device.bedBelt; let dvy = settings.device.bedDepth; let dvx = settings.device.bedWidth; let bounds_sel = new THREE.Box3(); - forSelectedWidgets(function(widget) { + if (!widgets) { + widgets = selectedMeshes.map(m => m.widget); + } + for (let widget of widgets) { let wp = widget.track.pos; let bx = widget.track.box; let miny = wp.y - bx.h/2 + dvy/2; @@ -1238,7 +1242,7 @@ wb.min.y += wp.y; wb.max.y += wp.y; bounds_sel.union(wb); - }); + } settings.bounds_sel = bounds_sel; } @@ -2489,7 +2493,6 @@ complete = {}; UI.back.style.display = ''; UI.render.style.display = ''; - // UI.render.classList.add('lt-enabled'); // KIRI.work.clear(); STACKS.clear(); hideSlider(); @@ -2570,6 +2573,7 @@ // other housekeeping triggerSettingsEvent(); platformUpdateSelected(); + updateSelectedBounds(WIDGETS); updateFields(); // because device dialog, if showing, needs to be updated if (modalShowing()) { From cbf5d492b8c67217a21b66a0709c17f859619253 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Wed, 27 Jan 2021 23:47:06 -0500 Subject: [PATCH 040/255] trim support to part shadow in non-belt modes. fix part support offset --- src/kiri/init.js | 6 ++++-- src/mode/fdm/slice.js | 23 +++++++++++++++++++---- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/kiri/init.js b/src/kiri/init.js index edddbef4..96122ded 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -860,12 +860,14 @@ } function loadDeviceImage(dev, url) { - new THREE.TextureLoader().load(url || dev.imageURL, texture => { + let turl = url || dev.imageURL; + if (!turl) return; + new THREE.TextureLoader().load(turl, texture => { loadDeviceTexture(dev, texture); }, inc => { console.log({load_inc: inc}); }, error => { - console.log({load_error: error}); + console.log({load_error: error, turl}); clearDeviceTexture(); }); } diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index 9ae4988f..c2e77963 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -193,6 +193,7 @@ // clip tops to other widgets in group tops = slice.topPolys(); for (let peer of widget.group) { + // skip self if (peer === widget) { continue; } @@ -202,13 +203,27 @@ } // offset pslice tops by spro.sliceSupportOffset if (!pslice.synth_off) { - pslice.synth_off = POLY.offset(pslice.topPolys(), nozzleSize/2 + spro.sliceSupportOffset); + pslice.synth_off = POLY.offset(pslice.topPolys(), spro.sliceSupportOffset); } let ptops = pslice.synth_off; let ntops = []; POLY.subtract(tops, ptops, ntops, null, slice.z, 0); tops = ntops; } + // trim to group's shadow if not in belt mode + if (!isBelt) { + let group = widget.group[0]; + if (!group.shadow) { + let gs = []; + for (let w of group) { + if (w.shadow) { + gs = POLY.union([w.shadow,...gs],null,0.1); + } + } + group.shadow = gs; + } + tops = POLY.setZ(POLY.trimTo(tops, group.shadow), slice.z); + } } slice.tops = []; for (let t of tops) { @@ -249,6 +264,7 @@ if (spro.sliceSupportExtra) { shadow = POLY.offset(shadow, spro.sliceSupportExtra); } + widget.shadow = shadow; // slices[0].output() // .setLayer('shadow', { line: 0xff0000, check: 0xff0000 }) // .addPolys(shadow); @@ -917,8 +933,7 @@ * calculate external overhangs requiring support */ function doSupport(slice, proc, shadow) { - let minOffset = proc.sliceSupportOffset, - maxBridge = proc.sliceSupportSpan || 5, + let maxBridge = proc.sliceSupportSpan || 5, minArea = proc.supportMinArea, pillarSize = proc.sliceSupportSize, offset = proc.sliceSupportOffset, @@ -948,7 +963,7 @@ let supported = point.isInPolygonOnly(down_tops); if (!supported) down_traces.forEach(function(trace) { trace.forEachSegment(function(p1, p2) { - if (point.distToLine(p1, p2) <= minOffset) { + if (point.distToLine(p1, p2) <= offset) { return supported = true; } }); From 7389c99537c831f2452891fc31b37f3252c9239f Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Wed, 27 Jan 2021 23:48:02 -0500 Subject: [PATCH 041/255] bump rev 2.6.D14 --- package.json | 2 +- src/kiri.js | 2 +- src/license.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 401d8a25..eeaecabb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grid-apps", - "version": "2.6.13D", + "version": "2.6.14D", "description": "grid.space 3d slice & modeling tools", "author": "Stewart Allen ", "license": "MIT", diff --git a/src/kiri.js b/src/kiri.js index 0bc5e67e..0049b46c 100644 --- a/src/kiri.js +++ b/src/kiri.js @@ -6,7 +6,7 @@ if (!self.kiri) { self.kiri = { - beta: 2613, + beta: 2614, driver: {}, // driver modules loader: [] // module loading: array of functions }; diff --git a/src/license.js b/src/license.js index 08d8db53..3d0c4360 100644 --- a/src/license.js +++ b/src/license.js @@ -3,7 +3,7 @@ let terms = { COPYRIGHT: "Copyright (C) Stewart Allen - All Rights Reserved", LICENSE: "See the license.md file included with the source distribution", - VERSION: "2.6.D13" + VERSION: "2.6.D14" }; if (typeof(module) === 'object') { From e1250f5f93c18ead87e7b57ddb31a36f0ec30756 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 28 Jan 2021 18:04:45 -0500 Subject: [PATCH 042/255] add belt lead in option --- src/kiri/conf.js | 1 + src/kiri/init.js | 3 +++ src/mode/fdm/prepare.js | 9 ++++++++- web/kiri/lang/en.js | 2 ++ 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/kiri/conf.js b/src/kiri/conf.js index 23cd2423..6f42544c 100644 --- a/src/kiri/conf.js +++ b/src/kiri/conf.js @@ -312,6 +312,7 @@ firstLayerBedTemp: 0, firstLayerBrim: 0, firstLayerBrimTrig: 0, + firstLayerBeltLead: 3, outputRaft: false, outputRaftSpacing: 0.2, outputTemp: 200, diff --git a/src/kiri/init.js b/src/kiri/init.js index 96122ded..5a14256b 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -1650,8 +1650,11 @@ fdmSep: UC.newBlank({class:"pop-sep", modes:FDM, show:isNotBelt}), firstLayerLineMult: UC.newInput(LANG.fl_sfac_s, {title:LANG.fl_sfac_l, convert:UC.toFloat, bound:UC.bound(0.5,2), modes:FDM, show:isNotBelt}), firstLayerPrintMult: UC.newInput(LANG.fl_mult_s, {title:LANG.fl_mult_l, convert:UC.toFloat, modes:FDM}), + fdmSep: UC.newBlank({class:"pop-sep", modes:FDM, show:isBelt}), firstLayerBrim: UC.newInput(LANG.fl_brim_s, {title:LANG.fl_brim_l, convert:UC.toFloat, modes:FDM, show:isBelt}), firstLayerBrimTrig: UC.newInput(LANG.fl_brmn_s, {title:LANG.fl_brmn_l, convert:UC.toFloat, modes:FDM, show:isBelt}), + fdmSep: UC.newBlank({class:"pop-sep", modes:FDM, show:isBelt}), + firstLayerBeltLead: UC.newInput(LANG.fl_bled_s, {title:LANG.fl_bled_l, convert:UC.toFloat, modes:FDM, show:isBelt}), fdmSep: UC.newBlank({class:"pop-sep", modes:FDM, show:isNotBelt}), outputBrimCount: UC.newInput(LANG.fl_skrt_s, {title:LANG.fl_skrt_l, convert:UC.toInt, modes:FDM, show:isNotBelt}), outputBrimOffset: UC.newInput(LANG.fl_skro_s, {title:LANG.fl_skro_l, convert:UC.toFloat, modes:FDM, show:isNotBelt}), diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index 0bfc34bf..ebd70479 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -457,6 +457,13 @@ rec.point.y += poff; } } + + // add lead in, when specified + if (process.firstLayerBeltLead) { + // add belt lead in + console.log({process, output}); + } + let thresh = firstLayerHeight * 1.05; // iterate over layers, find extrusion on belt and // apply corrections and add brim when specified @@ -482,7 +489,7 @@ } lastout = rec; } - // skip if brig trigger not met + // skip if brim trigger not met if (firstLayerBrimTrig > 0 && mins > firstLayerBrimTrig) { continue; } diff --git a/web/kiri/lang/en.js b/web/kiri/lang/en.js index d080f085..d30028d2 100644 --- a/web/kiri/lang/en.js +++ b/web/kiri/lang/en.js @@ -235,6 +235,8 @@ kiri.lang['en-us'] = { fl_brim_l: "add brim to part bottom\nsize is width in millimeters\n0 to disable", fl_brmn_s: "brim trigger", fl_brmn_l: "add brims only when segment\nfacing belt is shorter than this\nvalue in millimeters\n0 = Infinity", + fl_bled_s: "part anchor", + fl_bled_l: "belt part anchor\nat start of print\nin millimeters", // FDM SUPPORT sp_menu: "support", From d48e001e1e310eba66ff59baf664a0837c5b620b Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 28 Jan 2021 21:46:41 -0500 Subject: [PATCH 043/255] add sticky option to popHover. checkpoint belt anchors --- src/kiri/init.js | 8 ++-- src/kiri/ui.js | 24 ++++++++++-- src/mode/fdm/prepare.js | 8 ++-- src/mode/fdm/slice.js | 87 ++++++++++++++++++++++++++++------------- 4 files changed, 87 insertions(+), 40 deletions(-) diff --git a/src/kiri/init.js b/src/kiri/init.js index 5a14256b..1287f4c7 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -2099,10 +2099,10 @@ UC.hoverPop(UI.ltfile, { group: ltpops, target: $('file-pop') }); UC.hoverPop(UI.ltview, { group: ltpops, target: $('pop-view') }); UC.hoverPop(UI.ltact, { group: ltpops, target: $('pop-slice') }); - UC.hoverPop(UI.render, { group: ltpops, target: $('pop-render') }); - UC.hoverPop(UI.rotate, { group: ltpops, target: $('pop-rotate') }); - UC.hoverPop(UI.scale, { group: ltpops, target: $('pop-scale') }); - UC.hoverPop(UI.nozzle, { group: ltpops, target: $('pop-nozzle') }); + UC.hoverPop(UI.render, { group: ltpops, target: $('pop-render'), sticky: true }); + UC.hoverPop(UI.rotate, { group: ltpops, target: $('pop-rotate'), sticky: true }); + UC.hoverPop(UI.scale, { group: ltpops, target: $('pop-scale'), sticky: true }); + UC.hoverPop(UI.nozzle, { group: ltpops, target: $('pop-nozzle'), sticky: true }); UC.onBlur([ UI.toolName, diff --git a/src/kiri/ui.js b/src/kiri/ui.js index a014f9db..db633bb7 100644 --- a/src/kiri/ui.js +++ b/src/kiri/ui.js @@ -891,26 +891,42 @@ let group = opt.group || []; let closes = opt.closes || group; let target = opt.target || el; + let popped = false; group.push(target); if (closes !== group) { closes.push(target); } - el.addEventListener("mouseenter", (ev) => { + let openit = () => { clearTimeout(closes.timer); for (let close of closes) { close.classList.remove("hoverpop"); } target.classList.add("hoverpop"); - }); + popped = true; + }; + let closeit = () => { + target.classList.remove("hoverpop"); + clearTimeout(closes.timer); + popped = false; + }; + el.addEventListener("mouseenter", openit); el.addEventListener("mouseleave", (ev) => { closes.timer = setTimeout(() => { target.classList.remove("hoverpop"); }, 750); }); + if (!opt.sticky) { + el.addEventListener("mouseup", (ev) => { + if (popped) { + closeit(); + } else { + openit(); + } + }); + } document.addEventListener("keydown", (ev) => { if (ev.keyCode === 27 || ev.code === 'Escape') { - target.classList.remove("hoverpop"); - clearTimeout(closes.timer); + closeit(); } }); } diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index ebd70479..a211ad0f 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -459,10 +459,10 @@ } // add lead in, when specified - if (process.firstLayerBeltLead) { - // add belt lead in - console.log({process, output}); - } + // if (process.firstLayerBeltLead) { + // // add belt lead in + // console.log({process, output}); + // } let thresh = firstLayerHeight * 1.05; // iterate over layers, find extrusion on belt and diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index c2e77963..f93e99ca 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -81,7 +81,9 @@ fillOffset = lineWidth * fillOffsetMult, sliceFillAngle = spro.sliceFillAngle, supportDensity = spro.sliceSupportDensity, - view = widget.mesh && widget.mesh.newGroup ? widget.mesh.newGroup() : null; + view = widget.mesh && widget.mesh.newGroup ? widget.mesh.newGroup() : null, + beltfact = Math.cos(Math.PI/4), + invbfact = 1 / beltfact; isFlat = settings.controller.lineType === "flat"; isThin = !isFlat && settings.controller.lineType === "line"; @@ -285,7 +287,6 @@ doShells(slice, count, offset, fillOff, { vase: vaseMode, thin: spro.detectThinWalls && !isSynth, - belt0: isBelt && first, widget: widget }); if (solid) { @@ -295,6 +296,50 @@ sliceFillAngle += 90.0; }, "offsets"); + // add lead in when specified in belt mode + if (!isSynth && isBelt && spro.firstLayerBeltLead) { + let wb = widget.bounds; + // find adjusted zero point from slices + let smin = Infinity; + for (let slice of slices) { + let miny = Infinity; + for (let poly of slice.topPolys()) { + let y = poly.bounds.maxy; + let z = slice.z; + let by = -y + z; + if (by < miny) miny = by; + if (by < smin) smin = by; + } + slice.belt = { miny, touch: false }; + } + // mark slices with tops touching belt + let start; + for (let slice of slices) { + if (Math.abs(slice.belt.miny - smin) < 0.001) { + slice.belt.touch = true; + if (!start) start = slice; + } + } + // console.log({smin: smin.round(4)}); + let offset = spro.firstLayerBeltLead * beltfact; + while (start && offset >= sliceHeight) { + let addto = start.down; + if (!addto) { + addto = newSlice(start.z - sliceHeight); + addto.height = start.height; + addto.up = start; + start.down = addto; + slices.splice(0,0,addto); + } + let z = addto.z; + let y = z - smin - sliceHeight * beltfact; + let splat = BASE.newPolygon().add(wb.min.x, y, z).add(wb.max.x, y, z).setOpen(); + addto.addTop(splat).fill_sparse = [ splat ]; + start = addto; + offset -= sliceHeight; + } + } + // calculations only relevant when solid layers are used if (doSolidLayers) { forSlices(0.2, 0.34, slice => { @@ -380,13 +425,11 @@ const height = slice.height / 2; slice.tops.forEach(top => { - if (isThin) { - output - .setLayer('slice', { line: 0x000066, check: 0x000066 }) - .addPolys(top.poly); - } + if (isThin) output + .setLayer('slice', { line: 0x000066, check: 0x000066 }) + .addPolys(top.poly); - output + if (top.shells) output .setLayer("shells", isSynth ? COLOR.support : COLOR.shell) .addPolys(top.shells, vopt({ offset, height })); @@ -572,23 +615,6 @@ top.last = last; shellout += top.shells.length; - - // add anchor extrusion if missing on the first belt layer - // todo: fix. disabled because throws off layer min y calculations in some cases - if (false && opt.belt0 && top.shells.length === 0 && slice.up && slice.up.tops.length) { - for (let up of slice.up.tops) { - let bounds = up.poly.bounds, - midy = (bounds.miny + bounds.maxy) / 2; - if (top.poly.isInside(up.poly, 1)) { - slice.widget.belt.ymid = midy; - slice.widget.belt.zmid = slice.z; - top.shells.push(BASE.newPolygon() - .setOpen() - .add(bounds.minx,midy,slice.z) - .add(bounds.maxx,midy,slice.z)); - } - } - } }); }; @@ -687,7 +713,7 @@ // prepare top infill structure tops.forEach(function(top) { - top.fill_sparse = []; + top.fill_sparse = top.fill_sparse || []; polys.appendAll(top.fill_off); polys.appendAll(top.solids); }); @@ -844,8 +870,13 @@ let minarea = minArea || 1, tops = slice.tops, - solids = slice.solids, - unioned = POLY.union(solids, undefined, true).flat(), // TODO verify + solids = slice.solids; + + if (!(tops && solids)) { + return; + } + + let unioned = POLY.union(solids, undefined, true).flat(), // TODO verify isSLA = (spacing === undefined && angle === undefined); if (solids.length === 0) return false; From 47ebefcb359d72765a4d14d33237f125c7b707fd Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 28 Jan 2021 21:55:35 -0500 Subject: [PATCH 044/255] fix anchor offsets --- src/mode/fdm/slice.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index f93e99ca..ba8b2727 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -322,6 +322,10 @@ } // console.log({smin: smin.round(4)}); let offset = spro.firstLayerBeltLead * beltfact; + // ensure we start against a layer with shells + while (start.up && start.topShells().length === 0) { + start = start.up; + } while (start && offset >= sliceHeight) { let addto = start.down; if (!addto) { @@ -332,7 +336,7 @@ slices.splice(0,0,addto); } let z = addto.z; - let y = z - smin - sliceHeight * beltfact; + let y = z - smin - (nozzleSize / 2); let splat = BASE.newPolygon().add(wb.min.x, y, z).add(wb.max.x, y, z).setOpen(); addto.addTop(splat).fill_sparse = [ splat ]; start = addto; From 34b6dd85d476f9bea2bc491ce6f4839538059c69 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 28 Jan 2021 21:56:06 -0500 Subject: [PATCH 045/255] bump rev 2.6.D15 --- package.json | 2 +- src/kiri.js | 2 +- src/license.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index eeaecabb..b6a86680 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grid-apps", - "version": "2.6.14D", + "version": "2.6.15D", "description": "grid.space 3d slice & modeling tools", "author": "Stewart Allen ", "license": "MIT", diff --git a/src/kiri.js b/src/kiri.js index 0049b46c..cf1229b2 100644 --- a/src/kiri.js +++ b/src/kiri.js @@ -6,7 +6,7 @@ if (!self.kiri) { self.kiri = { - beta: 2614, + beta: 2615, driver: {}, // driver modules loader: [] // module loading: array of functions }; diff --git a/src/license.js b/src/license.js index 3d0c4360..87211a52 100644 --- a/src/license.js +++ b/src/license.js @@ -3,7 +3,7 @@ let terms = { COPYRIGHT: "Copyright (C) Stewart Allen - All Rights Reserved", LICENSE: "See the license.md file included with the source distribution", - VERSION: "2.6.D14" + VERSION: "2.6.D15" }; if (typeof(module) === 'object') { From 86f625f739ab1ea88cc72f58a0f521abdc2fb095 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 29 Jan 2021 00:23:11 -0500 Subject: [PATCH 046/255] fix sla exports --- src/mode/sla/export.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/mode/sla/export.js b/src/mode/sla/export.js index fd41292d..c8974928 100644 --- a/src/mode/sla/export.js +++ b/src/mode/sla/export.js @@ -476,6 +476,8 @@ // }; // } else // load renderer code in worker context only + let wasm; + fetch('/wasm/kiri-sla.wasm') .then(response => response.arrayBuffer()) .then(bytes => WebAssembly.instantiate(bytes, { @@ -488,7 +490,7 @@ let {module, instance} = results; let {exports} = instance; let heap = new Uint8Array(exports.memory.buffer); - self.wasm = { + wasm = { heap, memory: exports.memory, render: exports.render, @@ -502,7 +504,6 @@ let width2 = width / 2, height2 = height / 2; let array = []; let count = 0; - let wasm = self.wasm; function scaleMovePoly(poly) { let points = poly.points; From f8ecd9f19815e0ed7bf1c31a0669a807dbf1c643 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 29 Jan 2021 08:03:13 -0500 Subject: [PATCH 047/255] do not add brims to anchors --- src/mode/fdm/prepare.js | 6 ++++++ src/mode/fdm/slice.js | 2 ++ 2 files changed, 8 insertions(+) diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index a211ad0f..7382caf2 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -386,6 +386,8 @@ } layerout.z = z + slice.height / 2; layerout.height = layerout.height || slice.height; + // mark layer as anchor if slice is belt and flag set + layerout.anchor = slice.belt && slice.belt.anchor; // detect extruder change and print purge block if (!lastOut || lastOut.extruder !== slice.extruder) { printPoint = purge(slice.extruder, track, layerout, printPoint, slice.z); @@ -493,6 +495,10 @@ if (firstLayerBrimTrig > 0 && mins > firstLayerBrimTrig) { continue; } + // do not add brims to anchor layers + if (layer.anchor) { + continue; + } // add brim, if specified if (first && firstLayerBrim) { let {emit, tool } = first; diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index ba8b2727..b241c6c9 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -330,11 +330,13 @@ let addto = start.down; if (!addto) { addto = newSlice(start.z - sliceHeight); + addto.belt = { }; addto.height = start.height; addto.up = start; start.down = addto; slices.splice(0,0,addto); } + addto.belt.anchor = true; let z = addto.z; let y = z - smin - (nozzleSize / 2); let splat = BASE.newPolygon().add(wb.min.x, y, z).add(wb.max.x, y, z).setOpen(); From c6a33cab70817bb5eb7eda4a5758bca610bc2246 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 29 Jan 2021 12:20:18 -0500 Subject: [PATCH 048/255] add hover persistence to app-acct menu --- src/kiri/init.js | 19 ++++++++++--------- src/kiri/ui.js | 4 +++- web/kiri/index.css | 4 ++-- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/kiri/init.js b/src/kiri/init.js index 1287f4c7..483f260e 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -2094,15 +2094,16 @@ UI.scaleX.was = UI.scaleY.was = UI.scaleZ.was = 1; }; - let ltpops = []; - UC.hoverPop(UI.ltsetup, { group: ltpops, target: $('set-pop') }); - UC.hoverPop(UI.ltfile, { group: ltpops, target: $('file-pop') }); - UC.hoverPop(UI.ltview, { group: ltpops, target: $('pop-view') }); - UC.hoverPop(UI.ltact, { group: ltpops, target: $('pop-slice') }); - UC.hoverPop(UI.render, { group: ltpops, target: $('pop-render'), sticky: true }); - UC.hoverPop(UI.rotate, { group: ltpops, target: $('pop-rotate'), sticky: true }); - UC.hoverPop(UI.scale, { group: ltpops, target: $('pop-scale'), sticky: true }); - UC.hoverPop(UI.nozzle, { group: ltpops, target: $('pop-nozzle'), sticky: true }); + let hpops = []; + UC.hoverPop(UI.ltsetup, { group: hpops, target: $('set-pop') }); + UC.hoverPop(UI.ltfile, { group: hpops, target: $('file-pop') }); + UC.hoverPop(UI.ltview, { group: hpops, target: $('pop-view') }); + UC.hoverPop(UI.ltact, { group: hpops, target: $('pop-slice') }); + UC.hoverPop(UI.render, { group: hpops, target: $('pop-render'), sticky: true }); + UC.hoverPop(UI.rotate, { group: hpops, target: $('pop-rotate'), sticky: true }); + UC.hoverPop(UI.scale, { group: hpops, target: $('pop-scale'), sticky: true }); + UC.hoverPop(UI.nozzle, { group: hpops, target: $('pop-nozzle'), sticky: true }); + UC.hoverPop($('app-acct'), { group: hpops, target: $('acct-pop') } ); UC.onBlur([ UI.toolName, diff --git a/src/kiri/ui.js b/src/kiri/ui.js index db633bb7..6f37653b 100644 --- a/src/kiri/ui.js +++ b/src/kiri/ui.js @@ -909,7 +909,9 @@ clearTimeout(closes.timer); popped = false; }; - el.addEventListener("mouseenter", openit); + if (opt.auto !== false) { + el.addEventListener("mouseenter", openit); + } el.addEventListener("mouseleave", (ev) => { closes.timer = setTimeout(() => { target.classList.remove("hoverpop"); diff --git a/web/kiri/index.css b/web/kiri/index.css index d41b7a59..b3a3662d 100644 --- a/web/kiri/index.css +++ b/web/kiri/index.css @@ -317,8 +317,8 @@ th, tr, td, label { align-items: center; justify-content: flex-end; } -#app-acct:hover #acct-pop { - display: flex; +#acct-pop.hoverpop { + display: flex !important; } #acct-pop { display: none; From 09d1b35fe35791ade626a356bada71c84057a6c2 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 29 Jan 2021 12:33:57 -0500 Subject: [PATCH 049/255] mode info shows proper profile. add hover persistence --- src/kiri/init.js | 2 ++ src/kiri/main.js | 2 +- web/kiri/index.css | 4 ++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/kiri/init.js b/src/kiri/init.js index 483f260e..4168787e 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -2104,6 +2104,8 @@ UC.hoverPop(UI.scale, { group: hpops, target: $('pop-scale'), sticky: true }); UC.hoverPop(UI.nozzle, { group: hpops, target: $('pop-nozzle'), sticky: true }); UC.hoverPop($('app-acct'), { group: hpops, target: $('acct-pop') } ); + UC.hoverPop($('app-mode'), { group: hpops, target: $('mode-info') } ); + UC.hoverPop($('app-name'), { group: hpops, target: $('app-info') } ); UC.onBlur([ UI.toolName, diff --git a/src/kiri/main.js b/src/kiri/main.js index 2b7b6953..fba29862 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -1966,7 +1966,7 @@ } API.conf.save(); $('mode-device').innerText = settings.device.deviceName; - $('mode-profile').innerText = settings.process.processName; + $('mode-profile').innerText = settings.cproc[settings.mode]; } function saveSettings() { diff --git a/web/kiri/index.css b/web/kiri/index.css index b3a3662d..7b0c647f 100644 --- a/web/kiri/index.css +++ b/web/kiri/index.css @@ -269,7 +269,7 @@ th, tr, td, label { #app-mode, #app-acct { width: 125px; } -#app-mode:hover #mode-info { +#mode-info.hoverpop { display: flex; } #mode-info { @@ -295,7 +295,7 @@ th, tr, td, label { padding-right: 5px; } -#app-name:hover #app-info { +#app-info.hoverpop { display: flex; } #app-info { From eb7a35a9ea643fafdf2a6f1b716008c0b9051387 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 29 Jan 2021 13:12:35 -0500 Subject: [PATCH 050/255] flag mode info with * when profile has been modified from what was saved --- src/kiri/init.js | 2 ++ src/kiri/main.js | 28 +++++++++++++++++++++------- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/kiri/init.js b/src/kiri/init.js index 4168787e..5d66289c 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -640,10 +640,12 @@ if (name) { let np = pl[name] = {}; cp.processName = name; + pl[name] = Object.clone(cp); for (let k in cp) { if (!cp.hasOwnProperty(k)) continue; np[k] = cp[k]; } + s.cproc[mode] = name; s.devproc[s.device.deviceName] = name; API.conf.save(); API.conf.update(); diff --git a/src/kiri/main.js b/src/kiri/main.js index fba29862..351020c7 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -1950,23 +1950,37 @@ } function updateSettings(opt = {}) { - updateSettingsFromFields(settings.controller); - switch (settings.controller.units) { + let { controller, device, process, mode, sproc, cproc } = settings; + updateSettingsFromFields(controller); + switch (controller.units) { case 'mm': UC.setUnits(1); break; case 'in': UC.setUnits(25.4); break; } if (opt.controller) { return; } - updateSettingsFromFields(settings.device); - updateSettingsFromFields(settings.process); - let device = settings.device; + updateSettingsFromFields(device); + updateSettingsFromFields(process); if (device.extruders && device.extruders[device.internal]) { updateSettingsFromFields(device.extruders[device.internal]); } API.conf.save(); - $('mode-device').innerText = settings.device.deviceName; - $('mode-profile').innerText = settings.cproc[settings.mode]; + let current = process; + let compare = sproc[mode][cproc[mode]]; + let same = true; + for (let [key, val] of Object.entries(compare).filter(v => v[0] !== 'processName')) { + let tval = current[key]; + // outputLoopLayers misbehaving and setting null on empty + if (val === '' && tval == null) { + continue; + } + if (tval != val) { + // console.log(key, 'expected', val, 'got', tval); + same = false; + } + } + $('mode-device').innerText = device.deviceName; + $('mode-profile').innerText = `${cproc[mode]}${same ? '' : ' *'}`; } function saveSettings() { From 27c8d157dd4dcb304ad517c73fe1e383f4e0542a Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 29 Jan 2021 13:25:41 -0500 Subject: [PATCH 051/255] fix widget cache bug --- src/kiri/client.js | 13 ++++--------- src/mode/cam/driver.js | 2 +- src/mode/cam/ops.js | 2 +- 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/kiri/client.js b/src/kiri/client.js index 8d8068fa..d843b5ef 100644 --- a/src/kiri/client.js +++ b/src/kiri/client.js @@ -105,21 +105,16 @@ KIRI.work = { }, config: function(obj) { - send("config", obj, function(reply) { - // console.log({config:reply}); - }); + send("config", obj, function(reply) { }); }, clear: function(widget) { - send("clear", widget ? {id:widget.id} : {}, function(reply) { - syncd = {}; - }); + syncd = {}; + send("clear", widget ? {id:widget.id} : {}, function(reply) { }); }, snap: function(data) { - send("snap", data, function(reply) { - // console.log({snap:reply}) - }); + send("snap", data, function(reply) { }); }, // widget sync diff --git a/src/mode/cam/driver.js b/src/mode/cam/driver.js index 6c4a7263..27560cbe 100644 --- a/src/mode/cam/driver.js +++ b/src/mode/cam/driver.js @@ -42,7 +42,7 @@ if (KIRI.worker) KIRI.worker.cam_traces = function(data, send) { const { settings } = data; - const widgets = Object.values(cache); + const widgets = Object.values(wcache); const fresh = widgets.filter(widget => CAM.traces(settings, widget)); send.done(KIRI.codec.encode(fresh.map(widget => { return { id: widget.id, diff --git a/src/mode/cam/ops.js b/src/mode/cam/ops.js index 53ab28a1..a302f048 100644 --- a/src/mode/cam/ops.js +++ b/src/mode/cam/ops.js @@ -1096,7 +1096,7 @@ let terrain = slicer.slice(tzindex, { each: (data, index, total) => { tshadow = POLY.union(tshadow.slice().appendAll(data.tops), 0.01, true); tslices.push(data.slice); - if (true) { + if (false) { const slice = data.slice; sliceAll.push(slice); slice.output() From adbb3bb87eb7381dc174601d2488591001c6b8c9 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 29 Jan 2021 14:01:14 -0500 Subject: [PATCH 052/255] fix openok with open polys when bridging also enabled --- src/kiri/slicer2.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/kiri/slicer2.js b/src/kiri/slicer2.js index 814257ad..d06e308f 100644 --- a/src/kiri/slicer2.js +++ b/src/kiri/slicer2.js @@ -722,7 +722,11 @@ } } else { // no more closest polys (open set) - emit(BASE.newPolygon().addPoints(array)); + if (opt.openok) { + emit(BASE.newPolygon().addPoints(array).setOpen()); + } else { + emit(BASE.newPolygon().addPoints(array)); + } break loop; } } From d9065b58c99e4479d2e441580fc73591677c0d8d Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 29 Jan 2021 16:25:40 -0500 Subject: [PATCH 053/255] update notes --- notes.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/notes.md b/notes.md index dec822aa..ddb4e049 100644 --- a/notes.md +++ b/notes.md @@ -3,9 +3,7 @@ ## `C` cosmetic, `F` functional, `P` performance, `B` bug fix * `B` client/worker cache invalidated by latest rotation work -* `B` saved profile should be restored / defaulted when switching devices? * `B` normals possibly inverted on faces in 2D to 3D conversion -* `B` normalize left, bottom, right pop menu time/click and value persistence * `B` origin bug (Onshape?) when switching modes in 2.5 and 2.6 * `P` duplicate objects should share same slice data unless rotated or scaled @@ -24,20 +22,18 @@ * `B` fix support projection/end with grouped parts * `B` multi-extruder rendering of raft fails to offset the rest of the print * `B` multi-extruder purge blocks fail to generate properly for rafts +* `B` first layer support speed should be same as shell speed * `F` test outlining solid projected areas * `F` slicing controls per user-defined z-region * `F` control for size of purge block (with 0=disabled) -* `F` add separate fill speed control * `F` polishing and other non-planar work * `F` gradient infill https://www.youtube.com/watch?v=hq53gsYREHU&feature=emb_logo -* `F` first layer segment large flat areas for better fill reliability * `F` feather sharp tips by reducing extrusion in area of overlap +* `F` first layer segment large flat areas for better fill reliability * `F` enable purge blocks when quick layers are detected * `F` option to support interior bridges when 0% infill -* `F` trim support offset from layer below * `F` calculate filament use per extruder per print -* `F` first layer support speed should be same as shell speed * `F` apply finish speed to exposed top and underside flat areas * `F` expand internal supporting flats / solids before projection @@ -55,7 +51,7 @@ # FDM - BELT * `B` multiple parts with one angled against origin "floats" in preview -* `B` finish supports for belt printing. add progress. +* `B` re-add progress calls for all work units # CAM From c1be2953358e0d0248245447d8bb1237eabc734d Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 29 Jan 2021 17:57:40 -0500 Subject: [PATCH 054/255] fix trace:follow where offset produces > 1 polygon --- src/mode/cam/ops.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/mode/cam/ops.js b/src/mode/cam/ops.js index a302f048..a8e82d1a 100644 --- a/src/mode/cam/ops.js +++ b/src/mode/cam/ops.js @@ -771,19 +771,22 @@ case "inside": offdist = -toolDiam / 2; break; } if (offdist) { - let pnew = POLY.offset([poly], offdist)[0]; + let pnew = POLY.offset([poly], offdist); if (pnew) { - poly = pnew.setZ(poly.getZ()); + poly = POLY.setZ(pnew, poly.getZ()); } else { continue; } + } else { + poly = [ poly ]; } + for (let pi of poly) if (down) { - for (let z of BASE.util.lerp(zMax, poly.getZ(), down)) { - followZ(poly.clone().setZ(z)); + for (let z of BASE.util.lerp(zMax, pi.getZ(), down)) { + followZ(pi.clone().setZ(z)); } } else { - followZ(poly); + followZ(pi); } } break; From 0ddfdeb376ca35e0fcfb381c52b52ef1d3187e2e Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 29 Jan 2021 19:05:50 -0500 Subject: [PATCH 055/255] bump rev 2.6.D16 --- package.json | 2 +- src/kiri.js | 2 +- src/license.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index b6a86680..43152469 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grid-apps", - "version": "2.6.15D", + "version": "2.6.16D", "description": "grid.space 3d slice & modeling tools", "author": "Stewart Allen ", "license": "MIT", diff --git a/src/kiri.js b/src/kiri.js index cf1229b2..1f247a89 100644 --- a/src/kiri.js +++ b/src/kiri.js @@ -6,7 +6,7 @@ if (!self.kiri) { self.kiri = { - beta: 2615, + beta: 2616, driver: {}, // driver modules loader: [] // module loading: array of functions }; diff --git a/src/license.js b/src/license.js index 87211a52..856e033a 100644 --- a/src/license.js +++ b/src/license.js @@ -3,7 +3,7 @@ let terms = { COPYRIGHT: "Copyright (C) Stewart Allen - All Rights Reserved", LICENSE: "See the license.md file included with the source distribution", - VERSION: "2.6.D15" + VERSION: "2.6.D16" }; if (typeof(module) === 'object') { From 00ca621f4a10b58ef8b1304efca41634a09ec2b1 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 30 Jan 2021 11:46:31 -0500 Subject: [PATCH 056/255] maintain gcode header/footer padding with substitutions --- src/kiri/print.js | 5 ++++- src/mode/fdm/export.js | 20 ++++++++++++-------- web/kiri/index.css | 4 ++-- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/kiri/print.js b/src/kiri/print.js index 2543eba6..5f98da55 100644 --- a/src/kiri/print.js +++ b/src/kiri/print.js @@ -980,7 +980,7 @@ } } - function constReplace(str, consts, start) { + function constReplace(str, consts, start, pad) { let cs = str.indexOf("{", start || 0), ce = str.indexOf("}", cs), tok, nutok, nustr; @@ -992,6 +992,9 @@ constOp(tok, consts, "/", function(v1,v2) { return v1/v2 }) || constOp(tok, consts, "*", function(v1,v2) { return v1*v2 }) || consts[tok] || 0; + if (pad) { + nutok = nutok.toString().padEnd(ce-cs+1, ' '); + } nustr = str.replace("{"+tok+"}",nutok); return constReplace(nustr, consts, ce+1+(nustr.length-str.length)); } else { diff --git a/src/mode/fdm/export.js b/src/mode/fdm/export.js index 6ee04fe1..761cda6b 100644 --- a/src/mode/fdm/export.js +++ b/src/mode/fdm/export.js @@ -116,8 +116,12 @@ } }; - function appendSub(line) { - append(print.constReplace(line, subst)); + function appendSubPad(line, pad) { + appendSub(line, true); + } + + function appendSub(line, pad) { + append(print.constReplace(line, subst, 0, pad)); } function appendAll(arr) { @@ -126,10 +130,10 @@ arr.forEach(function(line) { append(line) }); } - function appendAllSub(arr) { + function appendAllSub(arr, pad) { if (!arr) return; if (!Array.isArray(arr)) arr = [ arr ]; - arr.forEach(function(line) { appendSub(line) }); + arr.forEach(function(line) { appendSub(line, pad) }); } append(`; Generated by Kiri:Moto ${KIRI.version}`); @@ -174,11 +178,11 @@ if (line.indexOf("{tool}") > 0 && extruders.length > 1) { for (let i=0; i Date: Sat, 30 Jan 2021 19:48:18 -0500 Subject: [PATCH 057/255] fix registration depth for anchor and widget / stock deltas --- src/mode/cam/client.js | 1 + src/mode/cam/ops.js | 12 ++++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/mode/cam/client.js b/src/mode/cam/client.js index 7fd97d3f..60afd537 100644 --- a/src/mode/cam/client.js +++ b/src/mode/cam/client.js @@ -544,6 +544,7 @@ } let areas = (poppedRec.areas[widget.id] || []); let stack = new KIRI.Stack(widget.mesh); + // console.log({match: areas, for: widget.id}); widget.trace_stack = stack; widget.traces.forEach(poly => { let match = areas.filter(arr => poly.matches(arr)); diff --git a/src/mode/cam/ops.js b/src/mode/cam/ops.js index a8e82d1a..331d1e0f 100644 --- a/src/mode/cam/ops.js +++ b/src/mode/cam/ops.js @@ -907,6 +907,7 @@ updateToolDiams(tool.fluteDiameter()); let { stock } = settings, + tz = widget.track.pos.z, lx = bounds.min.x, hx = bounds.max.x, ly = bounds.min.y, @@ -918,7 +919,10 @@ dx = (stock.x - (hx - lx)) / 4, dy = (stock.y - (hy - ly)) / 4, dz = stock.z, - points = []; + points = [], + wo = stock.z - bounds.max.z, + z1 = bounds.max.z + wo + tz, + z2 = tz - mz; if (!(stock.x && stock.y && stock.z)) { return; @@ -972,7 +976,7 @@ tv = -tv; } } - for (let z of BASE.util.lerp(zMax, -zThru, op.down)) { + for (let z of BASE.util.lerp(z1, z2, op.down)) { let slice = newSlice(z); sliceAll.push(slice); sliceOut.push(slice); @@ -1008,8 +1012,8 @@ let slice = newSlice(0,null), polys = []; points.forEach(point => { polys.push(newPolygon() - .append(point.clone().setZ(bounds.max.z)) - .append(point.clone().setZ(bounds.max.z - stock.z - mz))); + .append(point.clone().setZ(z1)) + .append(point.clone().setZ(z2))); }); slice.camLines = polys; slice.output() From e1ed1b93b6221a1b3ebbb638f3b80daf03dfe88f Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 30 Jan 2021 20:50:14 -0500 Subject: [PATCH 058/255] discrete widget state dirtying in belt / slice. fix op:trace unselect on modified --- src/kiri/client.js | 6 +++++- src/kiri/main.js | 1 - src/mode/cam/client.js | 7 +++---- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/kiri/client.js b/src/kiri/client.js index d843b5ef..a7427c1d 100644 --- a/src/kiri/client.js +++ b/src/kiri/client.js @@ -167,10 +167,14 @@ KIRI.work = { id: widget.id, settings: settings }, function(reply) { + callback(reply); if (reply.done || reply.error) { delete slicing[widget.id]; + // in belt mode, slicing modifies a widget and requires re-sync + if (settings.device.bedBelt) { + widget.modified = true; + } } - callback(reply); }); }, diff --git a/src/kiri/main.js b/src/kiri/main.js index 351020c7..f3485593 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -869,7 +869,6 @@ setOpacity(color.slicing_opacity); STACKS.clear(); - KIRI.client.clear(); KIRI.client.sync(); KIRI.client.rotate(settings); diff --git a/src/mode/cam/client.js b/src/mode/cam/client.js index 60afd537..84e24f68 100644 --- a/src/mode/cam/client.js +++ b/src/mode/cam/client.js @@ -534,7 +534,7 @@ KIRI.api.widgets.opacity(0.8); KIRI.api.widgets.for(widget => { if (ids.indexOf(widget.id) >= 0) { - unselectTraces(widget); + unselectTraces(widget, true); widget.trace_stack = null; } if (widget.trace_stack) { @@ -544,7 +544,6 @@ } let areas = (poppedRec.areas[widget.id] || []); let stack = new KIRI.Stack(widget.mesh); - // console.log({match: areas, for: widget.id}); widget.trace_stack = stack; widget.traces.forEach(poly => { let match = areas.filter(arr => poly.matches(arr)); @@ -1045,11 +1044,11 @@ } } - function unselectTraces(widget) { + function unselectTraces(widget, skip) { if (widget.trace_stack) { widget.trace_stack.meshes.forEach(mesh => { if (mesh.selected) { - func.traceToggle(mesh); + func.traceToggle(mesh, skip); } }); } From 4606a35abc773b2b6ad069170573c2e43b1441c3 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 30 Jan 2021 21:11:59 -0500 Subject: [PATCH 059/255] start new dev series --- package.json | 2 +- src/kiri.js | 2 +- src/license.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 43152469..2bb4cca2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grid-apps", - "version": "2.6.16D", + "version": "2.7.0D", "description": "grid.space 3d slice & modeling tools", "author": "Stewart Allen ", "license": "MIT", diff --git a/src/kiri.js b/src/kiri.js index 1f247a89..4da40355 100644 --- a/src/kiri.js +++ b/src/kiri.js @@ -6,7 +6,7 @@ if (!self.kiri) { self.kiri = { - beta: 2616, + beta: 2700, driver: {}, // driver modules loader: [] // module loading: array of functions }; diff --git a/src/license.js b/src/license.js index 856e033a..16f9176d 100644 --- a/src/license.js +++ b/src/license.js @@ -3,7 +3,7 @@ let terms = { COPYRIGHT: "Copyright (C) Stewart Allen - All Rights Reserved", LICENSE: "See the license.md file included with the source distribution", - VERSION: "2.6.D16" + VERSION: "2.7.D0" }; if (typeof(module) === 'object') { From 96f62fe4391739b77b0ab65510c8d5894ab6c335 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 31 Jan 2021 12:46:03 -0500 Subject: [PATCH 060/255] swap wiki for docs.grid.space --- web/kiri/lang/en-help.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/kiri/lang/en-help.html b/web/kiri/lang/en-help.html index 7bf9e672..0b7bcef1 100644 --- a/web/kiri/lang/en-help.html +++ b/web/kiri/lang/en-help.html @@ -145,12 +145,12 @@
Resources In-App Options

From f7b00af7d923cf4cf0195ae1d96c4333b615da80 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 1 Feb 2021 01:41:59 -0500 Subject: [PATCH 061/255] fix multi-widget offset in prepare --- src/mode/cam/prepare.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mode/cam/prepare.js b/src/mode/cam/prepare.js index ece67c60..b4fc4b3a 100644 --- a/src/mode/cam/prepare.js +++ b/src/mode/cam/prepare.js @@ -69,7 +69,7 @@ boundsz = bounds.max.z + ztOff, zadd = hasStock ? stock.z - boundsz : alignTop ? outerz - boundsz : 0, zmax = outerz + zclear, - wmpos = widget.mesh.position, + wmpos = widget.track.pos, wmx = wmpos.x, wmy = wmpos.y, originx = startCenter ? 0 : hasStock ? -stock.x / 2 : bounds.min.x, From bab0a13a1423424975a048d73c5f4f7cef80fded Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 1 Feb 2021 16:39:22 -0500 Subject: [PATCH 062/255] stub in zip library --- app.js | 1 + package.json | 1 + src/ext/jszip.js | 1 + src/kiri/client.js | 10 +++++++++- src/kiri/worker.js | 18 ++++++++++++++++++ src/mode/cam/ops.js | 2 +- 6 files changed, 31 insertions(+), 2 deletions(-) create mode 120000 src/ext/jszip.js diff --git a/app.js b/app.js index 9fb6ef11..461487ac 100644 --- a/app.js +++ b/app.js @@ -299,6 +299,7 @@ const script = { "kiri", "ext/three", "ext/pngjs", + "ext/jszip", "license", "ext/clip2", "ext/earcut", diff --git a/package.json b/package.json index 2bb4cca2..6153cbe0 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "connect": "^3.7.0", "earcut": "^2.2.2", "express-useragent": "^1.0.13", + "jszip": "^3.5.0", "level": "^6.0.1", "leveldown": "^5.6.0", "levelup": "^4.4.0", diff --git a/src/ext/jszip.js b/src/ext/jszip.js new file mode 120000 index 00000000..aa70f346 --- /dev/null +++ b/src/ext/jszip.js @@ -0,0 +1 @@ +../../node_modules/jszip/dist/jszip.js \ No newline at end of file diff --git a/src/kiri/client.js b/src/kiri/client.js index a7427c1d..9a60e029 100644 --- a/src/kiri/client.js +++ b/src/kiri/client.js @@ -15,7 +15,9 @@ let KIRI = self.kiri = self.kiri || {}, syncd = {}, running = {}, slicing = {}, - worker = null; + worker = null + // occ = new Worker("/kiri/ext/occ-worker.js", {type:"module"}), + ; /** * @param {Function} fn name of function in KIRI.worker @@ -243,6 +245,12 @@ KIRI.work = { output(reply.done); } }, [ data.png ]); + }, + + zip: function(files) { + send("zip", {files}, reply => { + console.log({zip_said: reply}); + }); } }; diff --git a/src/kiri/worker.js b/src/kiri/worker.js index 89a8ce49..da70b9e4 100644 --- a/src/kiri/worker.js +++ b/src/kiri/worker.js @@ -536,6 +536,24 @@ KIRI.worker = { // send.done({done: {verts, faces, bigv, vi, ii}}, [ bigv.buffer ]); send.done({done: {bigv}}, [ bigv.buffer ]); }); + }, + + zip: function(data, send) { + let { files } = data; + let zip = new JSZip(); + for (let file of files) { + zip.file(file.name, file.data); + } + zip.generateAsync({ + type: "uint8array", + compression: "DEFLATE", + compressionOptions: { level: 3 }, + streamFiles: true + }, progress => { + send.data(progress); + }).then(output => { + send.done(output); + }); } }; diff --git a/src/mode/cam/ops.js b/src/mode/cam/ops.js index 331d1e0f..69434c45 100644 --- a/src/mode/cam/ops.js +++ b/src/mode/cam/ops.js @@ -405,7 +405,7 @@ indices = indices.appendAll(flats).sort((a,b) => b-a); // console.log('indices', ...indices, {zBottom, slicer}); if (op.outside && !op.inside) { - console.log({outline_bypass: indices, down: op.down}); + // console.log({outline_bypass: indices, down: op.down}); indices.forEach((ind,i) => { if (flats.indexOf(ind) >= 0) { // exclude flats From b9b99f18a9877c1a437166865ed1bdb668540f34 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 1 Feb 2021 17:13:55 -0500 Subject: [PATCH 063/255] connect zip client progress and output --- src/kiri/client.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/kiri/client.js b/src/kiri/client.js index 9a60e029..50db4f06 100644 --- a/src/kiri/client.js +++ b/src/kiri/client.js @@ -247,9 +247,13 @@ KIRI.work = { }, [ data.png ]); }, - zip: function(files) { + zip: function(files, progress, output) { send("zip", {files}, reply => { - console.log({zip_said: reply}); + if (reply.percent) { + progress(reply); + } else { + output(reply); + } }); } }; From a74de9b8fd18d0c1fcdd2d083f9890d3d9797fd0 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 1 Feb 2021 17:44:25 -0500 Subject: [PATCH 064/255] fix 0 percent --- src/kiri/client.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kiri/client.js b/src/kiri/client.js index 50db4f06..9dd2af07 100644 --- a/src/kiri/client.js +++ b/src/kiri/client.js @@ -249,7 +249,7 @@ KIRI.work = { zip: function(files, progress, output) { send("zip", {files}, reply => { - if (reply.percent) { + if (reply.percent !== undefined) { progress(reply); } else { output(reply); From eedf8860cab94fe65414ef1e89e7df0d38d149fc Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Tue, 2 Feb 2021 11:11:14 -0500 Subject: [PATCH 065/255] replace feature.preview with feature.work_alerts --- src/kiri/export.js | 2 +- src/kiri/main.js | 32 +++++++++++++++----------------- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/src/kiri/export.js b/src/kiri/export.js index c87a673f..a2e047e0 100644 --- a/src/kiri/export.js +++ b/src/kiri/export.js @@ -31,7 +31,7 @@ } function callExport(callback, mode) { - let alert = API.show.alert("Exporting"); + let alert = API.feature.work_alerts ? API.show.alert("Exporting") : null; const gcode = []; KIRI.client.export(API.conf.get(), (line) => { gcode.push(line); diff --git a/src/kiri/main.js b/src/kiri/main.js index f3485593..ad8f4ced 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -69,7 +69,7 @@ controls: true, // show or not side menus drop_group: undefined, // optional array to group multi drop drop_layout: true, // layout on new drop - preview: true, // allow bypassing preview generation + work_alerts: true, // allow disabling work progress alerts hover: false, // when true fires mouse hover events hoverAdds: false, // when true only searches widget additions }; @@ -533,7 +533,7 @@ } function alert2(message, time) { - if (message === undefined) { + if (message === undefined || message === null) { return updateAlerts(true); } let rec = [message, Date.now(), time, true]; @@ -543,8 +543,10 @@ } function alert2cancel(rec) { - rec[3] = false; - updateAlerts(); + if (Array.isArray(rec)) { + rec[3] = false; + updateAlerts(); + } } function updateAlerts(clear) { @@ -898,7 +900,7 @@ } // on the last exit, update ui and call the callback if (--countdown === 0 || error || errored) { - let alert = scale === 1 ? API.show.alert("Rendering") : null; + let alert = scale === 1 && feature.work_alerts ? API.show.alert("Rendering") : null; KIRI.client.unrotate(settings, () => { forAllWidgets(widget => { // on done @@ -978,9 +980,7 @@ let isCam = MODE === MODES.CAM, pMode = getMode(); - if (feature.preview) { - setViewMode(VIEWS.PREVIEW); - } + setViewMode(VIEWS.PREVIEW); API.conf.save(); API.event.emit('preview.begin', pMode); @@ -989,7 +989,7 @@ forAllWidgets(function(widget) { widget.setColor(color.cam_preview); }); - } else if (feature.preview && offset === 0) { + } else if (offset === 0) { setOpacity(color.preview_opacity); } @@ -1021,8 +1021,8 @@ API.show.progress(0); if (!isCam) setOpacity(0); - if (feature.preview && output.length) { - let alert = API.show.alert("Rendering") + if (output.length) { + let alert = feature.work_alerts ? API.show.alert("Rendering") : null; startTime = Date.now(); STACKS.clear(); const stack = STACKS.create('print', SPACE.platform.world) @@ -1047,12 +1047,10 @@ API.event.emit('print', pMode); API.event.emit('preview.end', pMode); - if (feature.preview) { - SPACE.update(); - updateSliderMax(true); - setVisibleLayer(-1, 0); - updateSpeeds(maxSpeed); - } + SPACE.update(); + updateSliderMax(true); + setVisibleLayer(-1, 0); + updateSpeeds(maxSpeed); // mark preview complete for export complete.preview = true; From b5842ed4d0d8956b0684d307d26fcc7094c6f3f4 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Tue, 2 Feb 2021 11:46:48 -0500 Subject: [PATCH 066/255] fix cancel slicing cleanup --- src/kiri/main.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/kiri/main.js b/src/kiri/main.js index ad8f4ced..faf632e3 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -898,9 +898,12 @@ } API.event.emit('slice', getMode()); } + let alert = null; // on the last exit, update ui and call the callback if (--countdown === 0 || error || errored) { - let alert = scale === 1 && feature.work_alerts ? API.show.alert("Rendering") : null; + if (scale === 1 && feature.work_alerts) { + alert = API.show.alert("Rendering"); + }; KIRI.client.unrotate(settings, () => { forAllWidgets(widget => { // on done @@ -936,11 +939,13 @@ } // handle slicing errors if (error && !errored) { + API.show.progress(0); + API.hide.alert(alert); errored = true; setViewMode(VIEWS.ARRANGE); setOpacity(color.model_opacity); platform.deselect(); - alert2(error); + alert2(error, 1); } }, function(update, msg) { if (msg && msg !== lastMsg) { From 00d7ffec121f073683621dbacb7c3b12974daa55 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Wed, 3 Feb 2021 20:52:25 -0500 Subject: [PATCH 067/255] add more robust error handling for worker tasks --- notes.md | 2 +- src/kiri/client.js | 12 ++++-- src/kiri/export.js | 22 ++++++++--- src/kiri/main.js | 42 ++++++++++++++------- src/kiri/worker.js | 84 ++++++++++++++++++++--------------------- src/mode/fdm/prepare.js | 1 - web/kiri/index.html | 2 +- 7 files changed, 97 insertions(+), 68 deletions(-) diff --git a/notes.md b/notes.md index ddb4e049..f0f6d97d 100644 --- a/notes.md +++ b/notes.md @@ -62,11 +62,11 @@ * `B` clicking on a pop-op should pin it until clicked or [esc] * `B` need to force cut line at synthetic z bottom (midlines, etc) * `B` non-clear-voids duplicates thru-holes -* `B` failure to go *up* when moving between parts? * `B` starting export during animation unleashes chaos * `B` climb vs conventional not fully consistent after refactor * `B` outside cutting direction in roughing mode inverted +* `F` import SVG into a path that can be overlaid onto a 3D mesh (laser?) * `F` intelligently turn circle hole pocket clear into spiral down * `F` trace follow hole that matches endmill should turn into a drill op * `F` add climb/conventional into each operation diff --git a/src/kiri/client.js b/src/kiri/client.js index 9dd2af07..7f6a660b 100644 --- a/src/kiri/client.js +++ b/src/kiri/client.js @@ -70,9 +70,9 @@ KIRI.work = { worker.terminate(); } - for (let key in slicing) { - slicing[key]({error: "cancelled slicing"}); - } + // for (let key in slicing) { + // slicing[key]({error: "cancelled slicing"}); + // } syncd = {}; slicing = {}; @@ -188,6 +188,9 @@ KIRI.work = { if (reply.done) { done(reply.output, reply.maxSpeed); } + if (reply.error) { + done(reply); + } }); }, @@ -199,6 +202,9 @@ KIRI.work = { if (reply.done) { ondone(reply.output); } + if (reply.error) { + ondone(null, reply.error); + } }); }, diff --git a/src/kiri/export.js b/src/kiri/export.js index a2e047e0..ebecd552 100644 --- a/src/kiri/export.js +++ b/src/kiri/export.js @@ -35,9 +35,11 @@ const gcode = []; KIRI.client.export(API.conf.get(), (line) => { gcode.push(line); - }, (output) => { + }, (output, error) => { API.hide.alert(alert); - if (callback) { + if (error) { + API.show.alert(error, 5); + } else if (callback) { callback(gcode.join('\r\n'), output); } else { exportGCodeDialog(gcode.join('\r\n'), output); @@ -48,8 +50,12 @@ function callExportLaser(options) { KIRI.client.export(API.conf.get(), (line) => { console.log({unexpected_line: line}); - }, (output) => { - exportLaserDialog(output); + }, (output, error) => { + if (error) { + API.show.alert(error, 5); + } else { + exportLaserDialog(output); + } }); } @@ -60,9 +66,13 @@ if (line.data) { preview.push(line.data); } - }, (output) => { + }, (output, error) => { API.show.progress(0); - KIRI.driver.SLA.printDownload(preview, output, API); + if (error) { + API.show.alert(error, 5); + } else { + KIRI.driver.SLA.printDownload(preview, output, API); + } }); } diff --git a/src/kiri/main.js b/src/kiri/main.js index faf632e3..faa320a6 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -898,9 +898,22 @@ } API.event.emit('slice', getMode()); } + // handle slicing errors + if (error && !errored) { + errored = true; + setViewMode(VIEWS.ARRANGE); + alert2(error, 5); + API.show.progress(0); + KIRI.client.restart(); + API.event.emit('slice.error', error); + } + // discard remaining errors + if (errored) { + return; + } let alert = null; // on the last exit, update ui and call the callback - if (--countdown === 0 || error || errored) { + if (--countdown === 0) { if (scale === 1 && feature.work_alerts) { alert = API.show.alert("Rendering"); }; @@ -923,12 +936,13 @@ updateSliderMax(true); setVisibleLayer(-1, 0); }); - // mark slicing complete for prep/preview - complete.slice = true; if (scale === 1) { API.show.progress(0); } + // cause visuals to update SPACE.scene.active(); + // mark slicing complete for prep/preview + complete.slice = true; API.event.emit('slice.end', getMode()); // print stats segtimes.total = Date.now() - now; @@ -937,16 +951,6 @@ callback(); } } - // handle slicing errors - if (error && !errored) { - API.show.progress(0); - API.hide.alert(alert); - errored = true; - setViewMode(VIEWS.ARRANGE); - setOpacity(color.model_opacity); - platform.deselect(); - alert2(error, 1); - } }, function(update, msg) { if (msg && msg !== lastMsg) { let mark = Date.now(); @@ -1018,7 +1022,17 @@ startTime = mark; } API.show.progress(offset + progress * scale, message); - }, function (oldout, maxSpeed) { + }, function (reply, maxSpeed) { + // handle worker errors + if (reply && reply.error) { + alert2(reply.error, 5); + setViewMode(VIEWS.ARRANGE); + API.event.emit('preview.error', reply.error); + API.show.progress(0); + SPACE.update(); + return; + } + if (lastMsg) { segtimes[`${segNumber++}_${lastMsg}`] = Date.now() - startTime; } diff --git a/src/kiri/worker.js b/src/kiri/worker.js index da70b9e4..77c363d8 100644 --- a/src/kiri/worker.js +++ b/src/kiri/worker.js @@ -159,35 +159,30 @@ KIRI.worker = { last = time(), now; - try { - widget.slice(settings, function(error) { - if (error) { - send.data({error: error}); - } else { - const slices = widget.slices || []; - send.data({send_start: time()}); - send.data({ - stats: widget.stats, - slices: slices.length, - }); - slices.forEach(function(slice,index) { - const state = { zeros: [] }; - send.data({index: index, slice: slice.encode(state)}, state.zeros); - }) - send.data({send_end: time()}); - } - send.done({done: true}); - }, function(update, msg) { - now = time(); - if (now - last < 10 && update < 0.99) return; - // on update - send.data({update: (0.05 + update * 0.95), updateStatus: msg}); - last = now; - }); - } catch (error) { - send.data({error: error.toString()}); - console.log(error); - } + widget.slice(settings, function(error) { + if (error) { + send.data({error: error}); + } else { + const slices = widget.slices || []; + send.data({send_start: time()}); + send.data({ + stats: widget.stats, + slices: slices.length, + }); + slices.forEach(function(slice,index) { + const state = { zeros: [] }; + send.data({index: index, slice: slice.encode(state)}, state.zeros); + }) + send.data({send_end: time()}); + } + send.done({done: true}); + }, function(update, msg) { + now = time(); + if (now - last < 10 && update < 0.99) return; + // on update + send.data({update: (0.05 + update * 0.95), updateStatus: msg}); + last = now; + }); }, prepare: function(data, send) { @@ -593,20 +588,25 @@ self.onmessage = function(e) { }; if (run) { - let time_xfer = (time_recv - msg.time), - output = run(msg.data, send), - time_send = time(), - time_proc = time_send - time_recv; + try { + let time_xfer = (time_recv - msg.time), + output = run(msg.data, send), + time_send = time(), + time_proc = time_send - time_recv; - if (output) self.postMessage({ - seq: msg.seq, - task: msg.task, - time_send: time_xfer, - time_proc: time_proc, - // replaced on reply side - time_recv: time(), - data: output - }); + if (output) self.postMessage({ + seq: msg.seq, + task: msg.task, + time_send: time_xfer, + time_proc: time_proc, + // replaced on reply side + time_recv: time(), + data: output + }); + } catch (wrkerr) { + console.log({wrkerr}); + send.done({error: wrkerr.toString()}); + } } else { console.log({kiri_msg:e}); } diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index 7382caf2..2366ed00 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -20,7 +20,6 @@ */ FDM.prepare = function(widgets, settings, update) { settings = FDM.fixExtruders(settings); - let render = settings.render !== false, { device, process, controller, bounds, mode } = settings, output = [], diff --git a/web/kiri/index.html b/web/kiri/index.html index ef601e46..502dfc1a 100644 --- a/web/kiri/index.html +++ b/web/kiri/index.html @@ -3,7 +3,7 @@ - + From 3662f9b50ca01ea6b3fe5e5715f1659940c73841 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 4 Feb 2021 17:35:41 -0500 Subject: [PATCH 068/255] rename short poly to short path. add circle center functions --- notes.md | 1 + src/geo/base.js | 56 +++++++++++++++++++++++++++++++++++++++++++++ src/kiri/init.js | 2 +- web/kiri/lang/en.js | 2 +- 4 files changed, 59 insertions(+), 2 deletions(-) diff --git a/notes.md b/notes.md index f0f6d97d..ce96bf83 100644 --- a/notes.md +++ b/notes.md @@ -12,6 +12,7 @@ * `P` client/worker interface normalization * `P` explore widget vertex reloading / replacing (Onshape primarily) +* `F` G2/G3 arc output / input * `F` expose grouping feature * `F` SVG import to 3D part like images * `F` bundle current profile into exported device diff --git a/src/geo/base.js b/src/geo/base.js index 213b8689..50a5bd46 100644 --- a/src/geo/base.js +++ b/src/geo/base.js @@ -316,6 +316,60 @@ return (d2y * d1x) - (d2x * d1y); } + /** + * return circle center given three points + * from https://math.stackexchange.com/questions/1076177/3d-coordinates-of-circle-center-given-three-point-on-the-circle + */ + function center3d(a,b,c) { + let ax = a.x, + ay = a.y, + az = a.z || 0, + bx = b.x, + by = b.y, + bz = b.z || 0, + cx = c.x, + cy = c.y, + cz = c.z || 0, + Cx = bx-ax, + Cy = by-ay, + Cz = bz-az, + Bx = cx-ax, + By = cy-ay, + Bz = cz-az, + B2 = (ax*ax)-(cx*cx)+(ay*ay)-(cy*cy)+(az*az)-(cz*cz), + C2 = (ax*ax)-(bx*bx)+(ay*ay)-(by*by)+(az*az)-(bz*bz), + CByz = Cy*Bz-Cz*By, + CBxz = Cx*Bz-Cz*Bx, + CBxy = Cx*By-Cy*Bx, + ZZ1 = -(Bz-Cz*Bx/Cx)/(By-Cy*Bx/Cx), + Z01 = -(B2-Bx/Cx*C2)/(2*(By-Cy*Bx/Cx)), + ZZ2 = -(ZZ1*Cy+Cz)/Cx, + Z02 = -(2*Z01*Cy+C2)/(2*Cx), + dz = -((Z02-ax)*CByz-(Z01-ay)*CBxz-az*CBxy)/(ZZ2*CByz-ZZ1*CBxz+CBxy), + dx = ZZ2*dz + Z02, + dy = ZZ1*dz + Z01; + + return {x:dx, y:dy, z:dz}; + } + + /** + * return circle center given three points + * from https://stackoverflow.com/questions/4103405/what-is-the-algorithm-for-finding-the-center-of-a-circle-from-three-points + */ + function center2d(A,B,C) { + let yDelta_a = B.y - A.y, + xDelta_a = B.x - A.x, + yDelta_b = C.y - B.y, + xDelta_b = C.x - B.x, + aSlope = yDelta_a/xDelta_a, + bSlope = yDelta_b/xDelta_b, + center = {x:0, y:0, z:0}; + center.x = (aSlope*bSlope*(A.y - C.y) + bSlope*(A.x + B.x) - aSlope*(B.x+C.x) )/(2* (bSlope-aSlope) ); + center.y = -1*(center.x - (A.x+B.x)/2)/aSlope + (A.y+B.y)/2; + + return center; + } + /** ****************************************************************** * Connect to base ******************************************************************* */ @@ -399,6 +453,8 @@ time, round, area2, + center2d, + center3d, distSq : dist2, distSqv2 : dist2v2, inRange, diff --git a/src/kiri/init.js b/src/kiri/init.js index 5d66289c..da7b66db 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -1779,8 +1779,8 @@ // outputWipeDistance: UC.newInput("wipe", {title:"non-printing move at\close of polygon\nin millimeters", bound:UC.bound(0.0,10), convert:UC.toFloat, modes:FDM}), sliceSolidMinArea: UC.newInput(LANG.ad_msol_s, {title:LANG.ad_msol_l, convert:UC.toFloat, modes:FDM}), outputMinSpeed: UC.newInput(LANG.ad_mins_s, {title:LANG.ad_mins_l, bound:UC.bound(5,200), convert:UC.toFloat, modes:FDM}), - outputCoastDist: UC.newInput(LANG.ad_scst_s, {title:LANG.ad_scst_l, bound:UC.bound(0.0,10), convert:UC.toFloat, modes:FDM}), outputShortPoly: UC.newInput(LANG.ad_spol_s, {title:LANG.ad_spol_l, bound:UC.bound(0,10000), convert:UC.toFloat, modes:FDM}), + outputCoastDist: UC.newInput(LANG.ad_scst_s, {title:LANG.ad_scst_l, bound:UC.bound(0.0,10), convert:UC.toFloat, modes:FDM}), fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}), zHopDistance: UC.newInput(LANG.ad_zhop_s, {title:LANG.ad_zhop_l, bound:UC.bound(0,3.0), convert:UC.toFloat, modes:FDM}), antiBacklash: UC.newInput(LANG.ad_abkl_s, {title:LANG.ad_abkl_l, bound:UC.bound(0,3), convert:UC.toInt, modes:FDM}), diff --git a/web/kiri/lang/en.js b/web/kiri/lang/en.js index d30028d2..4f8b06aa 100644 --- a/web/kiri/lang/en.js +++ b/web/kiri/lang/en.js @@ -481,7 +481,7 @@ kiri.lang['en-us'] = { ad_msol_l: "minimum area (mm^2)\nrequired to keep solid\nmust be > 0.1", ad_mins_s: "min speed", ad_mins_l: "minimum speed\nfor short segments", - ad_spol_s: "slow poly", + ad_spol_s: "short path", ad_spol_l: "polygons shorter than this\nwill have their print speed\nscaled down to min speed\nin millimeters", ad_zhop_s: "z hop dist", ad_zhop_l: "amount to raise z\non retraction moves\nin millimeters\n0 to disable", From b23a38ce8618a8538d9c64b8a22b04bdbcfcf1fc Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 4 Feb 2021 21:35:42 -0500 Subject: [PATCH 069/255] checkpoint arc generation on export --- src/geo/base.js | 8 ++- src/geo/polygon.js | 10 ++++ src/kiri/conf.js | 1 + src/kiri/init.js | 1 + src/kiri/print.js | 22 ++++++++ src/mode/fdm/export.js | 118 +++++++++++++++++++++++++++++++++++++++-- web/kiri/lang/en.js | 4 +- 7 files changed, 156 insertions(+), 8 deletions(-) diff --git a/src/geo/base.js b/src/geo/base.js index 50a5bd46..89ba5eb4 100644 --- a/src/geo/base.js +++ b/src/geo/base.js @@ -356,7 +356,7 @@ * return circle center given three points * from https://stackoverflow.com/questions/4103405/what-is-the-algorithm-for-finding-the-center-of-a-circle-from-three-points */ - function center2d(A,B,C) { + function center2d(A,B,C,rad) { let yDelta_a = B.y - A.y, xDelta_a = B.x - A.x, yDelta_b = C.y - B.y, @@ -366,7 +366,11 @@ center = {x:0, y:0, z:0}; center.x = (aSlope*bSlope*(A.y - C.y) + bSlope*(A.x + B.x) - aSlope*(B.x+C.x) )/(2* (bSlope-aSlope) ); center.y = -1*(center.x - (A.x+B.x)/2)/aSlope + (A.y+B.y)/2; - + if (rad) { + let dx = center.x - A.x; + let dy = center.y - A.y; + center.r = Math.sqrt(dx*dx + dy*dy) + } return center; } diff --git a/src/geo/polygon.js b/src/geo/polygon.js index 402ad5bd..3235eb34 100644 --- a/src/geo/polygon.js +++ b/src/geo/polygon.js @@ -666,6 +666,16 @@ return this; }; + PRO.addObj = function(obj) { + if (Array.isArray(obj)) { + for (let o of obj) { + this.addObj(o); + } + return this; + } + return this.add(obj.x, obj.y, obj.z); + } + /** * append array of points to polygon and return polygon * diff --git a/src/kiri/conf.js b/src/kiri/conf.js index 6f42544c..66e62b76 100644 --- a/src/kiri/conf.js +++ b/src/kiri/conf.js @@ -343,6 +343,7 @@ sliceMinHeight: 0, sliceAdaptive: false, zHopDistance: 0.2, + arcTolerance: 0, antiBacklash: 1, gcodePause: "" } diff --git a/src/kiri/init.js b/src/kiri/init.js index da7b66db..31fa8c3b 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -1783,6 +1783,7 @@ outputCoastDist: UC.newInput(LANG.ad_scst_s, {title:LANG.ad_scst_l, bound:UC.bound(0.0,10), convert:UC.toFloat, modes:FDM}), fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}), zHopDistance: UC.newInput(LANG.ad_zhop_s, {title:LANG.ad_zhop_l, bound:UC.bound(0,3.0), convert:UC.toFloat, modes:FDM}), + arcTolerance: UC.newInput(LANG.ad_arct_s, {title:LANG.ad_arct_l, bound:UC.bound(0,1.0), convert:UC.toFloat, modes:FDM, show:isNotBelt}), antiBacklash: UC.newInput(LANG.ad_abkl_s, {title:LANG.ad_abkl_l, bound:UC.bound(0,3), convert:UC.toInt, modes:FDM}), fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}), gcodePauseLayers: UC.newInput(LANG.ag_paws_s, {title:LANG.ag_paws_l, modes:FDM, comma:true}), diff --git a/src/kiri/print.js b/src/kiri/print.js index 5f98da55..64ce8bf8 100644 --- a/src/kiri/print.js +++ b/src/kiri/print.js @@ -139,6 +139,20 @@ const beltaxis = { X: "X", Y: "Z", Z: "Y", E: "E", F: "F" }; const beltfact = Math.cos(Math.PI/4); + function G2G3(g2, line) { + const rec = {}; + + line.forEach(function(tok) { + rec[tok.charAt(0)] = parseFloat(tok.substring(1)); + }); + + console.log({g2, arc: line, pos}); + + pos.X = rec.X; + pos.Y = rec.Y; + pos.Z = rec.Z; + } + function G0G1(g0, line) { const mov = {}; @@ -284,6 +298,14 @@ case 'G1': G0G1(false, line); break; + case 'G2': + // turn arc into a series of points + G2G3(true, line) + break; + case 'G3': + // turn arc into a series of points + G2G3(false, line); + break; case 'M6': tool = parseInt(line[0].substring(1)); break; diff --git a/src/mode/fdm/export.js b/src/mode/fdm/export.js index 761cda6b..e49ce98e 100644 --- a/src/mode/fdm/export.js +++ b/src/mode/fdm/export.js @@ -33,7 +33,7 @@ pause = [], pauseCmd = device.gcodePause, output = [], - outputLength = 0, + outputLength = 0, // absolute extruder position lastProgress = 0, decimals = BASE.config.gcode_decimals || 4, progress = 0, @@ -50,6 +50,7 @@ retSpeed = process.outputRetractSpeed * 60, retDwell = process.outputRetractDwell || 0, timeDwell = retDwell / 1000, + arcDist = isBelt ? 0 : (process.arcTolerance || 0), originCenter = process.outputOriginCenter, offset = originCenter ? null : { x: device.bedWidth/2, @@ -80,7 +81,9 @@ bcos = Math.cos(Math.PI/4), icos = 1 / bcos, loops = process.outputLoopLayers, - inLoop; + inLoop, + arcAt, + arcQ = []; if (isBelt && loops) { loops = loops.split(',').map(range => { @@ -392,6 +395,7 @@ // re-engage post-retraction before new extrusion if (out.emit && retracted) { + drainQ(); // console.log({engage:zhop}); // when enabled, resume previous Z if (zhop && pos.z != zpos) moveTo({z:zpos}, seekMMM, "z-hop end"); @@ -404,10 +408,58 @@ } if (lastp && out.emit) { - emitMM = emitPerMM * out.emit * dist; - moveTo({x:x, y:y, e:emitMM}, speedMMM); - emitted += emitMM; + if (arcDist) { + let rec = {e:out.emit, x, y, z, dist, emitPerMM, speedMMM}; + arcQ.push(rec); + let deem = false; + let depm = false; + let desp = false; + if (arcQ.length > 1) { + deem = arcQ[0].e !== rec.e; + depm = arcQ[0].emitPerMM !== rec.emitPerMM; + desp = arcQ[0].speedMMM !== rec.speedMMM; + } + if (arcQ.length > 2) { + let el = arcQ.length; + let e1 = arcQ[el-3]; + let e2 = arcQ[el-2]; + let e3 = arcQ[el-1]; + let cc = BASE.util.center2d(e1, e2, e3, 1); + let dc = 0; + if (arcQ.length === 3) { + arcQ.center = [ cc ]; + } else { + // check center point delta + let dx = cc.x - arcQ.center[0].x; + let dy = cc.y - arcQ.center[0].y; + dc = Math.sqrt(dx * dx + dy * dy); + } + // if new point is off the arc + if (deem || depm || desp || dc > arcDist) { + // console.log({dc, depm, desp}); + if (arcQ.length === 4) { + // not enough points for an arc, drop first point and recalc center + emitQrec(arcQ.shift()); + arcQ.center = [ BASE.util.center2d(arcQ[0], arcQ[1], arcQ[2], 1) ]; + } else { + // enough to consider an arc, emit and start new arc + let defer = arcQ.pop(); + drainQ(); + // re-add point that was off the last arc + arcQ.push(defer); + } + } else { + // new point is on the arc + arcQ.center.push(cc); + } + } + } else { + emitMM = emitPerMM * out.emit * dist; + moveTo({x:x, y:y, e:emitMM}, speedMMM); + emitted += emitMM; + } } else { + drainQ(); moveTo({x:x, y:y}, seekMMM); // TODO disabling out of plane z moves until a better mechanism // can be built that doesn't rely on computed zpos from layer heights... @@ -418,6 +470,7 @@ // retract filament if point retract flag set if (out.retract) { + drainQ(); retract(zhop); } @@ -437,6 +490,61 @@ } layer++; } + drainQ(); + + function emitQrec(rec) { + let {e, x, y, dist, emitPerMM, speedMMM} = rec; + emitMM = emitPerMM * e * dist; + moveTo({x:x, y:y, e:emitMM}, speedMMM); + emitted += emitMM; + } + + function drainQ() { + if (!arcDist) { + return; + } + if (arcQ.length > 4) { + let area = BASE.newPolygon().addObj(arcQ).area(); + let from = arcQ[0]; + let to = arcQ.peek(); + let cc = {x:0, y:0, z:0, r:0}; + let cl = arcQ.length; + for (let center of arcQ.center) { + cc.x += center.x; + cc.y += center.y; + cc.z += center.z; + cc.r += center.r; + } + cc.x /= cl; + cc.y /= cl; + cc.z /= cl; + cc.r /= cl; + // first arc point + emitQrec(from); + // rest of arc to final point + let dist = arcQ.slice(1).map(v => v.dist).reduce((a,v) => a+v); + let emit = from.e;//arcQ.slice(1).map(v => v.e).reduce((a,v) => a+v); + emit = (from.emitPerMM * emit * dist); + outputLength += emit; + emitted += emit; + if (extrudeAbs) { + emit = outputLength; + } + let gc = area > 0 ? 'G2' : 'G3'; + let pre = `${gc} X${to.x.toFixed(decimals)} Y${to.y.toFixed(decimals)} R${cc.r.toFixed(decimals)} E${emit.toFixed(decimals)}`; + let add = pos.f !== from.speedMMM ? ` E${from.speedMMM}` : ''; + append(`${pre}${add} ; merged=${cl-1} dist=${dist.toFixed(decimals)}`); + pos.x = to.x; + pos.y = to.y; + pos.z = to.z; + } else { + for (let rec of arcQ) { + emitQrec(rec); + } + } + arcQ.length = 0; + arcQ.center = undefined; + } if (inLoop) { append(`M808`); diff --git a/web/kiri/lang/en.js b/web/kiri/lang/en.js index 4f8b06aa..6422e69b 100644 --- a/web/kiri/lang/en.js +++ b/web/kiri/lang/en.js @@ -483,10 +483,12 @@ kiri.lang['en-us'] = { ad_mins_l: "minimum speed\nfor short segments", ad_spol_s: "short path", ad_spol_l: "polygons shorter than this\nwill have their print speed\nscaled down to min speed\nin millimeters", + ad_arct_s: "arc tolerance", + ad_arct_l: "convert faceted lines to arcs\ncenter point drift tolerance\nwhen matching arc points\nconsider values around 0.15\nin millimeters\n0 to disable", ad_zhop_s: "z hop dist", ad_zhop_l: "amount to raise z\non retraction moves\nin millimeters\n0 to disable", ad_abkl_s: "anti-backlash", - ad_abkl_l: "use micro-movements to cancel\nbacklash during fills\nin millimeters", + ad_abkl_l: "for better flat surface finish\nuse micro-movements to cancel\nbacklash in solid layer output\nin millimeters\n0 to disable", ad_lret_s: "layer retract", ad_lret_l: "force filament retraction\nbetween layers", ad_play_s: "polish layers", From cd06e28b0de8a868901950e335af07b5d5e26771 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 5 Feb 2021 15:42:02 -0500 Subject: [PATCH 070/255] checkpoint parsing arcs --- src/kiri/print.js | 54 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/src/kiri/print.js b/src/kiri/print.js index 64ce8bf8..92ddf247 100644 --- a/src/kiri/print.js +++ b/src/kiri/print.js @@ -146,11 +146,61 @@ rec[tok.charAt(0)] = parseFloat(tok.substring(1)); }); - console.log({g2, arc: line, pos}); + let center = { x:0, y:0 }; + + if (rec.I !== undefined && rec.J !== undefined) { + center.x = pos.X + rec.I; + center.y = pos.Y + rec.J; + } else if (rec.R !== undefined) { + let mid = { + x: (pos.X + rec.X) / 2, + y: (pos.Y + rec.Y) / 2, + dx: rec.X - pos.X, + dy: rec.Y - pos.Y + }; + let hml = Math.sqrt(mid.dx * mid.dx + mid.dy * mid.dy) / 2; + let s2 = BASE.newSlope({ + x: pos.X, + y: pos.Y + }, { + x: rec.X, + y: rec.Y + }).normal().toUnit(); + let ln = Math.sqrt(rec.R*rec.R - hml*hml); + center.x = pos.X + ln * mid.dx; + center.y = pos.Y + ln * mid.dy; + } else { + console.log({malfomed_arc: line}); + } + + // line angles + let a1 = Math.atan2(center.y - pos.Y, center.x - pos.X); + let a2 = Math.atan2(center.y - rec.Y, center.x - rec.X); + let ad = a2 - a1; + let steps = 20; + let step = (Math.abs(ad) > 0.001? ad : Math.PI * 2) / steps; + let rot = step; + + console.log({pos, rec, center, a1, a2, step, rot}); + + // rotate p around o + // p'x = cos(theta) * (px-ox) - sin(theta) * (py-oy) + ox + // p'y = sin(theta) * (px-ox) + cos(theta) * (py-oy) + oy + + let pc = { X: pos.X, Y: pos.Y }; + for (let i=0; i Date: Sat, 6 Feb 2021 01:29:33 -0500 Subject: [PATCH 071/255] checkpoint arc work --- src/geo/base.js | 28 +++++++++++++++++++--------- src/kiri/print.js | 39 +++++++++++++++++++++++++-------------- 2 files changed, 44 insertions(+), 23 deletions(-) diff --git a/src/geo/base.js b/src/geo/base.js index 89ba5eb4..019afacf 100644 --- a/src/geo/base.js +++ b/src/geo/base.js @@ -357,23 +357,32 @@ * from https://stackoverflow.com/questions/4103405/what-is-the-algorithm-for-finding-the-center-of-a-circle-from-three-points */ function center2d(A,B,C,rad) { - let yDelta_a = B.y - A.y, - xDelta_a = B.x - A.x, - yDelta_b = C.y - B.y, - xDelta_b = C.x - B.x, - aSlope = yDelta_a/xDelta_a, - bSlope = yDelta_b/xDelta_b, - center = {x:0, y:0, z:0}; - center.x = (aSlope*bSlope*(A.y - C.y) + bSlope*(A.x + B.x) - aSlope*(B.x+C.x) )/(2* (bSlope-aSlope) ); - center.y = -1*(center.x - (A.x+B.x)/2)/aSlope + (A.y+B.y)/2; + // let yDelta_a = B.y - A.y, + // xDelta_a = B.x - A.x, + // yDelta_b = C.y - B.y, + // xDelta_b = C.x - B.x, + // aSlope = yDelta_a/xDelta_a, + // bSlope = yDelta_b/xDelta_b, + // center = {x:0, y:0, z:0}; + // center.x = (aSlope*bSlope*(A.y - C.y) + bSlope*(A.x + B.x) - aSlope*(B.x+C.x) )/(2* (bSlope-aSlope) ); + // center.y = -1*(center.x - (A.x+B.x)/2)/aSlope + (A.y+B.y)/2; + let center = center3d(A,B,C); if (rad) { let dx = center.x - A.x; let dy = center.y - A.y; center.r = Math.sqrt(dx*dx + dy*dy) + // if (isNaN(center.r)) console.log('NaN',{dx,dy,A,B,C,center,xDelta_a,xDelta_b,yDelta_a,yDelta_b,aSlope,bSlope}); } return center; } + function thetaDiff(n1, n2, sign) { + let diff = n2 - n1; + while (diff < -Math.PI) diff += Math.PI * 2; + while (diff > Math.PI) diff -= Math.PI * 2; + return sign ? diff : Math.abs(diff); + } + /** ****************************************************************** * Connect to base ******************************************************************* */ @@ -459,6 +468,7 @@ area2, center2d, center3d, + thetaDiff, distSq : dist2, distSqv2 : dist2v2, inRange, diff --git a/src/kiri/print.js b/src/kiri/print.js index 92ddf247..494e05cf 100644 --- a/src/kiri/print.js +++ b/src/kiri/print.js @@ -139,6 +139,10 @@ const beltaxis = { X: "X", Y: "Z", Z: "Y", E: "E", F: "F" }; const beltfact = Math.cos(Math.PI/4); + function LOG() { + console.log(...[...arguments].map(o => Object.clone(o))); + } + function G2G3(g2, line) { const rec = {}; @@ -158,7 +162,7 @@ dx: rec.X - pos.X, dy: rec.Y - pos.Y }; - let hml = Math.sqrt(mid.dx * mid.dx + mid.dy * mid.dy) / 2; + let hml = Math.sqrt(mid.dx * mid.dx + mid.dy * mid.dy); let s2 = BASE.newSlope({ x: pos.X, y: pos.Y @@ -166,38 +170,45 @@ x: rec.X, y: rec.Y }).normal().toUnit(); - let ln = Math.sqrt(rec.R*rec.R - hml*hml); - center.x = pos.X + ln * mid.dx; - center.y = pos.Y + ln * mid.dy; + let ln = Math.sqrt(Math.abs(rec.R*rec.R - hml*hml)); + LOG({hml,s2,ln,mid}); + center.x = mid.x - ln * s2.dx; + center.y = mid.y - ln * s2.dy; } else { console.log({malfomed_arc: line}); } // line angles - let a1 = Math.atan2(center.y - pos.Y, center.x - pos.X); - let a2 = Math.atan2(center.y - rec.Y, center.x - rec.X); - let ad = a2 - a1; - let steps = 20; - let step = (Math.abs(ad) > 0.001? ad : Math.PI * 2) / steps; - let rot = step; + let a1 = Math.atan2(pos.Y - center.y, pos.X - center.x); + let a2 = Math.atan2(rec.Y - center.y, rec.X - center.x); + // let a1 = Math.atan2(center.y - pos.Y, center.x - pos.X); + // let a2 = Math.atan2(center.y - rec.Y, center.x - rec.X); + let ad = BASE.util.thetaDiff(a1, a2); + let steps = 5; + let step = (ad > 0.001 ? ad : Math.PI * 2) / steps; + let rot = a1; + let d1 = a1 * 180/Math.PI; + let d2 = a2 * 180/Math.PI; - console.log({pos, rec, center, a1, a2, step, rot}); + LOG({pos, rec, center, a1, a2, ad, d1, d2, step, rot}); + G0G1(false, [`X${center.x}`, `Y${center.y}`, `E1`]); + G0G1(false, [`X${rec.X}`, `Y${rec.Y}`, `E1`]); // rotate p around o // p'x = cos(theta) * (px-ox) - sin(theta) * (py-oy) + ox // p'y = sin(theta) * (px-ox) + cos(theta) * (py-oy) + oy let pc = { X: pos.X, Y: pos.Y }; - for (let i=0; i Date: Sat, 6 Feb 2021 12:11:54 -0500 Subject: [PATCH 072/255] tweaks to arc work --- src/kiri/print.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/kiri/print.js b/src/kiri/print.js index 494e05cf..ffcf4e9e 100644 --- a/src/kiri/print.js +++ b/src/kiri/print.js @@ -150,11 +150,12 @@ rec[tok.charAt(0)] = parseFloat(tok.substring(1)); }); - let center = { x:0, y:0 }; + let center = { x:0, y:0, r:0 }; if (rec.I !== undefined && rec.J !== undefined) { center.x = pos.X + rec.I; center.y = pos.Y + rec.J; + //center.r = TODO } else if (rec.R !== undefined) { let mid = { x: (pos.X + rec.X) / 2, @@ -174,6 +175,7 @@ LOG({hml,s2,ln,mid}); center.x = mid.x - ln * s2.dx; center.y = mid.y - ln * s2.dy; + center.r = rec.R; } else { console.log({malfomed_arc: line}); } @@ -192,22 +194,25 @@ LOG({pos, rec, center, a1, a2, ad, d1, d2, step, rot}); G0G1(false, [`X${center.x}`, `Y${center.y}`, `E1`]); - G0G1(false, [`X${rec.X}`, `Y${rec.Y}`, `E1`]); // rotate p around o // p'x = cos(theta) * (px-ox) - sin(theta) * (py-oy) + ox // p'y = sin(theta) * (px-ox) + cos(theta) * (py-oy) + oy let pc = { X: pos.X, Y: pos.Y }; + // let zc = { x: pc.X - center.x, y: pc.Y - center.y }; for (let i=0; i<=steps; i++) { let np = { - X: Math.cos(rot) * (pc.X - center.x) - Math.sin(rot) * (pc.Y - center.y) + center.x, - Y: Math.sin(rot) * (pc.X - center.x) - Math.cos(rot) * (pc.Y - center.y) + center.y + X: center.x + Math.sin(rot) * center.r, + Y: center.y + Math.cos(rot) * center.r + // X: Math.cos(rot) * (pc.X - center.x) - Math.sin(rot) * (pc.Y - center.y) + center.x, + // Y: Math.sin(rot) * (pc.X - center.x) - Math.cos(rot) * (pc.Y - center.y) + center.y }; rot += step; - // G0G1(false, [`X${np.X}`, `Y${np.Y}`, `E1`]); + G0G1(false, [`X${np.X}`, `Y${np.Y}`, `E1`]); } + G0G1(false, [`X${rec.X}`, `Y${rec.Y}`, `E1`]); LOG({g2, arc: line, pos, center}); pos.X = rec.X; From 3dedaae05b4d4d36b3ada987b4b812979ed7f44e Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 6 Feb 2021 16:07:56 -0500 Subject: [PATCH 073/255] checkpoint arc work --- src/geo/base.js | 22 ++++++++++++++++++++++ src/kiri/print.js | 31 ++++++------------------------- src/mode/fdm/export.js | 5 +++-- 3 files changed, 31 insertions(+), 27 deletions(-) diff --git a/src/geo/base.js b/src/geo/base.js index 019afacf..04b7dca8 100644 --- a/src/geo/base.js +++ b/src/geo/base.js @@ -376,6 +376,27 @@ return center; } + /** + * return two possible circle centers given two points and a radius + * https://stackoverflow.com/questions/36211171/finding-center-of-a-circle-given-two-points-and-radius + */ + function center2pr(p1, p2, r) { + let x1 = p1.x, + x2 = p2.x, + y1 = p1.y, + y2 = p2.y, + q = Math.sqrt(Math.pow((x2-x1),2) + Math.pow((y2-y1),2)), + y3 = (y1+y2)/2, + x3 = (x1+x2)/2, + basex = Math.sqrt(Math.pow(r,2)-Math.pow((q/2),2))*(y1-y2)/q, //calculate once + basey = Math.sqrt(Math.pow(r,2)-Math.pow((q/2),2))*(x2-x1)/q, //calculate once + centerx1 = x3 + basex, //center x of circle 1 + centery1 = y3 + basey, //center y of circle 1 + centerx2 = x3 - basex, //center x of circle 2 + centery2 = y3 - basey; //center y of circle 2 + return [{x:centerx1, y:centery1}, {x:centerx2, y:centery2}]; + } + function thetaDiff(n1, n2, sign) { let diff = n2 - n1; while (diff < -Math.PI) diff += Math.PI * 2; @@ -468,6 +489,7 @@ area2, center2d, center3d, + center2pr, thetaDiff, distSq : dist2, distSqv2 : dist2v2, diff --git a/src/kiri/print.js b/src/kiri/print.js index ffcf4e9e..a297bf35 100644 --- a/src/kiri/print.js +++ b/src/kiri/print.js @@ -157,24 +157,15 @@ center.y = pos.Y + rec.J; //center.r = TODO } else if (rec.R !== undefined) { - let mid = { - x: (pos.X + rec.X) / 2, - y: (pos.Y + rec.Y) / 2, - dx: rec.X - pos.X, - dy: rec.Y - pos.Y - }; - let hml = Math.sqrt(mid.dx * mid.dx + mid.dy * mid.dy); - let s2 = BASE.newSlope({ + let pr2 = BASE.util.center2pr({ x: pos.X, y: pos.Y }, { x: rec.X, y: rec.Y - }).normal().toUnit(); - let ln = Math.sqrt(Math.abs(rec.R*rec.R - hml*hml)); - LOG({hml,s2,ln,mid}); - center.x = mid.x - ln * s2.dx; - center.y = mid.y - ln * s2.dy; + }, rec.R)[g2 ? 1 : 0]; + center.x = pr2.x; + center.y = pr2.y; center.r = rec.R; } else { console.log({malfomed_arc: line}); @@ -186,34 +177,24 @@ // let a1 = Math.atan2(center.y - pos.Y, center.x - pos.X); // let a2 = Math.atan2(center.y - rec.Y, center.x - rec.X); let ad = BASE.util.thetaDiff(a1, a2); - let steps = 5; + let steps = 20; let step = (ad > 0.001 ? ad : Math.PI * 2) / steps; let rot = a1; - let d1 = a1 * 180/Math.PI; - let d2 = a2 * 180/Math.PI; - LOG({pos, rec, center, a1, a2, ad, d1, d2, step, rot}); + LOG({first: pos, last: rec, center, a1, a2, ad, step, rot, line}); G0G1(false, [`X${center.x}`, `Y${center.y}`, `E1`]); - // rotate p around o - // p'x = cos(theta) * (px-ox) - sin(theta) * (py-oy) + ox - // p'y = sin(theta) * (px-ox) + cos(theta) * (py-oy) + oy - let pc = { X: pos.X, Y: pos.Y }; - // let zc = { x: pc.X - center.x, y: pc.Y - center.y }; for (let i=0; i<=steps; i++) { let np = { X: center.x + Math.sin(rot) * center.r, Y: center.y + Math.cos(rot) * center.r - // X: Math.cos(rot) * (pc.X - center.x) - Math.sin(rot) * (pc.Y - center.y) + center.x, - // Y: Math.sin(rot) * (pc.X - center.x) - Math.cos(rot) * (pc.Y - center.y) + center.y }; rot += step; G0G1(false, [`X${np.X}`, `Y${np.Y}`, `E1`]); } G0G1(false, [`X${rec.X}`, `Y${rec.Y}`, `E1`]); - LOG({g2, arc: line, pos, center}); pos.X = rec.X; pos.Y = rec.Y; diff --git a/src/mode/fdm/export.js b/src/mode/fdm/export.js index e49ce98e..e20baf4f 100644 --- a/src/mode/fdm/export.js +++ b/src/mode/fdm/export.js @@ -508,7 +508,7 @@ let from = arcQ[0]; let to = arcQ.peek(); let cc = {x:0, y:0, z:0, r:0}; - let cl = arcQ.length; + let cl = arcQ.center.length; for (let center of arcQ.center) { cc.x += center.x; cc.y += center.y; @@ -521,6 +521,7 @@ cc.r /= cl; // first arc point emitQrec(from); + console.log({first: from, last: arcQ.peek(), center: cc}); // rest of arc to final point let dist = arcQ.slice(1).map(v => v.dist).reduce((a,v) => a+v); let emit = from.e;//arcQ.slice(1).map(v => v.e).reduce((a,v) => a+v); @@ -533,7 +534,7 @@ let gc = area > 0 ? 'G2' : 'G3'; let pre = `${gc} X${to.x.toFixed(decimals)} Y${to.y.toFixed(decimals)} R${cc.r.toFixed(decimals)} E${emit.toFixed(decimals)}`; let add = pos.f !== from.speedMMM ? ` E${from.speedMMM}` : ''; - append(`${pre}${add} ; merged=${cl-1} dist=${dist.toFixed(decimals)}`); + append(`${pre}${add} ; merged=${cl-1} len=${dist.toFixed(decimals)} cp=${cc.x.round(2)},${cc.y.round(2)}`); pos.x = to.x; pos.y = to.y; pos.z = to.z; From 5b4d89171d7bb36d5a96a66fe6b0d4c113746fe0 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 7 Feb 2021 17:53:16 -0500 Subject: [PATCH 074/255] add experimental preference and put arc tolerance in that category --- notes.md | 2 ++ src/kiri/init.js | 10 ++++++++-- src/kiri/print.js | 16 ++++++++-------- src/mode/fdm/export.js | 3 ++- web/kiri/lang/en.js | 2 ++ 5 files changed, 22 insertions(+), 11 deletions(-) diff --git a/notes.md b/notes.md index ce96bf83..f9a4c506 100644 --- a/notes.md +++ b/notes.md @@ -53,6 +53,8 @@ * `B` multiple parts with one angled against origin "floats" in preview * `B` re-add progress calls for all work units +* `B` disable support layer (top/bottom) offsets in belt mode +* `F` arrange should just align down Z. no side to side. # CAM diff --git a/src/kiri/init.js b/src/kiri/init.js index 31fa8c3b..49d05617 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -139,6 +139,7 @@ let control = settings().controller; let isDark = control.dark; control.decals = UI.decals.checked; + control.danger = UI.danger.checked; control.showOrigin = UI.showOrigin.checked; control.showRulers = UI.showRulers.checked; control.autoLayout = UI.autoLayout.checked; @@ -152,7 +153,7 @@ control.exportPreview = UI.exportPreview.checked; control.decimate = UI.decimate.checked; SPACE.view.setZoom(control.reverseZoom, control.zoomSpeed); - platform.layout(); + // platform.layout(); API.conf.save(); API.platform.update_size(); API.catalog.setOptions({ @@ -1372,6 +1373,10 @@ return !isBelt(); } + function isDanger() { + return UI.danger.checked; + } + // MAIN INITIALIZATION FUNCTION function init_one() { @@ -1597,6 +1602,7 @@ reverseZoom: UC.newBoolean(LANG.op_invr_s, booleanSave, {title:LANG.op_invr_l}), dark: UC.newBoolean(LANG.op_dark_s, booleanSave, {title:LANG.op_dark_l}), decals: UC.newBoolean(LANG.op_decl_s, booleanSave, {title:LANG.op_decl_s}), + danger: UC.newBoolean(LANG.op_dang_s, booleanSave, {title:LANG.op_dang_l}), lprefs: UC.newGroup(LANG.op_disp, $('prefs-gen2'), {inline: true}), showOrigin: UC.newBoolean(LANG.op_shor_s, booleanSave, {title:LANG.op_shor_l}), @@ -1783,7 +1789,7 @@ outputCoastDist: UC.newInput(LANG.ad_scst_s, {title:LANG.ad_scst_l, bound:UC.bound(0.0,10), convert:UC.toFloat, modes:FDM}), fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}), zHopDistance: UC.newInput(LANG.ad_zhop_s, {title:LANG.ad_zhop_l, bound:UC.bound(0,3.0), convert:UC.toFloat, modes:FDM}), - arcTolerance: UC.newInput(LANG.ad_arct_s, {title:LANG.ad_arct_l, bound:UC.bound(0,1.0), convert:UC.toFloat, modes:FDM, show:isNotBelt}), + arcTolerance: UC.newInput(LANG.ad_arct_s, {title:LANG.ad_arct_l, bound:UC.bound(0,1.0), convert:UC.toFloat, modes:FDM, show:() => { return isDanger() && isNotBelt() }}), antiBacklash: UC.newInput(LANG.ad_abkl_s, {title:LANG.ad_abkl_l, bound:UC.bound(0,3), convert:UC.toInt, modes:FDM}), fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}), gcodePauseLayers: UC.newInput(LANG.ag_paws_s, {title:LANG.ag_paws_l, modes:FDM, comma:true}), diff --git a/src/kiri/print.js b/src/kiri/print.js index a297bf35..06361757 100644 --- a/src/kiri/print.js +++ b/src/kiri/print.js @@ -172,17 +172,17 @@ } // line angles - let a1 = Math.atan2(pos.Y - center.y, pos.X - center.x); - let a2 = Math.atan2(rec.Y - center.y, rec.X - center.x); - // let a1 = Math.atan2(center.y - pos.Y, center.x - pos.X); - // let a2 = Math.atan2(center.y - rec.Y, center.x - rec.X); - let ad = BASE.util.thetaDiff(a1, a2); + // let a1 = Math.PI - Math.atan2(pos.Y - center.y, pos.X - center.x); + // let a2 = Math.PI - Math.atan2(rec.Y - center.y, rec.X - center.x); + let a1 = Math.PI - Math.atan2(center.y - pos.Y, center.x - pos.X); + let a2 = Math.PI - Math.atan2(center.y - rec.Y, center.x - rec.X); + let ad = BASE.util.thetaDiff(a1, a2, true); let steps = 20; - let step = (ad > 0.001 ? ad : Math.PI * 2) / steps; - let rot = a1; + let step = (Math.abs(ad) > 0.001 ? ad : Math.PI * 2) / steps; + let rot = a2; LOG({first: pos, last: rec, center, a1, a2, ad, step, rot, line}); - G0G1(false, [`X${center.x}`, `Y${center.y}`, `E1`]); + // G0G1(false, [`X${center.x}`, `Y${center.y}`, `E1`]); let pc = { X: pos.X, Y: pos.Y }; for (let i=0; i<=steps; i++) { diff --git a/src/mode/fdm/export.js b/src/mode/fdm/export.js index e20baf4f..34aaac6f 100644 --- a/src/mode/fdm/export.js +++ b/src/mode/fdm/export.js @@ -22,6 +22,7 @@ gcodeLayer = device.gcodeLayer, gcodeTrack = device.gcodeTrack, tool = 0, + isDanger = settings.controller.danger, isBelt = device.bedBelt, bedType = isBelt ? "belt" : "fixed", extruder = extruders[tool], @@ -50,7 +51,7 @@ retSpeed = process.outputRetractSpeed * 60, retDwell = process.outputRetractDwell || 0, timeDwell = retDwell / 1000, - arcDist = isBelt ? 0 : (process.arcTolerance || 0), + arcDist = isBelt || isDanger ? 0 : (process.arcTolerance || 0), originCenter = process.outputOriginCenter, offset = originCenter ? null : { x: device.bedWidth/2, diff --git a/web/kiri/lang/en.js b/web/kiri/lang/en.js index 6422e69b..7bd8adaf 100644 --- a/web/kiri/lang/en.js +++ b/web/kiri/lang/en.js @@ -124,6 +124,8 @@ kiri.lang['en-us'] = { op_xprt_l: "show more settings options", op_decl_s: "decals", op_decl_l: "show device decals and logos", + op_dang_s: "experimental", + op_dang_l: "show experimental parameters", op_hopo_s: "hover pop", op_hopo_l: "enable menu hover\nto activate", op_dark_s: "dark mode", From 7a6cfd266cbc6b1195253673e65b01eb6ec7ef67 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 7 Feb 2021 19:25:30 -0500 Subject: [PATCH 075/255] persist layer visibility selections --- src/kiri/conf.js | 3 +++ src/kiri/init.js | 13 +++++++++++++ src/kiri/main.js | 12 ++++++++++++ src/kiri/stacks.js | 21 +++++++++++++++++++++ src/mode/fdm/export.js | 2 +- 5 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/kiri/conf.js b/src/kiri/conf.js index 66e62b76..a9e2e620 100644 --- a/src/kiri/conf.js +++ b/src/kiri/conf.js @@ -633,6 +633,7 @@ view: null, dark: false, decals: true, + danger: false, zoomSpeed: 1.0, lineType: "path", autoSave: true, @@ -651,6 +652,8 @@ detail: "good", animesh: "200" }, + // label state preferences + labels: {}, // for passing temporary slice hints (topo currently) synth: {}, // widget extra info for slicing (extruder mapping) diff --git a/src/kiri/init.js b/src/kiri/init.js index 49d05617..b851908f 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -1991,6 +1991,19 @@ UI.sliderHold.style.marginRight = `${hival}px`; }); + // store layer preferences + API.event.on('stack.show', label => { + let mode = API.mode.get(); + let view = API.view.get(); + API.conf.get().labels[`${mode}-${view}-${label}`] = true; + }); + + API.event.on('stack.hide', label => { + let mode = API.mode.get(); + let view = API.view.get(); + API.conf.get().labels[`${mode}-${view}-${label}`] = false; + }); + // bind language choices $('lset-en').onclick = function() { SDB.setItem('kiri-lang', 'en-us'); diff --git a/src/kiri/main.js b/src/kiri/main.js index faa320a6..a896f133 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -935,6 +935,12 @@ }); updateSliderMax(true); setVisibleLayer(-1, 0); + if (scale === 1) { + for (let label of STACKS.getLabels()) { + let check = `${mode}-${viewMode}-${label}`; + STACKS.setVisible(label, settings.labels[check] !== false); + } + } }); if (scale === 1) { API.show.progress(0); @@ -1071,6 +1077,12 @@ setVisibleLayer(-1, 0); updateSpeeds(maxSpeed); + // maatch label checkboxes to preference + for (let label of STACKS.getLabels()) { + let check = `${settings.mode}-${viewMode}-${label}`; + STACKS.setVisible(label, settings.labels[check] !== false); + } + // mark preview complete for export complete.preview = true; diff --git a/src/kiri/stacks.js b/src/kiri/stacks.js index d1571633..24106415 100644 --- a/src/kiri/stacks.js +++ b/src/kiri/stacks.js @@ -52,6 +52,20 @@ return stacks[name]; } + function getLabels() { + return Object.keys(DYN); + } + + function setVisible(label, bool) { + let ctrl = DYN[label]; + if (ctrl) { + ctrl.toggle.checked = bool; + ctrl.group.forEach(mat => { + mat.visible = bool; + }); + } + } + function create(name, view) { if (stacks[name]) { return stacks[name]; @@ -70,6 +84,11 @@ ctrl.group.forEach(mat => { mat.visible = ctrl.toggle.checked; }); + if (ctrl.toggle.checked) { + KIRI.api.event.emit("stack.show", label); + } else { + KIRI.api.event.emit("stack.hide", label) + } }) }; let color = lmap[label].color.check; @@ -128,6 +147,8 @@ getStack, getRange, setRange, + getLabels, + setVisible, setFreeMem }; diff --git a/src/mode/fdm/export.js b/src/mode/fdm/export.js index 34aaac6f..4c8aedf8 100644 --- a/src/mode/fdm/export.js +++ b/src/mode/fdm/export.js @@ -51,7 +51,7 @@ retSpeed = process.outputRetractSpeed * 60, retDwell = process.outputRetractDwell || 0, timeDwell = retDwell / 1000, - arcDist = isBelt || isDanger ? 0 : (process.arcTolerance || 0), + arcDist = isBelt || !isDanger ? 0 : (process.arcTolerance || 0), originCenter = process.outputOriginCenter, offset = originCenter ? null : { x: device.bedWidth/2, From 2003be9d58a220e3edb243a928a0e5dbbf5f1502 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 7 Feb 2021 19:48:02 -0500 Subject: [PATCH 076/255] better string replace padding compensation --- src/kiri/print.js | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/kiri/print.js b/src/kiri/print.js index 06361757..9da8baf8 100644 --- a/src/kiri/print.js +++ b/src/kiri/print.js @@ -1049,7 +1049,7 @@ } } - function constReplace(str, consts, start, pad) { + function constReplace(str, consts, start, pad, short) { let cs = str.indexOf("{", start || 0), ce = str.indexOf("}", cs), tok, nutok, nustr; @@ -1062,11 +1062,24 @@ constOp(tok, consts, "*", function(v1,v2) { return v1*v2 }) || consts[tok] || 0; if (pad) { - nutok = nutok.toString().padEnd(ce-cs+1, ' '); + nutok = nutok.toString(); + let oldln = ce-cs+1; + let tokln = nutok.length; + if (tokln < oldln) { + short = (short || 1) + (oldln - tokln); + } } nustr = str.replace("{"+tok+"}",nutok); - return constReplace(nustr, consts, ce+1+(nustr.length-str.length)); + return constReplace(nustr, consts, ce+1+(nustr.length-str.length), pad, short); } else { + // insert compensating spaces for accumulated replace string shortages + if (short) { + let si = str.indexOf(';'); + if (si > 0) { + str = str.replace(';', ';'.padStart(short,' ')); + } + console.log({return: str, short}); + } return str; } } From 551c65dff99749295054d53d72d84b933a033f6b Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 7 Feb 2021 19:48:56 -0500 Subject: [PATCH 077/255] remove comment --- src/kiri/print.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/kiri/print.js b/src/kiri/print.js index 9da8baf8..b2369eef 100644 --- a/src/kiri/print.js +++ b/src/kiri/print.js @@ -1078,7 +1078,6 @@ if (si > 0) { str = str.replace(';', ';'.padStart(short,' ')); } - console.log({return: str, short}); } return str; } From 461e71ca64d26c4b57cf611051f20abb59db830e Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 7 Feb 2021 20:52:11 -0500 Subject: [PATCH 078/255] fix retraction between widgets. put retraction in prepare instead of export. inline comments --- src/mode/fdm/export.js | 10 +++------- src/mode/fdm/prepare.js | 30 +++++++++++++++--------------- 2 files changed, 18 insertions(+), 22 deletions(-) diff --git a/src/mode/fdm/export.js b/src/mode/fdm/export.js index 4c8aedf8..b60d69b5 100644 --- a/src/mode/fdm/export.js +++ b/src/mode/fdm/export.js @@ -212,9 +212,6 @@ let angle = -Math.PI / 4; function moveTo(newpos, rate, comment) { - if (comment) { - append(";; " + comment); - } let o = [!rate && !newpos.e ? 'G0' : 'G1']; let emit = { x: false, y: false, z: false }; if (typeof newpos.x === 'number' && newpos.x !== pos.x) { @@ -254,6 +251,9 @@ o.append(" F").append(Math.round(rate)); pos.f = rate } + if (comment) { + o.append(` ; ${comment}`); + } let line = o.join(''); if (last == line) { // console.log({dup:line}); @@ -325,10 +325,6 @@ append(`;; --- layer ${layer} (${subst.height} @ ${subst.z.round(3)}) ---`); } - if (layer > 0 && process.outputLayerRetract) { - retract(); - } - // enable fan at fan layer if (gcodeFan && layer === process.outputFanLayer) { appendAllSub(gcodeFan); diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index 2366ed00..d0b8c971 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -34,14 +34,9 @@ firstLayerMult = process.firstLayerPrintMult, firstLayerBrim = process.firstLayerBrim, firstLayerBrimTrig = process.firstLayerBrimTrig, + layerRetract = process.outputLayerRetract, layerno = 0, zoff = 0, - meshIndex, - lastIndex, - closest, - mindist, - minidx, - find, layerout = [], slices = [], print = self.worker.print = KIRI.newPrint(settings, widgets), @@ -271,7 +266,9 @@ let rec = track[nozzle]; if (rec) { track[nozzle] = null; - if (layer.last()) layer.last().retract = true; + if (layer.last()) { + layer.last().retract = true; + } start = print.polyPrintPath(rec.poly.clone().setZ(z), start, layer, { tool: using || nozzle, open: true, @@ -343,6 +340,8 @@ return a.z - b.z; }); + let lastWidget; + // walk cake layers bottom up for (let layer of cake) { // track purge blocks generated for each layer @@ -379,10 +378,11 @@ }); let { z, slice, offset } = order[0]; slice.prep = true; - // retract between widgets - if (layerout.length && minidx !== lastIndex) { + // retract between widgets or layers (when set) + if (layerout.length && slice.widget !== lastWidget) { layerout.last().retract = true; } + lastWidget = slice.widget; layerout.z = z + slice.height / 2; layerout.height = layerout.height || slice.height; // mark layer as anchor if slice is belt and flag set @@ -408,7 +408,9 @@ layerout.appendAll(tmpout); lastOut = slice; lastExt = lastOut.ext - lastIndex = minidx; + if (layerRetract) { + layerout.last().retract = true; + } } // if a declared extruder isn't used in a layer, use selected @@ -700,9 +702,7 @@ .setLayer(opts.other || 'move', moveOpt, opts.moves !== true) .addPolys(moves, { thin: true, z: opts.z }); // force level when present - if (level.z) { - opts.z = level.z - height; - } + let pz = level.z ? level.z - height : opts.z; Object.values(prints).forEach(array => { array.forEach(poly => { if (flat && poly.appearsClosed()) { @@ -715,10 +715,10 @@ .addPolys([ poly ], thin ? { thin, z: opts.z, color: poly.color } : flat ? { - flat, z: opts.z, color: poly.color, + flat, z: pz, color: poly.color, outline: true, offset: array.width, open: poly.open } : { - offset: array.width, height, z: opts.z, + offset: array.width, height, z: pz, color: { face: poly.color, line: poly.color } }) }); From 608a872b4f1fc3192d8a248fc6bf47d2b28dd94b Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 7 Feb 2021 20:53:13 -0500 Subject: [PATCH 079/255] bump rev 2.7.D1 --- package.json | 2 +- src/kiri.js | 2 +- src/license.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 6153cbe0..ad185b93 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grid-apps", - "version": "2.7.0D", + "version": "2.7.1D", "description": "grid.space 3d slice & modeling tools", "author": "Stewart Allen ", "license": "MIT", diff --git a/src/kiri.js b/src/kiri.js index 4da40355..9d53f69a 100644 --- a/src/kiri.js +++ b/src/kiri.js @@ -6,7 +6,7 @@ if (!self.kiri) { self.kiri = { - beta: 2700, + beta: 2701, driver: {}, // driver modules loader: [] // module loading: array of functions }; diff --git a/src/license.js b/src/license.js index 16f9176d..b355285d 100644 --- a/src/license.js +++ b/src/license.js @@ -3,7 +3,7 @@ let terms = { COPYRIGHT: "Copyright (C) Stewart Allen - All Rights Reserved", LICENSE: "See the license.md file included with the source distribution", - VERSION: "2.7.D0" + VERSION: "2.7.D1" }; if (typeof(module) === 'object') { From f988912f6bc029fe792cb7ec7120d2c678c0a21a Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 7 Feb 2021 21:53:58 -0500 Subject: [PATCH 080/255] fix arc parsing (clockwise). clean up label preference restoration and apply to parsed gcode --- src/kiri/main.js | 21 +++++++++++---------- src/kiri/print.js | 43 +++++++++++++++++++++++++----------------- src/mode/fdm/export.js | 8 +++++--- 3 files changed, 42 insertions(+), 30 deletions(-) diff --git a/src/kiri/main.js b/src/kiri/main.js index a896f133..b397942f 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -936,10 +936,7 @@ updateSliderMax(true); setVisibleLayer(-1, 0); if (scale === 1) { - for (let label of STACKS.getLabels()) { - let check = `${mode}-${viewMode}-${label}`; - STACKS.setVisible(label, settings.labels[check] !== false); - } + updateStackLabelState(); } }); if (scale === 1) { @@ -1076,12 +1073,7 @@ updateSliderMax(true); setVisibleLayer(-1, 0); updateSpeeds(maxSpeed); - - // maatch label checkboxes to preference - for (let label of STACKS.getLabels()) { - let check = `${settings.mode}-${viewMode}-${label}`; - STACKS.setVisible(label, settings.labels[check] !== false); - } + updateStackLabelState(); // mark preview complete for export complete.preview = true; @@ -1104,6 +1096,14 @@ KIRI.export(...argsave); } + function updateStackLabelState() { + // match label checkboxes to preference + for (let label of STACKS.getLabels()) { + let check = `${settings.mode}-${viewMode}-${label}`; + STACKS.setVisible(label, settings.labels[check] !== false); + } + } + function loadCode(code, type) { setViewMode(VIEWS.PREVIEW); setOpacity(0); @@ -1119,6 +1119,7 @@ updateSliderMax(true); updateSpeeds(maxSpeed); showSlices(); + updateStackLabelState(); SPACE.update(); API.event.emit("code.loaded", {code, type}); }); diff --git a/src/kiri/print.js b/src/kiri/print.js index b2369eef..f9f7e475 100644 --- a/src/kiri/print.js +++ b/src/kiri/print.js @@ -133,7 +133,8 @@ maxf = 0, seq = [], autolayer = true, - newlayer = false; + newlayer = false, + arcdivs = Math.PI / 12; const output = scope.output = [ seq ]; const beltaxis = { X: "X", Y: "Z", Z: "Y", E: "E", F: "F" }; @@ -156,14 +157,24 @@ center.x = pos.X + rec.I; center.y = pos.Y + rec.J; //center.r = TODO + console.log("G[2,3] IJ not supported"); } else if (rec.R !== undefined) { - let pr2 = BASE.util.center2pr({ - x: pos.X, - y: pos.Y - }, { - x: rec.X, - y: rec.Y - }, rec.R)[g2 ? 1 : 0]; + let pd = { x: rec.X - pos.X, y: rec.Y - pos.Y }; + let dst = Math.sqrt(pd.x * pd.x + pd.y * pd.y) / 2; + let pr2; + if (Math.abs(dst - rec.R) < 0.001) { + // center point radius + pr2 = { x: (rec.X + pos.X) / 2, y: (rec.Y + pos.Y) / 2}; + } else { + // triangulate + pr2 = BASE.util.center2pr({ + x: pos.X, + y: pos.Y + }, { + x: rec.X, + y: rec.Y + }, rec.R)[g2 ? 1 : 0]; + } center.x = pr2.x; center.y = pr2.y; center.r = rec.R; @@ -172,23 +183,21 @@ } // line angles - // let a1 = Math.PI - Math.atan2(pos.Y - center.y, pos.X - center.x); - // let a2 = Math.PI - Math.atan2(rec.Y - center.y, rec.X - center.x); - let a1 = Math.PI - Math.atan2(center.y - pos.Y, center.x - pos.X); - let a2 = Math.PI - Math.atan2(center.y - rec.Y, center.x - rec.X); + let a1 = Math.atan2(center.y - pos.Y, center.x - pos.X) + Math.PI; + let a2 = Math.atan2(center.y - rec.Y, center.x - rec.X) + Math.PI; let ad = BASE.util.thetaDiff(a1, a2, true); - let steps = 20; + let steps = Math.floor(Math.abs(ad) / arcdivs); let step = (Math.abs(ad) > 0.001 ? ad : Math.PI * 2) / steps; - let rot = a2; + let rot = a1 + step; LOG({first: pos, last: rec, center, a1, a2, ad, step, rot, line}); // G0G1(false, [`X${center.x}`, `Y${center.y}`, `E1`]); let pc = { X: pos.X, Y: pos.Y }; - for (let i=0; i<=steps; i++) { + for (let i=0; i<=steps-2; i++) { let np = { - X: center.x + Math.sin(rot) * center.r, - Y: center.y + Math.cos(rot) * center.r + X: center.x + Math.cos(rot) * center.r, + Y: center.y + Math.sin(rot) * center.r }; rot += step; G0G1(false, [`X${np.X}`, `Y${np.Y}`, `E1`]); diff --git a/src/mode/fdm/export.js b/src/mode/fdm/export.js index b60d69b5..034ab597 100644 --- a/src/mode/fdm/export.js +++ b/src/mode/fdm/export.js @@ -505,12 +505,13 @@ let from = arcQ[0]; let to = arcQ.peek(); let cc = {x:0, y:0, z:0, r:0}; - let cl = arcQ.center.length; - for (let center of arcQ.center) { + let cl = 0; + for (let center of arcQ.center.filter(rec => !isNaN(rec.r))) { cc.x += center.x; cc.y += center.y; cc.z += center.z; cc.r += center.r; + cl++; } cc.x /= cl; cc.y /= cl; @@ -518,7 +519,8 @@ cc.r /= cl; // first arc point emitQrec(from); - console.log({first: from, last: arcQ.peek(), center: cc}); + // console.log(arcQ.slice(), arcQ.center); + // console.log({first: from, last: arcQ.peek(), center: cc}); // rest of arc to final point let dist = arcQ.slice(1).map(v => v.dist).reduce((a,v) => a+v); let emit = from.e;//arcQ.slice(1).map(v => v.e).reduce((a,v) => a+v); From cd155aab9c569317394f3f3abb523b9a78bc3d19 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 7 Feb 2021 22:08:54 -0500 Subject: [PATCH 081/255] missed a debug --- src/kiri/print.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kiri/print.js b/src/kiri/print.js index f9f7e475..be7d99a3 100644 --- a/src/kiri/print.js +++ b/src/kiri/print.js @@ -190,7 +190,7 @@ let step = (Math.abs(ad) > 0.001 ? ad : Math.PI * 2) / steps; let rot = a1 + step; - LOG({first: pos, last: rec, center, a1, a2, ad, step, rot, line}); + // LOG({first: pos, last: rec, center, a1, a2, ad, step, rot, line}); // G0G1(false, [`X${center.x}`, `Y${center.y}`, `E1`]); let pc = { X: pos.X, Y: pos.Y }; From 2105515697f0a9e2fc6c5a11e8dd9d406ae54a92 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 8 Feb 2021 01:48:16 -0500 Subject: [PATCH 082/255] fix supports state issue --- src/kiri/main.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/kiri/main.js b/src/kiri/main.js index b397942f..57bd1554 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -871,6 +871,9 @@ setOpacity(color.slicing_opacity); STACKS.clear(); + if (mode === 'FDM') { + KIRI.client.clear(); + } KIRI.client.sync(); KIRI.client.rotate(settings); From a8a08d8839dd8f0cf9a4a56d640ddd0af02d9295 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 8 Feb 2021 02:03:40 -0500 Subject: [PATCH 083/255] fix bug when layer has not output --- src/mode/fdm/prepare.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index d0b8c971..f2200066 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -408,7 +408,7 @@ layerout.appendAll(tmpout); lastOut = slice; lastExt = lastOut.ext - if (layerRetract) { + if (layerRetract && layerout.length) { layerout.last().retract = true; } } From 624b1f821a8cd0e1b8daedd7d67204a0c4acfd48 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 8 Feb 2021 02:22:50 -0500 Subject: [PATCH 084/255] add missing firstLayerBeltLead parameter to default CR30 profile --- src/dev/fdm/Creality.CR-30 | 1 + src/kiri/init.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/dev/fdm/Creality.CR-30 b/src/dev/fdm/Creality.CR-30 index 24b4de59..8f50b5bf 100644 --- a/src/dev/fdm/Creality.CR-30 +++ b/src/dev/fdm/Creality.CR-30 @@ -85,6 +85,7 @@ "firstLayerPrintMult": 1.15, "firstLayerYOffset": 0, "firstLayerBrim": 0, + "firstLayerBeltLead": 3, "outputTemp": 210, "outputFanMax": 255, "outputBedTemp": 60, diff --git a/src/kiri/init.js b/src/kiri/init.js index b851908f..88687ba5 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -2388,7 +2388,7 @@ API.event.emit('init-done', STATS); // show gdpr if it's never been seen and we're not iframed - if (!SDB.gdpr && WIN.self === WIN.top) { + if (!SDB.gdpr && WIN.self === WIN.top && !SETUP.debug) { $('gdpr').style.display = 'flex'; } From 3283d879effa96d6f1043fde7636f72e523da6ac Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 8 Feb 2021 10:10:31 -0500 Subject: [PATCH 085/255] force cache clear only when synth widgets present --- notes.md | 7 +++---- src/kiri/client.js | 4 ++-- src/kiri/main.js | 3 --- src/kiri/worker.js | 16 +++------------- src/mode/fdm/client.js | 5 +++++ 5 files changed, 13 insertions(+), 22 deletions(-) diff --git a/notes.md b/notes.md index f9a4c506..4566de31 100644 --- a/notes.md +++ b/notes.md @@ -2,7 +2,7 @@ ## `C` cosmetic, `F` functional, `P` performance, `B` bug fix -* `B` client/worker cache invalidated by latest rotation work +* `B` client/worker cache invalidated by latest rotation work. revisit sync. * `B` normals possibly inverted on faces in 2D to 3D conversion * `B` origin bug (Onshape?) when switching modes in 2.5 and 2.6 @@ -19,13 +19,12 @@ # FDM -* `B` fix adaptive slicing with multi-extruder +* `B` infill densities are inaccurate * `B` fix support projection/end with grouped parts * `B` multi-extruder rendering of raft fails to offset the rest of the print * `B` multi-extruder purge blocks fail to generate properly for rafts -* `B` first layer support speed should be same as shell speed -* `F` test outlining solid projected areas +* `F` test outlining solid projected areas (internally) * `F` slicing controls per user-defined z-region * `F` control for size of purge block (with 0=disabled) * `F` polishing and other non-planar work diff --git a/src/kiri/client.js b/src/kiri/client.js index 7f6a660b..c54dca80 100644 --- a/src/kiri/client.js +++ b/src/kiri/client.js @@ -110,9 +110,9 @@ KIRI.work = { send("config", obj, function(reply) { }); }, - clear: function(widget) { + clear: function() { syncd = {}; - send("clear", widget ? {id:widget.id} : {}, function(reply) { }); + send("clear", {}, function(reply) { }); }, snap: function(data) { diff --git a/src/kiri/main.js b/src/kiri/main.js index 57bd1554..b397942f 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -871,9 +871,6 @@ setOpacity(color.slicing_opacity); STACKS.clear(); - if (mode === 'FDM') { - KIRI.client.clear(); - } KIRI.client.sync(); KIRI.client.rotate(settings); diff --git a/src/kiri/worker.js b/src/kiri/worker.js index 77c363d8..3e4711e9 100644 --- a/src/kiri/worker.js +++ b/src/kiri/worker.js @@ -44,19 +44,9 @@ KIRI.worker = { clear: function(data, send) { current.snap = null; current.print = null; - if (!data.id) { - dispatch.group = wgroup = {}; - dispatch.cache = wcache = {}; - send.done({ clear: true }); - return; - } - let had = wcache[data.id] !== undefined; - delete wcache[data.id]; - send.done({ - id: data.id, - had: had, - has: wcache[data.id] !== undefined - }); + dispatch.group = wgroup = {}; + dispatch.cache = wcache = {}; + send.done({ clear: true }); }, // widget sync diff --git a/src/mode/fdm/client.js b/src/mode/fdm/client.js index 432399ca..e575e243 100644 --- a/src/mode/fdm/client.js +++ b/src/mode/fdm/client.js @@ -23,13 +23,18 @@ function filterSynth() { // remove synth widgets + let clear = false; api.widgets.filter((widget) => { if (widget.track.synth) { api.const.SPACE.platform.remove(widget.mesh); kiri.Widget.Groups.remove(widget); + clear = true; } return !widget.track.synth }); + if (clear) { + kiri.client.clear(); + } } api.event.on("mode.set", mode => { From 2cc92dea6f2a3ea874f7fd8447744ef50b4ab01a Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 8 Feb 2021 10:13:16 -0500 Subject: [PATCH 086/255] clear can only be done pre-slice, not during filter synth --- src/kiri/main.js | 3 +++ src/mode/fdm/client.js | 6 ------ 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/kiri/main.js b/src/kiri/main.js index b397942f..57bd1554 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -871,6 +871,9 @@ setOpacity(color.slicing_opacity); STACKS.clear(); + if (mode === 'FDM') { + KIRI.client.clear(); + } KIRI.client.sync(); KIRI.client.rotate(settings); diff --git a/src/mode/fdm/client.js b/src/mode/fdm/client.js index e575e243..e2f41534 100644 --- a/src/mode/fdm/client.js +++ b/src/mode/fdm/client.js @@ -22,19 +22,13 @@ SPACE = api.const.SPACE; function filterSynth() { - // remove synth widgets - let clear = false; api.widgets.filter((widget) => { if (widget.track.synth) { api.const.SPACE.platform.remove(widget.mesh); kiri.Widget.Groups.remove(widget); - clear = true; } return !widget.track.synth }); - if (clear) { - kiri.client.clear(); - } } api.event.on("mode.set", mode => { From f35ab738583d1ec3dcd5abaf28425b9302b0aaa3 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 8 Feb 2021 10:55:36 -0500 Subject: [PATCH 087/255] more intelligent sync. but clear/sync in belt mode. eliminate layer support gap in belt mode --- notes.md | 1 - src/kiri/client.js | 3 +++ src/kiri/init.js | 2 +- src/kiri/main.js | 2 +- src/kiri/worker.js | 14 ++++++++++++++ src/mode/fdm/slice.js | 2 +- 6 files changed, 20 insertions(+), 4 deletions(-) diff --git a/notes.md b/notes.md index 4566de31..9f0bad2a 100644 --- a/notes.md +++ b/notes.md @@ -2,7 +2,6 @@ ## `C` cosmetic, `F` functional, `P` performance, `B` bug fix -* `B` client/worker cache invalidated by latest rotation work. revisit sync. * `B` normals possibly inverted on faces in 2D to 3D conversion * `B` origin bug (Onshape?) when switching modes in 2.5 and 2.6 diff --git a/src/kiri/client.js b/src/kiri/client.js index c54dca80..8944164f 100644 --- a/src/kiri/client.js +++ b/src/kiri/client.js @@ -121,6 +121,9 @@ KIRI.work = { // widget sync sync: function() { + // send list of currently valid widgets + send("sync", { valid: KIRI.api.widgets.all().map(w => w.id) }, () => {}); + // sync any widget that has changed let widgets = KIRI.api.widgets.all(); widgets.forEach(widget => { if (widget.modified || !syncd[widget.id]) { diff --git a/src/kiri/init.js b/src/kiri/init.js index 88687ba5..603c6e2c 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -1685,7 +1685,7 @@ fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}), sliceSupportSize: UC.newInput(LANG.sp_size_s, {title:LANG.sp_size_l, bound:UC.bound(1.0,200.0), convert:UC.toFloat, modes:FDM}), sliceSupportOffset: UC.newInput(LANG.sp_offs_s, {title:LANG.sp_offs_l, bound:UC.bound(0.0,200.0), convert:UC.toFloat, modes:FDM}), - sliceSupportGap: UC.newInput(LANG.sp_gaps_s, {title:LANG.sp_gaps_l, bound:UC.bound(0,5), convert:UC.toInt, modes:FDM}), + sliceSupportGap: UC.newInput(LANG.sp_gaps_s, {title:LANG.sp_gaps_l, bound:UC.bound(0,5), convert:UC.toInt, modes:FDM, show:isNotBelt}), fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}), sliceSupportArea: UC.newInput(LANG.sp_area_s, {title:LANG.sp_area_l, bound:UC.bound(0.0,200.0), convert:UC.toFloat, modes:FDM}), sliceSupportExtra: UC.newInput(LANG.sp_xpnd_s, {title:LANG.sp_xpnd_l, bound:UC.bound(0.0,200.0), convert:UC.toFloat, modes:FDM}), diff --git a/src/kiri/main.js b/src/kiri/main.js index 57bd1554..e34645a3 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -871,7 +871,7 @@ setOpacity(color.slicing_opacity); STACKS.clear(); - if (mode === 'FDM') { + if (settings.device.bedBelt) { KIRI.client.clear(); } KIRI.client.sync(); diff --git a/src/kiri/worker.js b/src/kiri/worker.js index 3e4711e9..40148221 100644 --- a/src/kiri/worker.js +++ b/src/kiri/worker.js @@ -51,6 +51,20 @@ KIRI.worker = { // widget sync sync: function(data, send) { + if (data.valid) { + // remove widgets not present in valid list + for (let key in wcache) { + if (data.valid.indexOf(key) < 0) { + delete wcache[key]; + for (let [id,group] of Object.entries(wgroup)) { + wgroup[id] = group = group.filter(v => v.id !== key); + group.id = id; + } + } + } + return; + } + let group = wgroup[data.group]; if (!group) { group = []; diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index b241c6c9..d488385b 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -191,7 +191,7 @@ slice.addTop(u); } } - let gap = sliceHeight * spro.sliceSupportGap + let gap = sliceHeight * (isBelt ? 0 : spro.sliceSupportGap); // clip tops to other widgets in group tops = slice.topPolys(); for (let peer of widget.group) { From 80693c2576265027c35985fbc20113dc3ebb3736 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 8 Feb 2021 20:18:15 -0500 Subject: [PATCH 088/255] belt anchor new peeks into the first 5 layers to find the max width to use. bump rev 2.7.D2 --- package.json | 2 +- src/kiri.js | 2 +- src/license.js | 2 +- src/mode/fdm/slice.js | 11 ++++++++++- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index ad185b93..67fce7ff 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grid-apps", - "version": "2.7.1D", + "version": "2.7.2D", "description": "grid.space 3d slice & modeling tools", "author": "Stewart Allen ", "license": "MIT", diff --git a/src/kiri.js b/src/kiri.js index 9d53f69a..f27c1c67 100644 --- a/src/kiri.js +++ b/src/kiri.js @@ -6,7 +6,7 @@ if (!self.kiri) { self.kiri = { - beta: 2701, + beta: 2702, driver: {}, // driver modules loader: [] // module loading: array of functions }; diff --git a/src/license.js b/src/license.js index b355285d..e150a8eb 100644 --- a/src/license.js +++ b/src/license.js @@ -3,7 +3,7 @@ let terms = { COPYRIGHT: "Copyright (C) Stewart Allen - All Rights Reserved", LICENSE: "See the license.md file included with the source distribution", - VERSION: "2.7.D1" + VERSION: "2.7.D2" }; if (typeof(module) === 'object') { diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index d488385b..77b623a0 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -313,8 +313,16 @@ slice.belt = { miny, touch: false }; } // mark slices with tops touching belt + // also find max width of first 5 layers let start; + let minx = Infinity, maxx = -Infinity; for (let slice of slices) { + if (slice.index < 5) { + for (let poly of slice.topPolys()) { + minx = Math.min(minx, poly.bounds.minx); + maxx = Math.max(maxx, poly.bounds.maxx); + } + } if (Math.abs(slice.belt.miny - smin) < 0.001) { slice.belt.touch = true; if (!start) start = slice; @@ -339,7 +347,8 @@ addto.belt.anchor = true; let z = addto.z; let y = z - smin - (nozzleSize / 2); - let splat = BASE.newPolygon().add(wb.min.x, y, z).add(wb.max.x, y, z).setOpen(); + // let splat = BASE.newPolygon().add(wb.min.x, y, z).add(wb.max.x, y, z).setOpen(); + let splat = BASE.newPolygon().add(minx, y, z).add(maxx, y, z).setOpen(); addto.addTop(splat).fill_sparse = [ splat ]; start = addto; offset -= sliceHeight; From b5c8b19864f7309e4d68d30506db08e1f291225a Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Tue, 9 Feb 2021 10:25:23 -0500 Subject: [PATCH 089/255] add extruder deselect script. relegate extruder abs/rel to detection via gcode header parsing --- notes.md | 6 +++++- src/kiri/conf.js | 3 +++ src/kiri/init.js | 13 +++++++++---- src/kiri/main.js | 1 + src/mode/fdm/export.js | 22 +++++++++++++++------- web/kiri/lang/en.js | 4 +++- 6 files changed, 36 insertions(+), 13 deletions(-) diff --git a/notes.md b/notes.md index 9f0bad2a..b065103e 100644 --- a/notes.md +++ b/notes.md @@ -11,10 +11,12 @@ * `P` client/worker interface normalization * `P` explore widget vertex reloading / replacing (Onshape primarily) -* `F` G2/G3 arc output / input +* `F` add % field type with conversion (like units) +* `F` complete G2/G3 arc output / input (85% now) * `F` expose grouping feature * `F` SVG import to 3D part like images * `F` bundle current profile into exported device +* `F` integrate svg nest arrange algorithm # FDM @@ -67,6 +69,7 @@ * `B` climb vs conventional not fully consistent after refactor * `B` outside cutting direction in roughing mode inverted +* `F` add layout spacing preference * `F` import SVG into a path that can be overlaid onto a 3D mesh (laser?) * `F` intelligently turn circle hole pocket clear into spiral down * `F` trace follow hole that matches endmill should turn into a drill op @@ -111,6 +114,7 @@ * http://wiki.imal.org/howto/cnc-milling-introduction-cutting-tools * http://www.twak.co.uk/2011/01/degeneracy-in-weighted-straight.html * http://photon.chrisgraf.de/ +* https://github.com/Jack000/SVGnest # More CNC diff --git a/src/kiri/conf.js b/src/kiri/conf.js index a9e2e620..b5896367 100644 --- a/src/kiri/conf.js +++ b/src/kiri/conf.js @@ -77,6 +77,7 @@ extFilament: device.filamentSize, extNozzle: device.nozzleSize, extSelect: ["T0"], + extDeselect: [], extOffsetX: 0, extOffsetY: 0 }]; @@ -143,6 +144,7 @@ if (rec.offset_x) e.extOffsetX = rec.offset_x; if (rec.offset_y) e.extOffsetY = rec.offset_y; if (rec.select) e.extSelect = rec.select; + if (rec.deselect) e.extDeselect = rec.deselect; device.extruders.push(e); }); } else { @@ -273,6 +275,7 @@ extFilament: 1.75, extNozzle: 0.4, extSelect: ["T0"], + extDeselect: [], extOffsetX: 0, extOffsetY: 0 }] diff --git a/src/kiri/init.js b/src/kiri/init.js index 603c6e2c..538fe453 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -739,6 +739,12 @@ // add extruder selection buttons if (dev.extruders) { + for (let ext of dev.extruders) { + // add missing deselect field from legacy configs + if (!ext.extDeselect) { + ext.extDeselect = []; + } + } let ext = API.lists.extruders = []; dev.internal = 0; let selext = $('pop-nozzle'); @@ -768,7 +774,6 @@ UI.bedDepth, UI.bedWidth, UI.maxHeight, - UI.extrudeAbs, UI.deviceOrigin, UI.deviceRound, UI.deviceBelt, @@ -792,12 +797,12 @@ UI.extDel, UI.extOffsetX, UI.extOffsetY, - UI.extSelect + UI.extSelect, + UI.extDeselect ].forEach(function(e) { e.disabled = !local; }); - UI.extrudeAbs.style.display = mode === 'CAM' ? 'none' : 'flex'; UI.deviceSave.disabled = !local; UI.deviceDelete.disabled = !local; UI.deviceExport.disabled = !local; @@ -1570,7 +1575,7 @@ extOffsetX: UC.newInput(LANG.dv_exox_s, {title:LANG.dv_exox_l, convert:UC.toFloat, modes:FDM}), extOffsetY: UC.newInput(LANG.dv_exoy_s, {title:LANG.dv_exoy_l, convert:UC.toFloat, modes:FDM}), extSelect: UC.newText(LANG.dv_exts_s, {title:LANG.dv_exts_l, modes:FDM, size:14, height:3, modes:FDM, area:gcode}), - extrudeAbs: UC.newBoolean(LANG.dv_xtab_s, onBooleanClick, {title:LANG.dv_xtab_l, modes:FDM}), + extDeselect: UC.newText(LANG.dv_dext_s, {title:LANG.dv_dext_l, modes:FDM, size:14, height:3, modes:FDM, area:gcode}), extActions: UC.newRow([ UI.extPrev = UC.newButton(undefined, undefined, {icon:''}), UI.extAdd = UC.newButton(undefined, undefined, {icon:''}), diff --git a/src/kiri/main.js b/src/kiri/main.js index e34645a3..61afd90d 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -1974,6 +1974,7 @@ UI.extAdd.onclick = function() { let copy = clone(device.extruders[device.internal]); copy.extSelect = [`T${device.extruders.length}`]; + copy.extDeselect = []; device.extruders.push(copy); device.internal = device.extruders.length - 1; updateExtruderFields(device); diff --git a/src/mode/fdm/export.js b/src/mode/fdm/export.js index 034ab597..44da89a2 100644 --- a/src/mode/fdm/export.js +++ b/src/mode/fdm/export.js @@ -28,7 +28,8 @@ extruder = extruders[tool], offset_x = extruder.extOffsetX, offset_y = extruder.extOffsetY, - extrudeAbs = device.extrudeAbs, + extrudeAbs = device.extrudeAbs || false, + extrudeSet = false, time = 0, layer = 0, pause = [], @@ -135,7 +136,7 @@ } function appendAllSub(arr, pad) { - if (!arr) return; + if (!arr || arr.length === 0) return; if (!Array.isArray(arr)) arr = [ arr ]; arr.forEach(function(line) { appendSub(line, pad) }); } @@ -156,10 +157,16 @@ let line = device.gcodePre[i]; if (line.indexOf('T0') >= 0) t0 = true; else if (line.indexOf('T1') >= 0) t1 = true; else - if (line.indexOf('M82') >= 0) extrudeAbs = true; else - if (line.indexOf('M83') >= 0) extrudeAbs = false; else - if (line.indexOf('G90') >= 0) extrudeAbs = true; else - if (line.indexOf('G91') >= 0) extrudeAbs = false; else + if (line.indexOf('M82') >= 0) { + extrudeAbs = true; + extrudeSet = true; + } else + if (line.indexOf('M83') >= 0) { + extrudeAbs = false; + extrudeSet = true; + } else + if (line.indexOf('G90') >= 0 && !extrudeSet) extrudeAbs = true; else + if (line.indexOf('G91') >= 0 && !extrudeSet) extrudeAbs = false; else if (line.indexOf('G92') === 0) { line.split(";")[0].split(' ').forEach(function (tok) { let val = parseFloat(tok.substring(1) || 0) || 0; @@ -355,8 +362,9 @@ out = path[pidx]; speedMMM = (out.speed || process.outputFeedrate) * 60; - // look for extruder change and recalc emit factor + // look for extruder change, run scripts, recalc emit factor if (out.tool !== undefined && out.tool !== tool) { + appendAllSub(extruder.extDeselect); tool = out.tool; subst.nozzle = subst.tool = tool; extruder = extruders[tool]; diff --git a/web/kiri/lang/en.js b/web/kiri/lang/en.js index 7bd8adaf..a00056b0 100644 --- a/web/kiri/lang/en.js +++ b/web/kiri/lang/en.js @@ -68,7 +68,9 @@ kiri.lang['en-us'] = { dv_lzof_s: "laser off", dv_lzof_l: "gcode laser off script", dv_exts_s: "select", - dv_exts_l: "gcode to select this extruder", + dv_exts_l: "gcode run to enable this extruder", + dv_dext_s: "deselect", + dv_dext_l: "gcode run before enabling another extruder", dv_extd_s: "deselect", dv_extd_l: "gcode to deselect this extruder", dv_exox_s: "offset x", From 2f184703e72a831af55a69058ea3a4bdf619bd0b Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Tue, 9 Feb 2021 10:35:14 -0500 Subject: [PATCH 090/255] add preference for object auto-layout spacing --- src/kiri/conf.js | 1 + src/kiri/init.js | 5 +++-- src/kiri/main.js | 2 +- web/kiri/lang/en.js | 2 ++ 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/kiri/conf.js b/src/kiri/conf.js index b5896367..d41c6dbd 100644 --- a/src/kiri/conf.js +++ b/src/kiri/conf.js @@ -646,6 +646,7 @@ showSpeeds: true, freeLayout: true, autoLayout: true, + spaceLayout: 1, units: "mm", exportOcto: false, exportGhost: false, diff --git a/src/kiri/init.js b/src/kiri/init.js index 538fe453..986f3a06 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -1615,12 +1615,13 @@ showSpeeds: UC.newBoolean(LANG.op_sped_s, speedSave, {title:LANG.op_sped_l}), lineType: UC.newSelect(LANG.op_line_s, {title: LANG.op_line_l, action: lineTypeSave, modes:FDM}, "linetype"), animesh: UC.newSelect(LANG.op_anim_s, {title: LANG.op_anim_l, action: aniMeshSave, modes:CAM}, "animesh"), - units: UC.newSelect(LANG.op_unit_s, {title: LANG.op_unit_l, action:unitsSave, modes:CAM, trace:true}, "units"), + units: UC.newSelect(LANG.op_unit_s, {title: LANG.op_unit_l, action: unitsSave, modes:CAM, trace:true}, "units"), layout: UC.newGroup(LANG.lo_menu, $('prefs-lay'), {inline: true}), + autoSave: UC.newBoolean(LANG.op_save_s, booleanSave, {title:LANG.op_save_l}), autoLayout: UC.newBoolean(LANG.op_auto_s, booleanSave, {title:LANG.op_auto_l}), freeLayout: UC.newBoolean(LANG.op_free_s, booleanSave, {title:LANG.op_free_l}), - autoSave: UC.newBoolean(LANG.op_save_s, booleanSave, {title:LANG.op_save_l}), + spaceLayout: UC.newInput(LANG.op_spcr_s, {title:LANG.op_spcr_l, convert:UC.toFloat, size:3, units:true}), export: UC.newGroup(LANG.xp_menu, $('prefs-xpo'), {inline: true}), exportOcto: UC.newBoolean(`OctoPrint`, booleanSave), diff --git a/src/kiri/main.js b/src/kiri/main.js index 61afd90d..79a7cba2 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -1755,7 +1755,7 @@ forAllWidgets(function(w) { platform.select(w, true) }) } - function platformLayout(event, space) { + function platformLayout(event, space = settings.controller.spaceLayout) { let auto = UI.autoLayout.checked, proc = settings.process, dev = settings.device, diff --git a/web/kiri/lang/en.js b/web/kiri/lang/en.js index a00056b0..bb307120 100644 --- a/web/kiri/lang/en.js +++ b/web/kiri/lang/en.js @@ -144,6 +144,8 @@ kiri.lang['en-us'] = { op_auto_l: "automatically layout platform\nwhen new items added", op_free_s: "free layout", op_free_l: "permit dragable layout\nno effect in laser mode", + op_spcr_s: "spacing", + op_spcr_l: "spacing between objects\nduring auto layout\nin workspace units", op_invr_s: "invert zoom", op_invr_l: "invert mouse wheel\nscroll zoom", op_save_s: "auto save", From dc55da0232e3b47de6a4cf722635bd3b071da180 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Tue, 9 Feb 2021 13:09:56 -0500 Subject: [PATCH 091/255] fix latent layer retract detection --- src/kiri/print.js | 10 +++++++++- src/mode/fdm/prepare.js | 13 +++++++++---- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/kiri/print.js b/src/kiri/print.js index be7d99a3..6ca50dc9 100644 --- a/src/kiri/print.js +++ b/src/kiri/print.js @@ -538,7 +538,15 @@ } function retract() { - if (preout.length) preout.last().retract = true; + if (preout.length) { + preout.last().retract = true; + } else if (output.length) { + output.last().retract = true; + } else if (opt.pretract) { + opt.pretract(); + } else { + console.log('unable to retract. no preout or output'); + } } function intersectsTop(p1, p2) { diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index f2200066..f0690568 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -218,6 +218,7 @@ } } + let lastLayer; let extruders = []; let extcount = 0; @@ -391,21 +392,24 @@ if (!lastOut || lastOut.extruder !== slice.extruder) { printPoint = purge(slice.extruder, track, layerout, printPoint, slice.z); } - let tmpout = []; let wtb = slice.widget.track.box; // output seek to start point between mesh slices if previous data printPoint = print.slicePrintPath( slice, isBelt ? newPoint(-wtb.w, wtb.d * 2, 0) : printPoint.sub(offset), offset, - tmpout, //layerout, + layerout, { first: slice.index === 0, support: slice.widget.support, - onBelt: slice.onbelt + onBelt: slice.onbelt, + pretract: () => { + if (lastLayer && lastLayer.length) { + lastLayer.last().retract = true; + } + } } ); - layerout.appendAll(tmpout); lastOut = slice; lastExt = lastOut.ext if (layerRetract && layerout.length) { @@ -435,6 +439,7 @@ layerout.layer = layerno++; update((layerno / cake.length) * 0.5, "prepare"); + lastLayer = layerout; slices = []; layerout = []; lastOut = undefined; From 7ab7701f8cc3f9350b910a117f83e45c4553ffcb Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Tue, 9 Feb 2021 15:38:05 -0500 Subject: [PATCH 092/255] resurrect wipe as a post-retraction option --- src/kiri/conf.js | 2 +- src/kiri/init.js | 2 +- src/kiri/print.js | 19 ++++++++++++------- src/mode/fdm/export.js | 1 - src/mode/fdm/prepare.js | 8 ++++++-- web/kiri/lang/en.js | 2 ++ 6 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/kiri/conf.js b/src/kiri/conf.js index d41c6dbd..43eecf9c 100644 --- a/src/kiri/conf.js +++ b/src/kiri/conf.js @@ -330,13 +330,13 @@ outputFanLayer: 1, outputRetractDist: 1.5, outputRetractSpeed: 40, + outputRetractWipe: 0, outputRetractDwell: 20, outputBrimCount: 2, outputBrimOffset: 2, outputShortPoly: 100.0, outputMinSpeed: 10.0, outputCoastDist: 0, - outputWipeDistance: 0, outputLayerRetract: false, outputOriginCenter: true, outputLoopLayers: "", diff --git a/src/kiri/init.js b/src/kiri/init.js index 986f3a06..3e50c115 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -1786,9 +1786,9 @@ advanced: UC.newGroup(LANG.ad_menu, null, {modes:FDM}), outputRetractDist: UC.newInput(LANG.ad_rdst_s, {title:LANG.ad_rdst_l, convert:UC.toFloat, modes:FDM}), outputRetractSpeed: UC.newInput(LANG.ad_rrat_s, {title:LANG.ad_rrat_l, convert:UC.toInt, modes:FDM}), + outputRetractWipe: UC.newInput(LANG.ad_wpln_s, {title:LANG.ad_wpln_l, bound:UC.bound(0.0,10), convert:UC.toFloat, modes:FDM}), outputRetractDwell: UC.newInput(LANG.ad_rdwl_s, {title:LANG.ad_rdwl_l, convert:UC.toInt, modes:FDM}), fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}), - // outputWipeDistance: UC.newInput("wipe", {title:"non-printing move at\close of polygon\nin millimeters", bound:UC.bound(0.0,10), convert:UC.toFloat, modes:FDM}), sliceSolidMinArea: UC.newInput(LANG.ad_msol_s, {title:LANG.ad_msol_l, convert:UC.toFloat, modes:FDM}), outputMinSpeed: UC.newInput(LANG.ad_mins_s, {title:LANG.ad_mins_l, bound:UC.bound(5,200), convert:UC.toFloat, modes:FDM}), outputShortPoly: UC.newInput(LANG.ad_spol_s, {title:LANG.ad_spol_l, bound:UC.bound(0,10000), convert:UC.toFloat, modes:FDM}), diff --git a/src/kiri/print.js b/src/kiri/print.js index 6ca50dc9..5d97b2c3 100644 --- a/src/kiri/print.js +++ b/src/kiri/print.js @@ -449,7 +449,6 @@ first = true, close = !options.open, last = startPoint, - wipeDist = options.wipe || 0, coastDist = options.coast || 0, tool = options.tool; @@ -525,10 +524,12 @@ origin = startPoint.add(offset), zhop = process.zHopDistance || 0, antiBacklash = process.antiBacklash, + wipeDist = process.outputRetractWipe || 0, doSupport = opt.support, isBelt = device.bedBelt, startClone = startPoint.clone(), - z = slice.z; + z = slice.z, + lastPoly; // apply first layer extrusion multipliers if (firstLayer) { @@ -538,12 +539,15 @@ } function retract() { - if (preout.length) { - preout.last().retract = true; - } else if (output.length) { - output.last().retract = true; + let array = preout.length ? preout : output; + if (array.length) { + let last = array.last(); + last.retract = true; + if (wipeDist && lastPoly && last.point) { + addOutput(array, last.point.followTo(lastPoly.center(true), wipeDist)); + } } else if (opt.pretract) { - opt.pretract(); + opt.pretract(wipeDist); } else { console.log('unable to retract. no preout or output'); } @@ -583,6 +587,7 @@ } } }); + lastPoly = output.lastPoly = poly; } } diff --git a/src/mode/fdm/export.js b/src/mode/fdm/export.js index 44da89a2..ea3a1d30 100644 --- a/src/mode/fdm/export.js +++ b/src/mode/fdm/export.js @@ -207,7 +207,6 @@ // console.log({double_retract: zhop}); return; } - // console.log({retract:zhop}); retracted = retDist; moveTo({e:-retracted}, retSpeed, `e-retract ${retDist}`); if (zhop) moveTo({z:zpos + zhop}, seekMMM, "z-hop start"); diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index f0690568..6fc963a9 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -403,9 +403,13 @@ first: slice.index === 0, support: slice.widget.support, onBelt: slice.onbelt, - pretract: () => { + pretract: (wipeDist) => { if (lastLayer && lastLayer.length) { - lastLayer.last().retract = true; + let lastOut = lastLayer.last(); + lastOut.retract = true; + if (wipeDist && lastLayer.lastPoly && lastOut.point) { + print.addOutput(lastLayer, lastOut.point.followTo(lastLayer.lastPoly.center(true), wipeDist)); + } } } } diff --git a/web/kiri/lang/en.js b/web/kiri/lang/en.js index bb307120..ead509dd 100644 --- a/web/kiri/lang/en.js +++ b/web/kiri/lang/en.js @@ -480,6 +480,8 @@ kiri.lang['en-us'] = { ad_rrat_s: "retract rate", ad_rrat_l: "speed of filament\nretraction in mm/s", ad_rdwl_s: "engage dwell", + ad_wpln_s: "retract wipe", + ad_wpln_l: "non-printing move\nafter retraction\nin millimeters", ad_rdwl_l: "time between re-engaging\nfilament and movement\nin milliseconds", ad_scst_s: "shell coast", ad_scst_l: "non-printing end\nof perimeter shells\nin millimeters", From f71dedb5d5a1b6e512040e1ef0e033d50ed18daf Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Tue, 9 Feb 2021 18:29:43 -0500 Subject: [PATCH 093/255] add offset to wipe follow path --- src/kiri/print.js | 2 +- src/mode/fdm/prepare.js | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/kiri/print.js b/src/kiri/print.js index 5d97b2c3..38ec0d61 100644 --- a/src/kiri/print.js +++ b/src/kiri/print.js @@ -587,7 +587,7 @@ } } }); - lastPoly = output.lastPoly = poly; + lastPoly = slice.lastPoly = poly; } } diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index 6fc963a9..9a368da6 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -218,6 +218,7 @@ } } + let lastPoly; let lastLayer; let extruders = []; let extcount = 0; @@ -407,8 +408,8 @@ if (lastLayer && lastLayer.length) { let lastOut = lastLayer.last(); lastOut.retract = true; - if (wipeDist && lastLayer.lastPoly && lastOut.point) { - print.addOutput(lastLayer, lastOut.point.followTo(lastLayer.lastPoly.center(true), wipeDist)); + if (wipeDist && lastPoly && lastOut.point) { + print.addOutput(lastLayer, lastOut.point.followTo(lastPoly.center(true).add(offset), wipeDist)); } } } @@ -416,6 +417,8 @@ ); lastOut = slice; lastExt = lastOut.ext + lastPoly = slice.lastPoly; + lastLayer = layerout; if (layerRetract && layerout.length) { layerout.last().retract = true; } @@ -443,7 +446,6 @@ layerout.layer = layerno++; update((layerno / cake.length) * 0.5, "prepare"); - lastLayer = layerout; slices = []; layerout = []; lastOut = undefined; From beeea2387c5738f6ce50da6b561334b0360adb75 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Tue, 9 Feb 2021 19:08:28 -0500 Subject: [PATCH 094/255] drop wipe endpoints outside centering poly. drop fill attempt for anchor lines --- src/kiri/print.js | 5 ++++- src/kiri/worker.js | 3 ++- src/mode/fdm/prepare.js | 5 ++++- src/mode/fdm/slice.js | 5 ++++- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/kiri/print.js b/src/kiri/print.js index 38ec0d61..60e17c5f 100644 --- a/src/kiri/print.js +++ b/src/kiri/print.js @@ -544,7 +544,10 @@ let last = array.last(); last.retract = true; if (wipeDist && lastPoly && last.point) { - addOutput(array, last.point.followTo(lastPoly.center(true), wipeDist)); + let endpoint = last.point.followTo(lastPoly.center(true), wipeDist); + if (endpoint.inPolygon(lastPoly)) { + addOutput(array, endpoint); + } } } else if (opt.pretract) { opt.pretract(wipeDist); diff --git a/src/kiri/worker.js b/src/kiri/worker.js index 40148221..4d2e1780 100644 --- a/src/kiri/worker.js +++ b/src/kiri/worker.js @@ -608,7 +608,8 @@ self.onmessage = function(e) { data: output }); } catch (wrkerr) { - console.log({wrkerr}); + // console.log(wrkerr); + console.trace(wrkerr.stack); send.done({error: wrkerr.toString()}); } } else { diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index 9a368da6..b5d2ee5b 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -409,7 +409,10 @@ let lastOut = lastLayer.last(); lastOut.retract = true; if (wipeDist && lastPoly && lastOut.point) { - print.addOutput(lastLayer, lastOut.point.followTo(lastPoly.center(true).add(offset), wipeDist)); + let endpoint = lastOut.point.followTo(lastPoly.center(true).add(offset), wipeDist); + if (endpoint.inPolygon(lastPoly)) { + print.addOutput(lastLayer, endpoint); + } } } } diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index 77b623a0..6eaf1a44 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -943,6 +943,10 @@ // create empty filled line array for each top tops.forEach(function(top) { + // synth belt anchor tops don't want fill + if (!top.fill_lines) { + return; + } const tofill = []; const angfill = []; const newfill = []; @@ -968,7 +972,6 @@ top.fill_lines_ang.poly.push(af.clone()); }); } - top.fill_lines.appendAll(newfill); }); From 7429752d4e0ab43d25df77dd86078710731e49df Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Tue, 9 Feb 2021 19:11:48 -0500 Subject: [PATCH 095/255] bump rev 2.7.D3 --- package.json | 2 +- src/kiri.js | 2 +- src/license.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 67fce7ff..f8d4b3ae 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grid-apps", - "version": "2.7.2D", + "version": "2.7.3D", "description": "grid.space 3d slice & modeling tools", "author": "Stewart Allen ", "license": "MIT", diff --git a/src/kiri.js b/src/kiri.js index f27c1c67..42a087aa 100644 --- a/src/kiri.js +++ b/src/kiri.js @@ -6,7 +6,7 @@ if (!self.kiri) { self.kiri = { - beta: 2702, + beta: 2703, driver: {}, // driver modules loader: [] // module loading: array of functions }; diff --git a/src/license.js b/src/license.js index e150a8eb..e4518816 100644 --- a/src/license.js +++ b/src/license.js @@ -3,7 +3,7 @@ let terms = { COPYRIGHT: "Copyright (C) Stewart Allen - All Rights Reserved", LICENSE: "See the license.md file included with the source distribution", - VERSION: "2.7.D2" + VERSION: "2.7.D3" }; if (typeof(module) === 'object') { From 971e19f527ac66ba3c61f926efb2c8fe7455d06e Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Wed, 10 Feb 2021 01:02:18 -0500 Subject: [PATCH 096/255] checkpoint fdm ranges work --- src/kiri/conf.js | 3 +- src/kiri/init.js | 3 ++ src/kiri/main.js | 111 +++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 108 insertions(+), 9 deletions(-) diff --git a/src/kiri/conf.js b/src/kiri/conf.js index 43eecf9c..6f9f7a69 100644 --- a/src/kiri/conf.js +++ b/src/kiri/conf.js @@ -348,7 +348,8 @@ zHopDistance: 0.2, arcTolerance: 0, antiBacklash: 1, - gcodePause: "" + gcodePause: "", + ranges: [] } }, sla:{ diff --git a/src/kiri/init.js b/src/kiri/init.js index 3e50c115..286bf507 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -1851,6 +1851,9 @@ return settings().device.spindleMax > 0; } + // FDM region override setup + UI.sliceFillSparse.region = true; + // slider setup const slbar = 30; const slbar2 = slbar * 2; diff --git a/src/kiri/main.js b/src/kiri/main.js index 79a7cba2..3dc34203 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -669,11 +669,76 @@ return Math.max(min,Math.min(max,v)); } + function getOverlappingRanges(lo, hi) { + let ranges = []; + for (let range of settings.process.ranges) { + let in_lo = range.lo >= lo && range.lo <= hi; + let in_hi = range.hi >= lo && range.hi <= hi; + if (in_lo || in_hi) { + ranges.push(range); + } + } + return ranges; + } + + function updateRange(lo, hi, values) { + let exact; + // remove matching values from overlapping ranges + for (let range of getOverlappingRanges(lo, hi)) { + if (range.lo === lo && range.hi === hi) { + exact = range; + } + for (let key of Object.keys(values)) { + delete range.fields[key]; + } + } + // add values to matched range or new range + if (!exact) { + exact = { lo, hi, fields: {} }; + settings.process.ranges.push(exact); + } + for (let key of Object.keys(values)) { + exact.fields[key] = values[key]; + } + } + + let overrides = {}; + + // updates that are region (slice range) dependent + function updateFieldsFromRange() { + if (settings.mode !== 'FDM' || viewMode !== VIEWS.SLICE || !settings.process.ranges) { + return; + } + let match = 0; + let values = {}; + let restores = Object.clone(overrides); + let { layer_lo, layer_hi } = API.var; + for (let range of getOverlappingRanges(API.var.layer_lo, API.var.layer_hi)) { + for (let key of Object.keys(range.fields)) { + values[key] = range.fields[key]; + overrides[key] = settings.process[key]; + delete restores[key]; + match++; + } + } + if (match) { + updateFieldsFromSettings(values); + } + let rkeys = Object.keys(restores); + if (rkeys.length) { + updateFieldsFromSettings(restores); + for (let key of rkeys) { + delete overrides[key]; + } + } + } + function updateSlider() { API.event.emit("slider.set", { start: (API.var.layer_lo / API.var.layer_max), end: (API.var.layer_hi / API.var.layer_max) }); + updateFieldsFromRange(); } function setVisibleLayer(h, l) { @@ -1894,18 +1959,31 @@ } } + function isEquals(o1, o2) { + if (o1 == o2) return true; + if (Array.isArray(o1) && Array.isArray(o2)) { + if (o1.length === o2.length) { + for (let i=0; i 0 || layer_hi < layer_max) { + values = Object.clone(process); + range = { lo: layer_lo, hi: layer_hi }; + } + updateSettingsFromFields(values, undefined, changes); + if (range) { + updateRange(range.lo, range.hi, changes); + } + } else { + updateSettingsFromFields(process); + } if (device.extruders && device.extruders[device.internal]) { updateSettingsFromFields(device.extruders[device.internal]); } API.conf.save(); - let current = process; let compare = sproc[mode][cproc[mode]]; let same = true; for (let [key, val] of Object.entries(compare).filter(v => v[0] !== 'processName')) { - let tval = current[key]; + let tval = process[key]; // outputLoopLayers misbehaving and setting null on empty if (val === '' && tval == null) { continue; From 0c72cb241216f9c122cc5cdf2823c806c767682f Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Wed, 10 Feb 2021 10:27:36 -0500 Subject: [PATCH 097/255] update engine/client not to depend on API in standlone case --- src/kiri/client.js | 8 +++++--- src/kiri/engine.js | 2 ++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/kiri/client.js b/src/kiri/client.js index 8944164f..116f7143 100644 --- a/src/kiri/client.js +++ b/src/kiri/client.js @@ -120,11 +120,13 @@ KIRI.work = { }, // widget sync - sync: function() { + sync: function(widgets) { + if (!widgets) { + widgets = KIRI.api.widgets.all(); + } // send list of currently valid widgets - send("sync", { valid: KIRI.api.widgets.all().map(w => w.id) }, () => {}); + send("sync", { valid: widgets.map(w => w.id) }, () => {}); // sync any widget that has changed - let widgets = KIRI.api.widgets.all(); widgets.forEach(widget => { if (widget.modified || !syncd[widget.id]) { syncd[widget.id] = true; diff --git a/src/kiri/engine.js b/src/kiri/engine.js index 39efd654..a740d293 100644 --- a/src/kiri/engine.js +++ b/src/kiri/engine.js @@ -97,6 +97,8 @@ class Engine { slice() { return new Promise((accept, reject) => { + KIRI.client.clear(); + KIRI.client.sync([ this.widget ]); KIRI.client.slice(this.settings, this.widget, msg => { this.listener({slice:msg}); if (msg.error) { From 2bb838cea9d5109669a7b9b96a1d62ae5fade9d8 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Wed, 10 Feb 2021 11:45:42 -0500 Subject: [PATCH 098/255] checkpoint range work --- src/kiri/init.js | 6 ++--- src/kiri/main.js | 41 ++++++++++++++++++++++++++++----- src/mode/fdm/client.js | 51 ++++++++++++++++++++++++++++++++++++++---- src/mode/fdm/slice.js | 29 ++++++++++++++++++++---- 4 files changed, 110 insertions(+), 17 deletions(-) diff --git a/src/kiri/init.js b/src/kiri/init.js index 286bf507..378ef906 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -1840,6 +1840,9 @@ slaFirstOffset: UC.newInput(LANG.sa_opzo_s, {title:LANG.sa_opzo_l, convert:UC.toFloat, bound:UC.bound(0,1), modes:SLA}), slaAntiAlias: UC.newSelect(LANG.sa_opaa_s, {title:LANG.sa_opaa_l, modes:SLA}, "antialias"), + rangeGroup: UC.newGroup("ranges", null, {modes:FDM, group:"ranges"}), + rangeList: UC.newRow([], {}), + settingsGroup: UC.newGroup(LANG.se_menu, $('settings')), settingsTable: UC.newRow([ UI.settingsLoad = UC.newButton(LANG.se_load, settingsLoad) ]), settingsTable: UC.newRow([ UI.settingsSave = UC.newButton(LANG.se_save, settingsSave) ]), @@ -1851,9 +1854,6 @@ return settings().device.spindleMax > 0; } - // FDM region override setup - UI.sliceFillSparse.region = true; - // slider setup const slbar = 30; const slbar2 = slbar * 2; diff --git a/src/kiri/main.js b/src/kiri/main.js index 3dc34203..c36249a3 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -681,8 +681,10 @@ return ranges; } - function updateRange(lo, hi, values) { + // set process override values for a range + function updateRange(lo, hi, values, noadd) { let exact; + let empty = []; // remove matching values from overlapping ranges for (let range of getOverlappingRanges(lo, hi)) { if (range.lo === lo && range.hi === hi) { @@ -691,22 +693,46 @@ for (let key of Object.keys(values)) { delete range.fields[key]; } + if (Object.keys(range.fields).length === 0) { + empty.push(range); + } + } + let ranges = settings.process.ranges; + // clear out empty ranges + if (empty.length) { + for (let range of empty) { + let pos = ranges.indexOf(range); + if (pos >= 0) { + ranges.splice(pos,1); + } + } + } + // noadd flag present when range is 0-max + if (noadd) { + API.event.emit("range.updates", ranges); + return; } // add values to matched range or new range if (!exact) { exact = { lo, hi, fields: {} }; - settings.process.ranges.push(exact); + ranges.push(exact); } for (let key of Object.keys(values)) { exact.fields[key] = values[key]; } + API.event.emit("range.updates", ranges); } let overrides = {}; - // updates that are region (slice range) dependent + // updates editable fields that are range dependent function updateFieldsFromRange() { if (settings.mode !== 'FDM' || viewMode !== VIEWS.SLICE || !settings.process.ranges) { + let okeys = Object.keys(overrides); + if (okeys.length) { + updateFieldsFromSettings(overrides); + overrides = {}; + } return; } let match = 0; @@ -731,6 +757,7 @@ delete overrides[key]; } } + UC.refresh(); } function updateSlider() { @@ -2074,18 +2101,20 @@ return; } updateSettingsFromFields(device); + // range-specific values if (settings.mode === 'FDM' && viewMode === VIEWS.SLICE) { let changes = {}; let values = process; let { layer_lo, layer_hi, layer_max } = API.var; - let range; + let range = { lo: layer_lo, hi: layer_hi }; + let add = false; if (layer_lo > 0 || layer_hi < layer_max) { values = Object.clone(process); - range = { lo: layer_lo, hi: layer_hi }; + add = true; } updateSettingsFromFields(values, undefined, changes); if (range) { - updateRange(range.lo, range.hi, changes); + updateRange(range.lo, range.hi, changes, !add); } } else { updateSettingsFromFields(process); diff --git a/src/mode/fdm/client.js b/src/mode/fdm/client.js index e2f41534..bd84363a 100644 --- a/src/mode/fdm/client.js +++ b/src/mode/fdm/client.js @@ -8,18 +8,31 @@ BASE = self.base, UTIL = BASE.util, FDM = KIRI.driver.FDM, - SPACE, API, + SPACE, API, VIEWS, PROC, UI, UC, p1, p2, iw, lastMode, lastView, lastPillar, isFdmMode = false, addingSupports = false, alert = [], boxes = {}, - func = {}; + func = {}, + rangeVars = { + "sliceShells": "shell count", + "sliceFillType": "fill type", + "sliceFillSparse": "fill fraction" + }; FDM.init = function(kiri, api) { + UI = api.ui; + UC = api.uc; API = api; SPACE = api.const.SPACE; + VIEWS = api.const.VIEWS; + PROC = Object.keys(kiri.conf.defaults.fdm.p); + + for (let key of Object.keys(rangeVars)) { + UI[key].range = true; + } function filterSynth() { api.widgets.filter((widget) => { @@ -31,6 +44,17 @@ }); } + function updateRanges(ranges = []) { + console.log({ranges}); + UI.rangeGroup.style.display = isFdmMode && ranges && ranges.length ? 'flex' : 'none'; + let html = []; + for (let range of ranges) { + html.push(`

${range.lo}-${range.hi}
`); + } + // console.log(UI.rangeGroup.innerHTML); + // UI.rangeGroup.innerHTML = html.join(''); + } + api.event.on("mode.set", mode => { isFdmMode = mode === 'FDM'; lastMode = mode; @@ -40,14 +64,33 @@ lastView = view; updateVisiblity(); filterSynth(); + // let ranges = API.conf.get().process.ranges; + if (isFdmMode) { + if (lastView === VIEWS.SLICE) { + for (let key of PROC) { + if (UI[key] && !UI[key].range) { + UI[key].disabled = true; + } + } + } else { + for (let key of PROC) { + if (UI[key]) UI[key].disabled = false; + } + } + } + // UI.rangeGroup.style.display = ranges && ranges.length ? 'flex' : 'none'; }); + api.event.on("range.updates", updateRanges); api.event.on("settings.load", (settings) => { if (settings.mode !== 'FDM') return; settings.process.outputOriginCenter = (settings.device.originCenter || false); restoreSupports(api.widgets.all()); + updateRanges(settings.process.ranges); }); api.event.on("settings.saved", (settings) => { - // api.ui.fdmSupport.style.display = lastMode !== 'FDM' || settings.device.bedBelt ? 'none' : 'flex'; + updateRanges(settings.process.ranges); + // let ranges = settings.process.ranges; + // UI.rangeGroup.style.display = isFdmMode && ranges && ranges.length ? 'flex' : 'none'; }); api.event.on("button.click", target => { switch (target) { @@ -311,7 +354,7 @@ function updateVisiblity() { API.widgets.all().forEach(w => { - setSupportVisiblity(w, lastMode === 'FDM' && lastView === API.const.VIEWS.ARRANGE); + setSupportVisiblity(w, lastMode === 'FDM' && lastView === VIEWS.ARRANGE); }); } diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index 6eaf1a44..0a443de9 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -42,6 +42,23 @@ return opt; } + function getRangeParameters(settings, index) { + let ranges = settings.process.ranges; + if (!(ranges && ranges.length)) { + return settings.process; + } + let params = Object.clone(settings.process); + for (let range of ranges) { + if (index >= range.lo && index <= range.hi) { + for (let [key,value] of Object.entries(range.fields)) { + params[key] = value; + params._range = true; + } + } + } + return params; + } + /** * DRIVER SLICE CONTRACT * @@ -274,6 +291,7 @@ // create shells and diff inner fillable areas forSlices(0.0, 0.2, slice => { + let params = getRangeParameters(settings, slice.index); let first = slice.index === 0; let solid = ( slice.index < spro.sliceBottomLayers || @@ -283,7 +301,7 @@ let spaceMult = first ? spro.firstLayerLineMult || 1 : 1; let offset = shellOffset * spaceMult; let fillOff = fillOffset * spaceMult; - let count = isSynth ? 1 : spro.sliceShells; + let count = isSynth ? 1 : params.sliceShells; doShells(slice, count, offset, fillOff, { vase: vaseMode, thin: spro.detectThinWalls && !isSynth, @@ -376,16 +394,18 @@ // sparse layers only present when non-vase mose and sparse % > 0 if (doSparseFill && !isSynth) { forSlices(0.5, 0.7, slice => { + let params = getRangeParameters(settings, slice.index); doSparseLayerFill(slice, { settings: settings, process: spro, device: sdev, lineWidth: lineWidth, spacing: fillOffset, - density: spro.sliceFillSparse, + density: params.sliceFillSparse, bounds: widget.getBoundingBox(), height: sliceHeight, - type: spro.sliceFillType + type: params.sliceFillType, + cache: params._range !== true }); }, "infill"); } else if (isSynth && supportDensity) { @@ -665,6 +685,7 @@ density = options.density, // density of infill 0.0 - 1.0 bounds = options.bounds, // bounding box of widget height = options.height, // z layer height + cache = !(options.cache === false), type = options.type || 'hex'; if (slice.tops.length === 0 || density === 0.0 || slice.isSolidLayer) { @@ -736,7 +757,7 @@ // update fill fingerprint for this slice slice._fill_finger = POLY.fingerprint(polys); - let skippable = FILLFIXED[type] ? true : false; + let skippable = cache && FILLFIXED[type] ? true : false; let miss = false; // if the layer below has the same fingerprint, // we may be able to clone the infill instead of regenerating it From 081a3205bf7d71e907f08f1abd49c75c5d1737b6 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Wed, 10 Feb 2021 14:56:57 -0500 Subject: [PATCH 099/255] checkpoint range work --- src/mode/fdm/client.js | 28 +++++++++++++++++++++++----- web/kiri/index.css | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 5 deletions(-) diff --git a/src/mode/fdm/client.js b/src/mode/fdm/client.js index bd84363a..50cc8bec 100644 --- a/src/mode/fdm/client.js +++ b/src/mode/fdm/client.js @@ -45,14 +45,32 @@ } function updateRanges(ranges = []) { - console.log({ranges}); UI.rangeGroup.style.display = isFdmMode && ranges && ranges.length ? 'flex' : 'none'; let html = []; - for (let range of ranges) { - html.push(`
${range.lo}-${range.hi}
`); + let bind = []; + let now = Date.now(); + let sorted = ranges.sort((a,b) => b.lo - a.lo); + for (let range of sorted) { + let id = (now++).toString(36); + let rows = Object.entries(range.fields).map(a => `
`).join(''); + let hover = `
${rows}
`; + let info = ``; + html.appendAll([ + `
${hover}${info}
` + ]); + bind.push({id, range}); } - // console.log(UI.rangeGroup.innerHTML); - // UI.rangeGroup.innerHTML = html.join(''); + UI.rangeGroup.firstElementChild.innerHTML = html.join(''); + for (let rec of bind) { + $(`sel_${rec.id}`).onclick = () => { + api.show.layer(rec.range.hi, rec.range.lo); + }; + $(`del_${rec.id}`).onclick = () => { + let io = ranges.indexOf(rec.range); + ranges.splice(io,1); + updateRanges(ranges); + }; + } } api.event.on("mode.set", mode => { diff --git a/web/kiri/index.css b/web/kiri/index.css index 907e440d..7dba4262 100644 --- a/web/kiri/index.css +++ b/web/kiri/index.css @@ -1511,3 +1511,35 @@ th, tr, td, label { #lab-axis:hover, #lab-scale:hover { background-color: rgba(0,0,0,0.2); } + +.range-info { + position: relative; +} +.range-info:hover .range-detail { + display: flex; +} +.range-detail { + position: absolute; + display: none; + flex-direction: column; + bottom: 50%; + right: 100%; + padding: 5px; + margin: 0 10px 0 10px; + font-size: smaller; + font-family: monospace; + transform: translateY(50%); + background-color: rgba(255,255,255,0.8); + border: 1px solid #aaa; + border-radius: 5px; +} +.range-detail label.pad { + padding-right: 8px; + border-bottom: 1px solid rgba(0,0,0,0.1); +} +.range-detail label.val { + font-weight: bold; +} +.range-detail span { + flex-grow: 1; +} \ No newline at end of file From 1447dd53360dd17403e5a8b7e7d89ace154fb6f0 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Wed, 10 Feb 2021 16:10:18 -0500 Subject: [PATCH 100/255] complete range prototype --- src/kiri/main.js | 99 +++++++++++++++++++++++++++++++++--------------- src/kiri/ui.js | 4 ++ 2 files changed, 72 insertions(+), 31 deletions(-) diff --git a/src/kiri/main.js b/src/kiri/main.js index c36249a3..279ec9c3 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -682,44 +682,67 @@ } // set process override values for a range - function updateRange(lo, hi, values, noadd) { - let exact; - let empty = []; - // remove matching values from overlapping ranges - for (let range of getOverlappingRanges(lo, hi)) { - if (range.lo === lo && range.hi === hi) { - exact = range; - } - for (let key of Object.keys(values)) { - delete range.fields[key]; - } - if (Object.keys(range.fields).length === 0) { - empty.push(range); - } - } + function updateRange(lo, hi, values, add) { let ranges = settings.process.ranges; - // clear out empty ranges - if (empty.length) { - for (let range of empty) { - let pos = ranges.indexOf(range); - if (pos >= 0) { - ranges.splice(pos,1); + let slices = {}; + let min = lo; + let max = hi; + + // just remove values from matching ranges + if (!add) { + for (let range of getOverlappingRanges(lo, hi)) { + for (let key of Object.keys(values)) { + delete range.fields[key]; + } + if (Object.keys(range.fields).length === 0) { + let pos = ranges.indexOf(range); + if (pos >= 0) { + ranges.splice(pos,1); + } } } - } - // noadd flag present when range is 0-max - if (noadd) { API.event.emit("range.updates", ranges); return; } - // add values to matched range or new range - if (!exact) { - exact = { lo, hi, fields: {} }; - ranges.push(exact); + + // flatten ranges + ranges.push({lo, hi, fields: values}); + for (let range of ranges) { + min = Math.min(range.lo, min); + max = Math.max(range.hi, max); + for (let i=range.lo; i<=range.hi; i++) { + let slice = slices[i]; + if (!slice) { + slice = slices[i] = {}; + } + for (let [key,val] of Object.entries(range.fields)) { + slice[key] = val; + } + } } - for (let key of Object.keys(values)) { - exact.fields[key] = values[key]; + + // merge contiguous matching ranges + ranges.length = 0; + let range; + for (let i=min; i<=max; i++) { + let slice = slices[i]; + if (slice && !range) { + range = {lo: i, hi: i, fields: slice}; + } else if (slice && range && isEquals(range.fields, slice)) { + range.hi = i; + } else if (range) { + ranges.push(range); + if (slice) { + range = {lo: i, hi: i, fields: slice}; + } else { + range = undefined; + } + } } + + ranges.push(range); + updateFieldsFromSettings(settings.process); + API.show.alert("update ranges", 2); API.event.emit("range.updates", ranges); } @@ -727,6 +750,7 @@ // updates editable fields that are range dependent function updateFieldsFromRange() { + return; if (settings.mode !== 'FDM' || viewMode !== VIEWS.SLICE || !settings.process.ranges) { let okeys = Object.keys(overrides); if (okeys.length) { @@ -1997,6 +2021,14 @@ } return true; } + } else if (typeof(o1) === 'object' && typeof(o2) === 'object') { + let keys = Object.keys(Object.assign({}, o1, o2)); + for (let key of keys) { + if (o1[key] !== o2[key]) { + return false; + } + } + return true; } return false; } @@ -2009,6 +2041,8 @@ return console.trace("missing scope"); } + let lastChange = UC.lastChange(); + // for each key in setrec object for (let key in setrec) { if (!setrec.hasOwnProperty(key)) { @@ -2041,6 +2075,9 @@ } else { continue; } + if (lastChange === uie) { + if (changes) changes[key] = nval; + } if (!isEquals(setrec[key], nval)) { setrec[key] = nval; if (changes) { @@ -2114,7 +2151,7 @@ } updateSettingsFromFields(values, undefined, changes); if (range) { - updateRange(range.lo, range.hi, changes, !add); + updateRange(range.lo, range.hi, changes, add); } } else { updateSettingsFromFields(process); diff --git a/src/kiri/ui.js b/src/kiri/ui.js index 6f37653b..6329ceec 100644 --- a/src/kiri/ui.js +++ b/src/kiri/ui.js @@ -30,6 +30,7 @@ prefix = "tab", state = {}, units = 1, + lastChange = null, lastBtn = null, lastTxt = null, lastPop = null, @@ -40,6 +41,7 @@ KIRI.ui = { prefix: function(pre) { prefix = pre; return kiri.ui }, inputAction: function(fn) { inputAction = fn; return kiri.ui }, + lastChange: function() { return lastChange }, checkpoint, restore, refresh, @@ -684,6 +686,7 @@ } }); ip.addEventListener('blur', function(event) { + lastChange = ip; action(event); if (opt.trigger) { refresh(); @@ -762,6 +765,7 @@ } ip.setVisible = row.setVisible; ip.onchange = function(ev) { + lastChange = ip; action(); }; ip.onclick = (ev) => { From 8ae99ec792e9671a33236cfee379b9b156a63c77 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Wed, 10 Feb 2021 16:57:41 -0500 Subject: [PATCH 101/255] bump rev 2.7.D4 --- package.json | 2 +- src/kiri.js | 2 +- src/license.js | 2 +- src/mode/fdm/slice.js | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index f8d4b3ae..1421b026 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grid-apps", - "version": "2.7.3D", + "version": "2.7.4D", "description": "grid.space 3d slice & modeling tools", "author": "Stewart Allen ", "license": "MIT", diff --git a/src/kiri.js b/src/kiri.js index 42a087aa..b7eb8166 100644 --- a/src/kiri.js +++ b/src/kiri.js @@ -6,7 +6,7 @@ if (!self.kiri) { self.kiri = { - beta: 2703, + beta: 2704, driver: {}, // driver modules loader: [] // module loading: array of functions }; diff --git a/src/license.js b/src/license.js index e4518816..019d0d42 100644 --- a/src/license.js +++ b/src/license.js @@ -3,7 +3,7 @@ let terms = { COPYRIGHT: "Copyright (C) Stewart Allen - All Rights Reserved", LICENSE: "See the license.md file included with the source distribution", - VERSION: "2.7.D3" + VERSION: "2.7.D4" }; if (typeof(module) === 'object') { diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index 0a443de9..ae80203e 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -296,7 +296,7 @@ let solid = ( slice.index < spro.sliceBottomLayers || slice.index > slices.length - spro.sliceTopLayers-1 || - spro.sliceFillSparse > 0.95 + params.sliceFillSparse > 0.95 ) && !vaseMode && !isSynth; let spaceMult = first ? spro.firstLayerLineMult || 1 : 1; let offset = shellOffset * spaceMult; From d2487f1b08f9ee59acdbbd5a242009c6c4c60848 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Wed, 10 Feb 2021 20:11:03 -0500 Subject: [PATCH 102/255] add some platform tween effects --- src/mode/fdm/slice.js | 7 +++++-- src/moto/space.js | 44 ++++++++++++++++++++++++++++++++++--------- 2 files changed, 40 insertions(+), 11 deletions(-) diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index ae80203e..d84603e2 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -393,8 +393,10 @@ // sparse layers only present when non-vase mose and sparse % > 0 if (doSparseFill && !isSynth) { + let lastType; forSlices(0.5, 0.7, slice => { let params = getRangeParameters(settings, slice.index); + let newType = params.sliceFillType; doSparseLayerFill(slice, { settings: settings, process: spro, @@ -404,9 +406,10 @@ density: params.sliceFillSparse, bounds: widget.getBoundingBox(), height: sliceHeight, - type: params.sliceFillType, - cache: params._range !== true + type: newType, + cache: params._range !== true && lastType === newType }); + lastType = newType; }, "infill"); } else if (isSynth && supportDensity) { forSlices(0.5, 0.7, slice => { diff --git a/src/moto/space.js b/src/moto/space.js index 1d3e7227..0ed0ac35 100644 --- a/src/moto/space.js +++ b/src/moto/space.js @@ -21,6 +21,8 @@ panZ = 0, home = 0, gridZOff = 0, + tweenTime = 500, + tweenDelay = 20, platformZOff = 0, perspective = 35, refreshTimeout = null, @@ -142,7 +144,7 @@ function tweenit() { TWEEN.update(); - setTimeout(tweenit, 20); + setTimeout(tweenit, tweenDelay); } tweenit(); @@ -173,12 +175,13 @@ } } new TWEEN.Tween(from). - to(to, 500). + to(to, tweenTime). onUpdate(tf). onComplete(() => { viewControl.setPosition(pos); updateLastAction(); refresh(); + if (pos.then) pos.then(); }). start(); } @@ -198,7 +201,7 @@ setGrid(); }; new TWEEN.Tween(from). - to(to, 500). + to(to, tweenTime). onStart(start). onUpdate(update). onComplete(complete). @@ -939,12 +942,12 @@ }, view: { - top: function() { tweenCam({left: home, up: 0, panX, panY, panZ}) }, - back: function() { tweenCam({left: PI, up: PI2, panX, panY, panZ}) }, - home: function() { tweenCam({left: home, up: PI4, panX, panY, panZ}) }, - front: function() { tweenCam({left: 0, up: PI2, panX, panY, panZ}) }, - right: function() { tweenCam({left: PI2, up: PI2, panX, panY, panZ}) }, - left: function() { tweenCam({left: -PI2, up: PI2, panX, panY, panZ}) }, + top: function(then) { tweenCam({left: home, up: 0, panX, panY, panZ, then}) }, + back: function(then) { tweenCam({left: PI, up: PI2, panX, panY, panZ, then}) }, + home: function(then) { tweenCam({left: home, up: PI4, panX, panY, panZ, then}) }, + front: function(then) { tweenCam({left: 0, up: PI2, panX, panY, panZ, then}) }, + right: function(then) { tweenCam({left: PI2, up: PI2, panX, panY, panZ, then}) }, + left: function(then) { tweenCam({left: -PI2, up: PI2, panX, panY, panZ, then}) }, reset: function() { viewControl.reset(); requestRefresh() }, load: function(cam) { viewControl.setPosition(cam) }, save: function() { return viewControl.getPosition(true) }, @@ -965,6 +968,21 @@ }, setHome: function(r) { home = r || 0; + }, + spin: function(then, count) { + Space.view.front(() => { + Space.view.right(() => { + Space.view.back(() => { + Space.view.left(() => { + if (--count > 0) { + Space.view.spin(then, count); + } else { + Space.view.front(then); + } + }); + }); + }); + }); } }, @@ -985,6 +1003,14 @@ selectRecurse = b; }, + setTweenTime: function(t) { + tweenTime = t || 500; + }, + + setTweenDelay: function(d) { + tweenDelay = d || 20; + }, + objects: function() { return WC; }, From f98b0642c91f1685a0eebc0f7d3f45421ba1785a Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 11 Feb 2021 09:23:22 -0500 Subject: [PATCH 103/255] fix profile export / import to support utf8 / unicode --- app.js | 1 + package.json | 1 + src/kiri/main.js | 6 +++--- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app.js b/app.js index 461487ac..81d9e24b 100644 --- a/app.js +++ b/app.js @@ -246,6 +246,7 @@ const script = { "ext/tween", "ext/fsave", "ext/earcut", // work.test + "ext/base64", "add/array", "add/three", "geo/base", diff --git a/package.json b/package.json index 1421b026..f124c378 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "slicer" ], "dependencies": { + "base64-js": "^1.5.1", "buffer-crc32": "^0.2.13", "compression": "^1.7.4", "connect": "^3.7.0", diff --git a/src/kiri/main.js b/src/kiri/main.js index 279ec9c3..253b3449 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -2194,7 +2194,7 @@ function settingsImport(data, ask) { if (typeof(data) === 'string') { try { - data = JSON.parse(atob(data)); + data = JSON.parse(new TextDecoder().decode(base64js.toByteArray(data))); } catch (e) { UC.alert('invalid settings format'); console.log('data',data); @@ -2269,7 +2269,7 @@ const shot = opts.work || opts.screen ? SPACE.screenshot() : undefined; const work = opts.work ? KIRI.codec.encode(WIDGETS,{_json_:true}) : undefined; const view = opts.work ? SPACE.view.save() : undefined; - return btoa(JSON.stringify({ + return base64js.fromByteArray(new TextEncoder().encode(JSON.stringify({ settings: settings, version: KIRI.version, screen: shot, @@ -2280,7 +2280,7 @@ moto: MOTO.id, init: SDB.getItem('kiri-init'), time: Date.now() - })); + }))); } function platformLoadFiles(files,group) { From da799ca9d2a618c9375549cca2a05ea402453833 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 11 Feb 2021 10:10:48 -0500 Subject: [PATCH 104/255] disable extruder - button on stock devices --- src/kiri/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kiri/main.js b/src/kiri/main.js index 253b3449..64773e75 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -2110,7 +2110,7 @@ device.internal++; updateExtruderFields(device); }; - UI.extDel.disabled = device.extruders.length < 2; + UI.extDel.disabled = UI.extDel.disabled || device.extruders.length < 2; UI.extDel.onclick = function() { device.extruders.splice(device.internal,1); device.internal = Math.min(device.internal, device.extruders.length-1); From 14109110388dda344363206bcc4620696206468a Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 11 Feb 2021 11:02:18 -0500 Subject: [PATCH 105/255] added lay flat to context menu. fixed duplicate and mirror --- notes.md | 2 + src/kiri/init.js | 99 ++++++++++++++++++++++++++++++--------------- web/kiri/index.html | 1 + web/kiri/lang/en.js | 2 +- 4 files changed, 70 insertions(+), 34 deletions(-) diff --git a/notes.md b/notes.md index b065103e..d07e0c0c 100644 --- a/notes.md +++ b/notes.md @@ -11,6 +11,8 @@ * `P` client/worker interface normalization * `P` explore widget vertex reloading / replacing (Onshape primarily) +* `F` show slider range values in workspace units (on hover?) +* `F` allow select of a range by typing in values in slices or workspace units * `F` add % field type with conversion (like units) * `F` complete G2/G3 arc output / input (85% now) * `F` expose grouping feature diff --git a/src/kiri/init.js b/src/kiri/init.js index 378ef906..6787c445 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -58,7 +58,8 @@ editTools = null, maxTool = 0, fpsTimer = null, - platformColor; + platformColor, + contextInt; // extend KIRI API with local functions API.show.devices = showDevices; @@ -322,10 +323,7 @@ } function keyHandler(evt) { - let handled = true, - current = settings(), - style, sel, i, m, bb, - ncc = evt.charCode - 48; + let handled = true; if (API.modal.visible() || inputHasFocus()) { return false; } @@ -426,35 +424,10 @@ API.show.slices(); break; case cca('d'): // duplicate object - sel = API.selection.meshes(); - platform.deselect(); - for (i=0; i { - tab.id = Date.now() + i - }); - } - KIRI.driver.CAM.restoreTabs([nw]); - } + duplicateSelection(); break; case cca('m'): // mirror object - API.selection.for_widgets(function(widget) { - widget.mirror(); - }); - SPACE.update(); + mirrorSelection(); break; case cca('R'): // toggle slice render mode renderMode++; @@ -475,10 +448,53 @@ handled = false; break; } - if (handled) evt.preventDefault(); + if (handled) { + evt.preventDefault(); + evt.stopPropagation(); + } return false; } + function layFlat() { + let int = contextInt[0]; + if (int && int.object && int.object.widget) { + let q = new THREE.Quaternion(); + q.setFromUnitVectors(contextInt[0].face.normal, new THREE.Vector3(0,0,-1)); + API.selection.rotate(q); + } + } + + function duplicateSelection() { + API.selection.for_widgets(function(widget) { + let mesh = widget.mesh; + mesh.geometry = mesh.geometry.clone(); + mesh.material = mesh.material.clone(); + let bb = mesh.getBoundingBox(); + let ow = widget; + let nw = API.widgets.new().loadGeometry(mesh.geometry); + nw.meta.file = ow.meta.file; + nw.meta.vertices = ow.meta.vertices; + nw.move(bb.max.x - bb.min.x + 1, 0, 0); + platform.add(nw,true); + let owa = API.widgets.annotate(ow.id); + let nwa = API.widgets.annotate(nw.id); + if (owa.tab) { + nwa.tab = Object.clone(owa.tab); + nwa.tab.forEach((tab,i) => { + tab.id = Date.now() + i + }); + } + KIRI.driver.CAM.restoreTabs([nw]); + }); + } + + function mirrorSelection() { + API.selection.for_widgets(function(widget) { + widget.mirror(); + }); + SPACE.update(); + } + function keys(o) { let key, list = []; for (key in o) { if (o.hasOwnProperty(key)) list.push(key) } @@ -2183,8 +2199,15 @@ if (int) API.event.emit('mouse.hover', {point: int, event, type: 'platform'}); }); + // block standard browser context menu + DOC.oncontextmenu = (event) => { + event.preventDefault(); + event.stopPropagation(); + }; + SPACE.mouse.up((event, int) => { if (event.button === 2 && API.view.isArrange()) { + console.log({up: event, int}); let style = UI.context.style; style.display = 'flex'; style.left = `${event.clientX-3}px`; @@ -2192,6 +2215,9 @@ UI.context.onmouseleave = () => { style.display = ''; }; + event.preventDefault(); + event.stopPropagation(); + contextInt = int; } }); @@ -2217,6 +2243,10 @@ // return selected meshes for further mouse processing return API.feature.hovers || API.selection.meshes(); } + if (event.button === 2 && API.view.isArrange()) { + event.preventDefault(); + event.stopPropagation(); + } }); SPACE.mouse.upSelect(function(object, event) { @@ -2465,6 +2495,9 @@ $('context-export-stl').onclick = () => { objectsExport() }; $('context-export-workspace').onclick = () => { profileExport(true) }; $('context-clear-workspace').onclick = () => { API.platform.clear(); UI.context.onmouseleave() }; + $('context-duplicate').onclick = duplicateSelection; + $('context-mirror').onclick = mirrorSelection; + $('context-layflat').onclick = layFlat; UI.modal.onclick = API.modal.hide; UI.modalBox.onclick = (ev) => { ev.stopPropagation() }; diff --git a/web/kiri/index.html b/web/kiri/index.html index 502dfc1a..fddfea3d 100644 --- a/web/kiri/index.html +++ b/web/kiri/index.html @@ -443,6 +443,7 @@
+
diff --git a/web/kiri/lang/en.js b/web/kiri/lang/en.js index ead509dd..8fdf8cca 100644 --- a/web/kiri/lang/en.js +++ b/web/kiri/lang/en.js @@ -496,7 +496,7 @@ kiri.lang['en-us'] = { ad_zhop_s: "z hop dist", ad_zhop_l: "amount to raise z\non retraction moves\nin millimeters\n0 to disable", ad_abkl_s: "anti-backlash", - ad_abkl_l: "for better flat surface finish\nuse micro-movements to cancel\nbacklash in solid layer output\nin millimeters\n0 to disable", + ad_abkl_l: "for better flat surface finish\nuse micro-movements to cancel\nbacklash in solid layer output\nin millimeters\n0 to disable\nif your firmware has M425\nput that in the gcode header\nand leave this as 0", ad_lret_s: "layer retract", ad_lret_l: "force filament retraction\nbetween layers", ad_play_s: "polish layers", From edf6b6671f5c07f26932bff2c741e99b83c2c86d Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 11 Feb 2021 14:01:48 -0500 Subject: [PATCH 106/255] add base64 lib link --- src/ext/base64.js | 1 + 1 file changed, 1 insertion(+) create mode 120000 src/ext/base64.js diff --git a/src/ext/base64.js b/src/ext/base64.js new file mode 120000 index 00000000..38f8c7a5 --- /dev/null +++ b/src/ext/base64.js @@ -0,0 +1 @@ +../../node_modules/base64-js/base64js.min.js \ No newline at end of file From b172e29054d01b8c654a2562ac06a283f5752b6a Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 11 Feb 2021 14:33:00 -0500 Subject: [PATCH 107/255] enable more range parameters. localize --- src/kiri/print.js | 3 +-- src/mode/fdm/client.js | 36 +++++++++++++++++++++++++++++------- src/mode/fdm/driver.js | 18 ++++++++++++++++++ src/mode/fdm/prepare.js | 5 ++++- src/mode/fdm/slice.js | 20 ++------------------ 5 files changed, 54 insertions(+), 28 deletions(-) diff --git a/src/kiri/print.js b/src/kiri/print.js index 60e17c5f..e5533dc3 100644 --- a/src/kiri/print.js +++ b/src/kiri/print.js @@ -495,13 +495,12 @@ */ PRO.slicePrintPath = function(slice, startPoint, offset, output, opt = {}) { // console.log({slicePrintPath: slice.index, ext:slice.extruder}); - let i, preout = [], scope = this, settings = this.settings, device = settings.device, - process = settings.process, + process = opt.params || settings.process, extruder = slice.extruder || 0, nozzleSize = device.extruders[extruder].extNozzle, firstLayer = opt.first || false, diff --git a/src/mode/fdm/client.js b/src/mode/fdm/client.js index 50cc8bec..74a73b57 100644 --- a/src/mode/fdm/client.js +++ b/src/mode/fdm/client.js @@ -8,19 +8,14 @@ BASE = self.base, UTIL = BASE.util, FDM = KIRI.driver.FDM, - SPACE, API, VIEWS, PROC, UI, UC, + SPACE, API, VIEWS, LANG, PROC, UI, UC, p1, p2, iw, lastMode, lastView, lastPillar, isFdmMode = false, addingSupports = false, alert = [], boxes = {}, - func = {}, - rangeVars = { - "sliceShells": "shell count", - "sliceFillType": "fill type", - "sliceFillSparse": "fill fraction" - }; + func = {}; FDM.init = function(kiri, api) { UI = api.ui; @@ -28,8 +23,35 @@ API = api; SPACE = api.const.SPACE; VIEWS = api.const.VIEWS; + LANG = KIRI.lang.current; PROC = Object.keys(kiri.conf.defaults.fdm.p); + let rangeVars = { + "sliceShells": LANG.sl_shel_s, + "sliceFillType": LANG.fi_type, + "sliceFillSparse": LANG.fi_pcnt_s, + "sliceShellOrder": LANG.sl_ordr_s, + "outputTemp": LANG.ou_nozl_s, + "outputBedTemp": LANG.ou_bedd_s, + "outputFeedrate": LANG.ou_feed_s, + "outputFinishrate": LANG.ou_fini_s, + "outputShellMult": LANG.ou_shml_s, + "outputFillMult": LANG.ou_flml_s, + "outputSparseMult": LANG.ou_spml_s, + "outputRetractDist": LANG.ad_rdst_s, + "outputRetractSpeed": LANG.outputRetractSpeed, + "outputRetractWipe": LANG.ad_wpln_s, + "outputRetractDwell": LANG.ad_rdwl_s, + "outputShortPoly": LANG.ad_spol_s, + "outputMinSpeed": LANG.ad_mins_s, + "outputCoastDist": LANG.ad_scst_s, + "sliceSupportDensity": LANG.sp_dens_s, + "sliceSupportOffset": LANG.sp_offs_s, + "sliceSolidMinArea": LANG.ad_msol_s, + "sliceLayerStart": LANG.sl_strt_s, + "zHopDistance": LANG.ad_zhop_s + }; + for (let key of Object.keys(rangeVars)) { UI[key].range = true; } diff --git a/src/mode/fdm/driver.js b/src/mode/fdm/driver.js index 04f6d7ed..240d025d 100644 --- a/src/mode/fdm/driver.js +++ b/src/mode/fdm/driver.js @@ -14,6 +14,7 @@ // slice, // src/mode/fdm/slice.js // prepare, // src/mode/fdm/prepare.js // export, // src/mode/fdm/export.js + getRangeParameters, fixExtruders }; @@ -28,6 +29,23 @@ return settings; } + function getRangeParameters(settings, index) { + let ranges = settings.process.ranges; + if (!(ranges && ranges.length)) { + return settings.process; + } + let params = Object.clone(settings.process); + for (let range of ranges) { + if (index >= range.lo && index <= range.hi) { + for (let [key,value] of Object.entries(range.fields)) { + params[key] = value; + params._range = true; + } + } + } + return params; + } + // customer gcode post function for XYZ daVinci Mini W self.kiri_fdm_xyz_mini_w = function(gcode, options) { return btoa("; filename = kirimoto.gcode\n; machine = dv1MW0A000\n" + gcode); diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index b5d2ee5b..1d40fa56 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -10,7 +10,8 @@ POLY = BASE.polygons, FDM = KIRI.driver.FDM, newPoint = BASE.newPoint, - newPolygon = BASE.newPolygon; + newPolygon = BASE.newPolygon, + getRangeParameters = FDM.getRangeParameters; /** * DRIVER PRINT CONTRACT @@ -379,6 +380,7 @@ return a.dst - b.dst; }); let { z, slice, offset } = order[0]; + let params = getRangeParameters(settings, slice.index); slice.prep = true; // retract between widgets or layers (when set) if (layerout.length && slice.widget !== lastWidget) { @@ -401,6 +403,7 @@ offset, layerout, { + params, // range parameters first: slice.index === 0, support: slice.widget.support, onBelt: slice.onbelt, diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index d84603e2..0fd90687 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -24,7 +24,8 @@ support: { check: 0xaa5533, face: 0xaa5533, line: 0xaa5533, opacity: 1 } }, PROTO = Object.clone(COLOR), - bwcomp = (1 / Math.cos(Math.PI/4)); + bwcomp = (1 / Math.cos(Math.PI/4)), + getRangeParameters = FDM.getRangeParameters; let isThin = false; // force line rendering let isFlat = false; // force flat rendering @@ -42,23 +43,6 @@ return opt; } - function getRangeParameters(settings, index) { - let ranges = settings.process.ranges; - if (!(ranges && ranges.length)) { - return settings.process; - } - let params = Object.clone(settings.process); - for (let range of ranges) { - if (index >= range.lo && index <= range.hi) { - for (let [key,value] of Object.entries(range.fields)) { - params[key] = value; - params._range = true; - } - } - } - return params; - } - /** * DRIVER SLICE CONTRACT * From b71ff1fa0b213e81db5137c92257944b270b5002 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 11 Feb 2021 17:34:42 -0500 Subject: [PATCH 108/255] checkpoint range work --- notes.md | 1 + src/kiri/print.js | 2 -- src/mode/fdm/client.js | 17 ++++++++++------- src/mode/fdm/export.js | 31 ++++++++++++++++++------------- 4 files changed, 29 insertions(+), 22 deletions(-) diff --git a/notes.md b/notes.md index d07e0c0c..9d417de6 100644 --- a/notes.md +++ b/notes.md @@ -40,6 +40,7 @@ * `F` apply finish speed to exposed top and underside flat areas * `F` expand internal supporting flats / solids before projection +* `P` extruder + filament max flow rate cap in planner * `P` revisit path routing / optimization * `P` implement infill clipping in wasm * `P` solid fill the tops of supports for down facing flats diff --git a/src/kiri/print.js b/src/kiri/print.js index e5533dc3..e3cb95ba 100644 --- a/src/kiri/print.js +++ b/src/kiri/print.js @@ -504,7 +504,6 @@ extruder = slice.extruder || 0, nozzleSize = device.extruders[extruder].extNozzle, firstLayer = opt.first || false, - minSeek = nozzleSize * (opt.minSeek || 1.5), thinWall = nozzleSize * (opt.thinWall || 1.75), retractDist = opt.retractOver || 2, fillMult = opt.mult || process.outputFillMult, @@ -524,7 +523,6 @@ zhop = process.zHopDistance || 0, antiBacklash = process.antiBacklash, wipeDist = process.outputRetractWipe || 0, - doSupport = opt.support, isBelt = device.bedBelt, startClone = startPoint.clone(), z = slice.z, diff --git a/src/mode/fdm/client.js b/src/mode/fdm/client.js index 74a73b57..6a03bb47 100644 --- a/src/mode/fdm/client.js +++ b/src/mode/fdm/client.js @@ -27,29 +27,32 @@ PROC = Object.keys(kiri.conf.defaults.fdm.p); let rangeVars = { + // slice "sliceShells": LANG.sl_shel_s, "sliceFillType": LANG.fi_type, "sliceFillSparse": LANG.fi_pcnt_s, + "sliceSolidMinArea": LANG.ad_msol_s, + // prepare "sliceShellOrder": LANG.sl_ordr_s, - "outputTemp": LANG.ou_nozl_s, - "outputBedTemp": LANG.ou_bedd_s, "outputFeedrate": LANG.ou_feed_s, "outputFinishrate": LANG.ou_fini_s, "outputShellMult": LANG.ou_shml_s, "outputFillMult": LANG.ou_flml_s, "outputSparseMult": LANG.ou_spml_s, - "outputRetractDist": LANG.ad_rdst_s, - "outputRetractSpeed": LANG.outputRetractSpeed, "outputRetractWipe": LANG.ad_wpln_s, - "outputRetractDwell": LANG.ad_rdwl_s, "outputShortPoly": LANG.ad_spol_s, "outputMinSpeed": LANG.ad_mins_s, "outputCoastDist": LANG.ad_scst_s, "sliceSupportDensity": LANG.sp_dens_s, "sliceSupportOffset": LANG.sp_offs_s, - "sliceSolidMinArea": LANG.ad_msol_s, "sliceLayerStart": LANG.sl_strt_s, - "zHopDistance": LANG.ad_zhop_s + "zHopDistance": LANG.ad_zhop_s, + // export + "outputTemp": LANG.ou_nozl_s, + "outputBedTemp": LANG.ou_bedd_s, + "outputRetractDist": LANG.ad_rdst_s, + "outputRetractSpeed": LANG.outputRetractSpeed, + "outputRetractDwell": LANG.ad_rdwl_s, }; for (let key of Object.keys(rangeVars)) { diff --git a/src/mode/fdm/export.js b/src/mode/fdm/export.js index ea3a1d30..f172f81d 100644 --- a/src/mode/fdm/export.js +++ b/src/mode/fdm/export.js @@ -15,9 +15,9 @@ FDM.export = function(print, online) { let layers = print.output, settings = FDM.fixExtruders(print.settings), + getRangeParameters = FDM.getRangeParameters, device = settings.device, extruders = device.extruders, - process = settings.process, gcodeFan = device.gcodeFan, gcodeLayer = device.gcodeLayer, gcodeTrack = device.gcodeTrack, @@ -46,11 +46,13 @@ lout = null, last = null, zpos = 0, - zhop = process.zHopDistance || 0, + process = settings.process, + loops = process.outputLoopLayers, + zhop = process.zHopDistance || 0, // range seekMMM = process.outputSeekrate * 60, - retDist = process.outputRetractDist, - retSpeed = process.outputRetractSpeed * 60, - retDwell = process.outputRetractDwell || 0, + retDist = process.outputRetractDist, // range + retSpeed = process.outputRetractSpeed * 60, // range + retDwell = process.outputRetractDwell || 0, // range timeDwell = retDwell / 1000, arcDist = isBelt || !isDanger ? 0 : (process.arcTolerance || 0), originCenter = process.outputOriginCenter, @@ -62,9 +64,9 @@ travel_speed: seekMMM, retract_speed: retSpeed, retract_distance: retDist, - temp: process.firstLayerNozzleTemp || process.outputTemp, - temp_bed: process.firstLayerBedTemp || process.outputBedTemp, - bed_temp: process.firstLayerBedTemp || process.outputBedTemp, + temp: process.firstLayerNozzleTemp || process.outputTemp, // range + temp_bed: process.firstLayerBedTemp || process.outputBedTemp, // range + bed_temp: process.firstLayerBedTemp || process.outputBedTemp, // range fan_speed: process.outputFanMax, speed: process.outputFanMax, // legacy top: offset ? device.bedDepth : device.bedDepth/2, @@ -82,9 +84,8 @@ bytes = 0, bcos = Math.cos(Math.PI/4), icos = 1 / bcos, - loops = process.outputLoopLayers, inLoop, - arcAt, + params, arcQ = []; if (isBelt && loops) { @@ -283,6 +284,10 @@ while (layer < layers.length) { path = layers[layer]; + params = getRangeParameters(settings, path.layer); + // TODO update process settings from params override + // console.log(path.layer, params) + emitPerMM = print.extrudePerMM( extruder.extNozzle, extruder.extFilament, @@ -340,13 +345,13 @@ if (layer === 1) { // update temps when first layer overrides are present if (process.firstLayerNozzleTemp) { - subst.temp = process.outputTemp; + subst.temp = process.outputTemp; // range if (t0) appendSub("M104 S{temp} T0"); if (t1) appendSub("M104 S{temp} T1"); if (!(t0 || t1)) appendSub("M104 S{temp} T{tool}"); } if (process.firstLayerBedTemp) { - subst.bed_temp = subst.temp_bed = process.outputBedTemp; + subst.bed_temp = subst.temp_bed = process.outputBedTemp; // range appendSub("M140 S{temp_bed} T0"); } } @@ -359,7 +364,7 @@ // iterate through layer outputs for (pidx=0; pidx Date: Thu, 11 Feb 2021 18:40:17 -0500 Subject: [PATCH 109/255] fix image converted surface normals --- notes.md | 1 - src/kiri/worker.js | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/notes.md b/notes.md index 9d417de6..c03136da 100644 --- a/notes.md +++ b/notes.md @@ -2,7 +2,6 @@ ## `C` cosmetic, `F` functional, `P` performance, `B` bug fix -* `B` normals possibly inverted on faces in 2D to 3D conversion * `B` origin bug (Onshape?) when switching modes in 2.5 and 2.6 * `P` duplicate objects should share same slice data unless rotated or scaled diff --git a/src/kiri/worker.js b/src/kiri/worker.js index 4d2e1780..49995bb9 100644 --- a/src/kiri/worker.js +++ b/src/kiri/worker.js @@ -414,11 +414,11 @@ KIRI.worker = { let p3 = (x - 0) * height + (y - 0); let p4 = (x - 1) * height + (y - 1); faces[ii++] = p1; - faces[ii++] = p2; faces[ii++] = p3; - faces[ii++] = p1; - faces[ii++] = p4; faces[ii++] = p2; + faces[ii++] = p1; + faces[ii++] = p2; + faces[ii++] = p4; } } send.data({progress: x / width}); From ed08316e096545dd9567e3d355504ab2c14ea3f6 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 11 Feb 2021 18:42:06 -0500 Subject: [PATCH 110/255] bump rev 2.7.D5 --- package.json | 2 +- src/kiri.js | 2 +- src/license.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index f124c378..786ee4ae 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grid-apps", - "version": "2.7.4D", + "version": "2.7.5D", "description": "grid.space 3d slice & modeling tools", "author": "Stewart Allen ", "license": "MIT", diff --git a/src/kiri.js b/src/kiri.js index b7eb8166..0f3eb9ae 100644 --- a/src/kiri.js +++ b/src/kiri.js @@ -6,7 +6,7 @@ if (!self.kiri) { self.kiri = { - beta: 2704, + beta: 2705, driver: {}, // driver modules loader: [] // module loading: array of functions }; diff --git a/src/license.js b/src/license.js index 019d0d42..93f1012f 100644 --- a/src/license.js +++ b/src/license.js @@ -3,7 +3,7 @@ let terms = { COPYRIGHT: "Copyright (C) Stewart Allen - All Rights Reserved", LICENSE: "See the license.md file included with the source distribution", - VERSION: "2.7.D4" + VERSION: "2.7.D5" }; if (typeof(module) === 'object') { From 76dc5be0a5e05918b81ca71eea5591bc2106aa47 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 11 Feb 2021 20:57:18 -0500 Subject: [PATCH 111/255] expand set of range override parameters --- src/kiri/conf.js | 4 +- src/kiri/init.js | 8 ++-- src/mode/fdm/client.js | 3 +- src/mode/fdm/export.js | 83 +++++++++++++++++++++++++++++------------- src/mode/fdm/slice.js | 6 ++- web/kiri/lang/en.js | 12 +++--- 6 files changed, 76 insertions(+), 40 deletions(-) diff --git a/src/kiri/conf.js b/src/kiri/conf.js index 6f9f7a69..0c095f0e 100644 --- a/src/kiri/conf.js +++ b/src/kiri/conf.js @@ -316,10 +316,10 @@ firstLayerBrim: 0, firstLayerBrimTrig: 0, firstLayerBeltLead: 3, + firstLayerFanSpeed: 0, outputRaft: false, outputRaftSpacing: 0.2, outputTemp: 200, - outputFanMax: 255, outputBedTemp: 60, outputFeedrate: 50, outputFinishrate: 50, @@ -327,7 +327,7 @@ outputShellMult: 1.25, outputFillMult: 1.25, outputSparseMult: 1.25, - outputFanLayer: 1, + outputFanSpeed: 255, outputRetractDist: 1.5, outputRetractSpeed: 40, outputRetractWipe: 0, diff --git a/src/kiri/init.js b/src/kiri/init.js index 6787c445..1f344bad 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -1673,6 +1673,7 @@ fdmSep: UC.newBlank({class:"pop-sep", modes:FDM, show:isNotBelt}), firstLayerNozzleTemp:UC.newInput(LANG.fl_nozl_s, {title:LANG.fl_nozl_l, convert:UC.toInt, modes:FDM, show:isNotBelt}), firstLayerBedTemp: UC.newInput(LANG.fl_bedd_s, {title:LANG.fl_bedd_l, convert:UC.toInt, modes:FDM, show:isNotBelt}), + firstLayerFanSpeed: UC.newInput(LANG.ou_fans_s, {title:LANG.ou_fans_l, convert:UC.toInt, bound:UC.bound(0,255), modes:FDM}), fdmSep: UC.newBlank({class:"pop-sep", modes:FDM, show:isNotBelt}), firstLayerYOffset: UC.newInput(LANG.fl_zoff_s, {title:LANG.fl_zoff_l, convert:UC.toFloat, modes:FDM, show:isBelt}), firstLayerRate: UC.newInput(LANG.fl_rate_s, {title:LANG.fl_rate_l, convert:UC.toFloat, modes:FDM}), @@ -1696,9 +1697,10 @@ sliceFillType: UC.newSelect(LANG.fi_type, {modes:FDM}, "infill"), fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}), sliceFillSparse: UC.newInput(LANG.fi_pcnt_s, {title:LANG.fi_pcnt_l, convert:UC.toFloat, bound:UC.bound(0.0,1.0), modes:FDM}), - sliceFillAngle: UC.newInput(LANG.fi_angl_s, {title:LANG.fi_angl_l, convert:UC.toFloat, modes:FDM}), - sliceFillOverlap: UC.newInput(LANG.fi_over_s, {title:LANG.fi_over_l, convert:UC.toFloat, bound:UC.bound(0.0,2.0), modes:FDM}), fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}), + sliceFillOverlap: UC.newInput(LANG.fi_over_s, {title:LANG.fi_over_l, convert:UC.toFloat, bound:UC.bound(0.0,2.0), modes:FDM}), + sliceFillAngle: UC.newInput(LANG.fi_angl_s, {title:LANG.fi_angl_l, convert:UC.toFloat, modes:FDM}), + // fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}), sliceFillRate: UC.newInput(LANG.ou_feed_s, {title:LANG.fi_rate_l, convert:UC.toInt, bound:UC.bound(0,300), modes:FDM}), fdmSupport: UC.newGroup(LANG.sp_menu, null, {modes:FDM, marker:false}), @@ -1777,6 +1779,7 @@ outputTemp: UC.newInput(LANG.ou_nozl_s, {title:LANG.ou_nozl_l, convert:UC.toInt, modes:FDM}), outputBedTemp: UC.newInput(LANG.ou_bedd_s, {title:LANG.ou_bedd_l, convert:UC.toInt, modes:FDM}), + outputFanSpeed: UC.newInput(LANG.ou_fans_s, {title:LANG.ou_fans_l, convert:UC.toInt, bound:UC.bound(0,255), modes:FDM}), fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}), outputFeedrate: UC.newInput(LANG.ou_feed_s, {title:LANG.ou_feed_l, convert:UC.toInt, modes:FDM}), outputFinishrate: UC.newInput(LANG.ou_fini_s, {title:LANG.ou_fini_l, convert:UC.toInt, modes:FDM}), @@ -1786,7 +1789,6 @@ outputFillMult: UC.newInput(LANG.ou_flml_s, {title:LANG.ou_exml_l, convert:UC.toFloat, bound:UC.bound(0.0,2.0), modes:FDM}), outputSparseMult: UC.newInput(LANG.ou_spml_s, {title:LANG.ou_exml_l, convert:UC.toFloat, bound:UC.bound(0.0,2.0), modes:FDM}), fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}), - outputFanLayer: UC.newInput(LANG.ou_fanl_s, {title:LANG.ou_fanl_l, convert:UC.toInt, bound:UC.bound(0,100), modes:FDM}), sliceShellOrder: UC.newSelect(LANG.sl_ordr_s, {title:LANG.sl_ordr_l, modes:FDM}, "shell"), sliceLayerStart: UC.newSelect(LANG.sl_strt_s, {title:LANG.sl_strt_l, modes:FDM}, "start"), camConventional: UC.newBoolean(LANG.ou_conv_s, onBooleanClick, {title:LANG.ou_conv_l, modes:CAM}), diff --git a/src/mode/fdm/client.js b/src/mode/fdm/client.js index 6a03bb47..38b18708 100644 --- a/src/mode/fdm/client.js +++ b/src/mode/fdm/client.js @@ -46,10 +46,11 @@ "sliceSupportDensity": LANG.sp_dens_s, "sliceSupportOffset": LANG.sp_offs_s, "sliceLayerStart": LANG.sl_strt_s, - "zHopDistance": LANG.ad_zhop_s, // export + "zHopDistance": LANG.ad_zhop_s, "outputTemp": LANG.ou_nozl_s, "outputBedTemp": LANG.ou_bedd_s, + "outputFanSpeed": LANG.ou_fans_s, "outputRetractDist": LANG.ad_rdst_s, "outputRetractSpeed": LANG.outputRetractSpeed, "outputRetractDwell": LANG.ad_rdwl_s, diff --git a/src/mode/fdm/export.js b/src/mode/fdm/export.js index f172f81d..25ffd644 100644 --- a/src/mode/fdm/export.js +++ b/src/mode/fdm/export.js @@ -50,7 +50,7 @@ loops = process.outputLoopLayers, zhop = process.zHopDistance || 0, // range seekMMM = process.outputSeekrate * 60, - retDist = process.outputRetractDist, // range + retDist = process.outputRetractDist || 0, // range retSpeed = process.outputRetractSpeed * 60, // range retDwell = process.outputRetractDwell || 0, // range timeDwell = retDwell / 1000, @@ -60,15 +60,21 @@ x: device.bedWidth/2, y: isBelt ? 0 : device.bedDepth/2 }, + nozzleTemp = process.firstLayerNozzleTemp || process.outputTemp, + bedTemp = process.firstLayerBedTemp || process.outputBedTemp, + fanSpeed = process.firstLayerFanSpeed, + lastNozzleTemp = nozzleTemp, + lastBedTemp = bedTemp, + lastFanSpeed = fanSpeed, subst = { travel_speed: seekMMM, retract_speed: retSpeed, retract_distance: retDist, - temp: process.firstLayerNozzleTemp || process.outputTemp, // range - temp_bed: process.firstLayerBedTemp || process.outputBedTemp, // range - bed_temp: process.firstLayerBedTemp || process.outputBedTemp, // range - fan_speed: process.outputFanMax, - speed: process.outputFanMax, // legacy + temp: nozzleTemp, + temp_bed: bedTemp, + bed_temp: bedTemp, + fan_speed: fanSpeed, + speed: fanSpeed, // legacy top: offset ? device.bedDepth : device.bedDepth/2, left: offset ? 0 : -device.bedWidth/2, right: offset ? device.bedWidth : device.bedWidth/2, @@ -85,9 +91,32 @@ bcos = Math.cos(Math.PI/4), icos = 1 / bcos, inLoop, - params, arcQ = []; + // smallish band-aid. refactor above to remove redundancy + function updateParams(layer) { + let process = getRangeParameters(settings, layer); + zhop = process.zHopDistance || 0; // range + retDist = process.outputRetractDist || 0; // range + retSpeed = process.outputRetractSpeed * 60; // range + retDwell = process.outputRetractDwell || 0; // range + timeDwell = retDwell / 1000; + nozzleTemp = process.outputTemp; + bedTemp = process.outputBedTemp; + fanSpeed = process.outputFanSpeed; + Object.assign(subst, { + temp_bed: bedTemp, + bed_temp: bedTemp, + fan_speed: fanSpeed, + speed: fanSpeed, // legacy + retract_speed: retSpeed, + retract_distance: retDist, + temp: process.outputTemp, // range + temp_bed: process.outputBedTemp, // range + bed_temp: process.outputBedTemp, // range + }); + } + if (isBelt && loops) { loops = loops.split(',').map(range => { return range.split('-').map(v => parseInt(v)); @@ -261,6 +290,10 @@ if (comment) { o.append(` ; ${comment}`); } + if (o.length === 1) { + // console.trace({no_move: o, out, newpos, pos, lastp, emit}); + return; + } let line = o.join(''); if (last == line) { // console.log({dup:line}); @@ -284,9 +317,11 @@ while (layer < layers.length) { path = layers[layer]; - params = getRangeParameters(settings, path.layer); - // TODO update process settings from params override - // console.log(path.layer, params) + + // allow range overrides past base + if (path.layer > 0) { + updateParams(path.layer); + } emitPerMM = print.extrudePerMM( extruder.extNozzle, @@ -336,24 +371,20 @@ append(`;; --- layer ${layer} (${subst.height} @ ${subst.z.round(3)}) ---`); } - // enable fan at fan layer - if (gcodeFan && layer === process.outputFanLayer) { + // layer temp and fan overrides at layer changes + if (fanSpeed !== lastFanSpeed) { appendAllSub(gcodeFan); + lastFanSpeed = fanSpeed; } - - // second layer transitions - if (layer === 1) { - // update temps when first layer overrides are present - if (process.firstLayerNozzleTemp) { - subst.temp = process.outputTemp; // range - if (t0) appendSub("M104 S{temp} T0"); - if (t1) appendSub("M104 S{temp} T1"); - if (!(t0 || t1)) appendSub("M104 S{temp} T{tool}"); - } - if (process.firstLayerBedTemp) { - subst.bed_temp = subst.temp_bed = process.outputBedTemp; // range - appendSub("M140 S{temp_bed} T0"); - } + if (bedTemp !== lastBedTemp) { + append(`M140 S${bedTemp} T0`); + lastBedTemp = bedTemp; + } + if (nozzleTemp !== lastNozzleTemp) { + if (t0) append(`M104 S${nozzleTemp} T0`); + if (t1) append(`M104 S${nozzleTemp} T1`); + if (!(t0 || t1)) append(`M104 S{nozzleTemp} T${tool}`); + lastNozzleTemp = nozzleTemp; } // move Z to layer height diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index 0fd90687..dab08076 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -68,7 +68,6 @@ solidLayers = spro.sliceSolidLayers, vaseMode = spro.sliceFillType === 'vase' && !isSynth, doSolidLayers = solidLayers && !vaseMode && !isSynth, - doSparseFill = !vaseMode && spro.sliceFillSparse > 0.0, metadata = settings.widget[widget.id] || {}, extruder = metadata.extruder || 0, sliceHeight = spro.sliceHeight, @@ -376,10 +375,13 @@ } // sparse layers only present when non-vase mose and sparse % > 0 - if (doSparseFill && !isSynth) { + if (!isSynth) { let lastType; forSlices(0.5, 0.7, slice => { let params = getRangeParameters(settings, slice.index); + if (vaseMode || !params.sliceFillSparse) { + return; + } let newType = params.sliceFillType; doSparseLayerFill(slice, { settings: settings, diff --git a/web/kiri/lang/en.js b/web/kiri/lang/en.js index 8fdf8cca..1e052f9f 100644 --- a/web/kiri/lang/en.js +++ b/web/kiri/lang/en.js @@ -200,12 +200,12 @@ kiri.lang['en-us'] = { // FDM FILL fi_menu: "infill", fi_type: "type", - fi_pcnt_s: "fraction", + fi_pcnt_s: "fill fraction", fi_pcnt_l: "fill density values\n0.0 - 1.0", - fi_angl_s: "start angle", - fi_angl_l: "base angle in degrees", + fi_angl_s: "solid start", + fi_angl_l: "starting angle in degrees\n90 degrees added to \neach following layer\napplies only to solid layers", fi_over_s: "overlap", - fi_over_l: "overlap with shell and fill\nas % of nozzle width\nhigher bonds better\n0.0 - 1.0", + fi_over_l: "overlap with shell and other fill\nas fraction of nozzle diameter\n0.0 - 1.0", // fi_rate_s: "print speed", fi_rate_l: "extrusion speed for infill\nset to 0 to use default\noutput print speeds", @@ -429,8 +429,8 @@ kiri.lang['en-us'] = { ou_flml_s: "solid factor", ou_spml_s: "infill factor", ou_exml_l: "extrusion multiplier\n0.0 - 2.0", - ou_fanl_s: "fan layer", - ou_fanl_l: "layer to enable fan", + ou_fans_s: "fan speed", + ou_fans_l: "0 - 255", // OUTPUT CAM ou_toll_s: "tolerance", From c0ff5d7ac759bf2b024f00f4ecce7c7600a347fc Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 11 Feb 2021 22:12:49 -0500 Subject: [PATCH 112/255] fix missing widget center call --- src/kiri/engine.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/kiri/engine.js b/src/kiri/engine.js index a740d293..f78a8ee9 100644 --- a/src/kiri/engine.js +++ b/src/kiri/engine.js @@ -27,7 +27,7 @@ class Engine { try { new moto.STL().load(url, vertices => { this.listener({loaded: url, vertices}); - this.widget.loadVertices(vertices) + this.widget.loadVertices(vertices).center(); accept(this); }); } catch (error) { @@ -41,7 +41,7 @@ class Engine { try { new moto.STL().parse(data, vertices => { this.listener({parsed: data, vertices}); - this.widget.loadVertices(vertices) + this.widget.loadVertices(vertices).center(); accept(this); }); } catch (error) { From 2d9bc91973a1b19bc3455336f1c165801fe3753c Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 11 Feb 2021 23:05:28 -0500 Subject: [PATCH 113/255] fix engine api example. add code download --- notes.md | 2 +- src/kiri/engine.js | 8 ++++++++ web/kiri/engine.html | 35 +++++++++++++++++++++++++++++++---- 3 files changed, 40 insertions(+), 5 deletions(-) diff --git a/notes.md b/notes.md index c03136da..b31136c6 100644 --- a/notes.md +++ b/notes.md @@ -26,8 +26,8 @@ * `B` multi-extruder rendering of raft fails to offset the rest of the print * `B` multi-extruder purge blocks fail to generate properly for rafts +* `F` more explicit line width control with ranges and min/max adaptive * `F` test outlining solid projected areas (internally) -* `F` slicing controls per user-defined z-region * `F` control for size of purge block (with 0=disabled) * `F` polishing and other non-planar work * `F` gradient infill https://www.youtube.com/watch?v=hq53gsYREHU&feature=emb_logo diff --git a/src/kiri/engine.js b/src/kiri/engine.js index f78a8ee9..67d0bd38 100644 --- a/src/kiri/engine.js +++ b/src/kiri/engine.js @@ -7,6 +7,14 @@ let KIRI = self.kiri = self.kiri || {}; KIRI.newEngine = ()=> { return new Engine ()}; +if (!KIRI.api) { + KIRI.api = { + event: { + emit: () => {} + } + }; +} + class Engine { constructor() { this.widget = KIRI.newWidget(); diff --git a/web/kiri/engine.html b/web/kiri/engine.html index f9d59708..711ee395 100644 --- a/web/kiri/engine.html +++ b/web/kiri/engine.html @@ -43,12 +43,12 @@ #jbody, #gbody { flex-grow: 1; } - #jfoot { + #jfoot, #dfoot { display: flex; flex-direction: row; justify-content: center; } - #jfoot button { + #jfoot button, #dfoot button { width: 100%; } #gbody { @@ -58,6 +58,7 @@ overflow: auto; } #gfoot { + display: none; background-color: rgba(61,133,198,0.25); border-top: 1px solid #aaa; padding: 3px; @@ -66,6 +67,9 @@ #api { width: 812px; } + #download { + display: none; + } li { list-style: circle; } @@ -77,7 +81,7 @@ @@ -127,6 +152,7 @@
gcode output
+
@@ -145,5 +171,6 @@
  • - async path routing of slice data
  • - async gcode generation from path routing
  • + From 22bd1b11ef24b24b0afc68a28691d3e6df538f7c Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 12 Feb 2021 15:15:41 -0500 Subject: [PATCH 114/255] cosmetic belt options --- src/kiri/init.js | 1 + web/kiri/lang/en.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/kiri/init.js b/src/kiri/init.js index 1f344bad..963f3d1c 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -1676,6 +1676,7 @@ firstLayerFanSpeed: UC.newInput(LANG.ou_fans_s, {title:LANG.ou_fans_l, convert:UC.toInt, bound:UC.bound(0,255), modes:FDM}), fdmSep: UC.newBlank({class:"pop-sep", modes:FDM, show:isNotBelt}), firstLayerYOffset: UC.newInput(LANG.fl_zoff_s, {title:LANG.fl_zoff_l, convert:UC.toFloat, modes:FDM, show:isBelt}), + fdmSep: UC.newBlank({class:"pop-sep", modes:FDM, show:isBelt}), firstLayerRate: UC.newInput(LANG.fl_rate_s, {title:LANG.fl_rate_l, convert:UC.toFloat, modes:FDM}), firstLayerFillRate: UC.newInput(LANG.fl_frat_s, {title:LANG.fl_frat_l, convert:UC.toFloat, modes:FDM, show:isNotBelt}), fdmSep: UC.newBlank({class:"pop-sep", modes:FDM, show:isNotBelt}), diff --git a/web/kiri/lang/en.js b/web/kiri/lang/en.js index 1e052f9f..5783548e 100644 --- a/web/kiri/lang/en.js +++ b/web/kiri/lang/en.js @@ -235,7 +235,7 @@ kiri.lang['en-us'] = { fr_nabl_l: "create a raft under the\nmodel for better adhesion\nuses skirt offset and\ndisables skirt output", // FDM BELT ONLY - fl_zoff_s: "layer offset", + fl_zoff_s: "belt offset", fl_zoff_l: "height offset from belt\nof lowest extrusion\nin millimeters", fl_brim_s: "brim size", fl_brim_l: "add brim to part bottom\nsize is width in millimeters\n0 to disable", From bdfa02d215fdcb8b1d671b09796f3f07eb92deeb Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 13 Feb 2021 20:07:48 -0500 Subject: [PATCH 115/255] allow print/bed temp to fall back to first layer settings if they are omitted --- notes.md | 2 -- src/kiri/init.js | 3 --- src/mode/fdm/export.js | 4 ++-- 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/notes.md b/notes.md index b31136c6..88f0f88a 100644 --- a/notes.md +++ b/notes.md @@ -55,7 +55,6 @@ * `B` multiple parts with one angled against origin "floats" in preview * `B` re-add progress calls for all work units -* `B` disable support layer (top/bottom) offsets in belt mode * `F` arrange should just align down Z. no side to side. # CAM @@ -71,7 +70,6 @@ * `B` climb vs conventional not fully consistent after refactor * `B` outside cutting direction in roughing mode inverted -* `F` add layout spacing preference * `F` import SVG into a path that can be overlaid onto a 3D mesh (laser?) * `F` intelligently turn circle hole pocket clear into spiral down * `F` trace follow hole that matches endmill should turn into a drill op diff --git a/src/kiri/init.js b/src/kiri/init.js index 963f3d1c..865a429d 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -46,7 +46,6 @@ platform = API.platform, selection = API.selection, proto = location.protocol, - root = "grid.space", ver = Date.now().toString(36); let currentDevice = null, @@ -1403,8 +1402,6 @@ function init_one() { API.event.emit('init.one'); - $('gsbox').src = `${proto}//${root}/kiri/gsbox.png?ver=${ver}`; - // ensure we have settings from last session API.conf.restore(); diff --git a/src/mode/fdm/export.js b/src/mode/fdm/export.js index 25ffd644..829b7c70 100644 --- a/src/mode/fdm/export.js +++ b/src/mode/fdm/export.js @@ -101,8 +101,8 @@ retSpeed = process.outputRetractSpeed * 60; // range retDwell = process.outputRetractDwell || 0; // range timeDwell = retDwell / 1000; - nozzleTemp = process.outputTemp; - bedTemp = process.outputBedTemp; + nozzleTemp = process.outputTemp || process.firstLayerNozzleTemp; + bedTemp = process.outputBedTemp || process.firstLayerBedTemp; fanSpeed = process.outputFanSpeed; Object.assign(subst, { temp_bed: bedTemp, From ab00bef67a606426019b3b4969435b51d5e3489e Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 14 Feb 2021 14:35:50 -0500 Subject: [PATCH 116/255] enable support detection for belt mode --- notes.md | 1 + src/dev/fdm/Creality.CR-30 | 4 ++-- src/kiri/init.js | 4 ++-- src/kiri/main.js | 1 + src/mode/fdm/client.js | 7 ++++--- src/mode/fdm/slice.js | 12 ++++++++++-- 6 files changed, 20 insertions(+), 9 deletions(-) diff --git a/notes.md b/notes.md index b31136c6..692d2ec4 100644 --- a/notes.md +++ b/notes.md @@ -26,6 +26,7 @@ * `B` multi-extruder rendering of raft fails to offset the rest of the print * `B` multi-extruder purge blocks fail to generate properly for rafts +* `F` support pillar should conform to part * `F` more explicit line width control with ranges and min/max adaptive * `F` test outlining solid projected areas (internally) * `F` control for size of purge block (with 0=disabled) diff --git a/src/dev/fdm/Creality.CR-30 b/src/dev/fdm/Creality.CR-30 index 8f50b5bf..e9809728 100644 --- a/src/dev/fdm/Creality.CR-30 +++ b/src/dev/fdm/Creality.CR-30 @@ -73,9 +73,9 @@ "sliceSupportOffset": 0.4, "sliceSupportGap": 1, "sliceSupportSize": 6, - "sliceSupportArea": 1, + "sliceSupportArea": 0.5, "sliceSupportExtra": 0, - "sliceSupportAngle": 50, + "sliceSupportAngle": 2, "sliceSupportNozzle": 0, "sliceSolidMinArea": 10, "sliceSolidLayers": 3, diff --git a/src/kiri/init.js b/src/kiri/init.js index 963f3d1c..d2b3988c 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -1715,12 +1715,12 @@ sliceSupportArea: UC.newInput(LANG.sp_area_s, {title:LANG.sp_area_l, bound:UC.bound(0.0,200.0), convert:UC.toFloat, modes:FDM}), sliceSupportExtra: UC.newInput(LANG.sp_xpnd_s, {title:LANG.sp_xpnd_l, bound:UC.bound(0.0,200.0), convert:UC.toFloat, modes:FDM}), fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}), - sliceSupportAngle: UC.newInput(LANG.sp_angl_s, {title:LANG.sp_angl_l, bound:UC.bound(0.0,90.0), convert:UC.toFloat, modes:FDM, show:isNotBelt}), + sliceSupportAngle: UC.newInput(LANG.sp_angl_s, {title:LANG.sp_angl_l, bound:UC.bound(0.0,90.0), convert:UC.toFloat, modes:FDM, xshow:isNotBelt}), sliceSupportEnable: UC.newBoolean(LANG.sp_auto_s, onBooleanClick, {title:LANG.sp_auto_l, modes:FDM, show:isNotBelt}), sliceSupportGen: UC.newRow([ UI.ssaGen = UC.newButton(LANG.sp_detect, onButtonClick, {class: "f-col grow a-center"}) - ], { modes: FDM, class: "ext-buttons f-row grow", show:isNotBelt }), + ], { modes: FDM, class: "ext-buttons f-row grow", xshow:isNotBelt }), fdmSep: UC.newBlank({class:"pop-sep", modes:FDM, show:isNotBelt}), sliceSupportManual: UC.newRow([ (UI.ssmAdd = UC.newButton(undefined, onButtonClick, {icon:''})), diff --git a/src/kiri/main.js b/src/kiri/main.js index 64773e75..179c52b3 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -2162,6 +2162,7 @@ API.conf.save(); let compare = sproc[mode][cproc[mode]]; let same = true; + if (compare) for (let [key, val] of Object.entries(compare).filter(v => v[0] !== 'processName')) { let tval = process[key]; // outputLoopLayers misbehaving and setting null on empty diff --git a/src/mode/fdm/client.js b/src/mode/fdm/client.js index 38b18708..909e8d97 100644 --- a/src/mode/fdm/client.js +++ b/src/mode/fdm/client.js @@ -142,9 +142,10 @@ case api.ui.ssmAdd: return func.sadd(); case api.ui.ssmDun: return func.sdone(); case api.ui.ssmClr: - return api.uc.confirm("clear supports?").then(ok => { - if (ok) func.sclear(); - }); + // return api.uc.confirm("clear supports?").then(ok => { + // if (ok) func.sclear(); + // }); + func.sclear(); } }); api.event.on("fdm.supports.detect", func.sgen = () => { diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index dab08076..9981bcff 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -1243,6 +1243,7 @@ } FDM.supports = function(settings, widget) { + let isBelt = settings.device.bedBelt; let process = settings.process; let size = process.sliceSupportSize; let min = process.sliceSupportArea || 1; @@ -1250,7 +1251,9 @@ buf.setAttribute('position', new THREE.BufferAttribute(widget.vertices, 3)); let mat = new THREE.MeshBasicMaterial(); let geo = new THREE.Geometry().fromBufferGeometry(buf); - let angle = (Math.PI / 180) * settings.process.sliceSupportAngle; + let rad = (Math.PI / 180); + let deg = (180 / Math.PI); + let angle = rad * settings.process.sliceSupportAngle; let thresh = -Math.sin(angle); let dir = new THREE.Vector3(0,0,-1) let add = []; @@ -1299,7 +1302,12 @@ point.added = true; } } - geo.faces.filter(f => f.normal.z < thresh).forEach(face => { + let filter = isBelt ? (f) => { + return f.normal.z < thresh && f.normal.y < -0.001; + } : (f) => { + return f.normal.z < thresh; + }; + geo.faces.filter(filter).forEach(face => { let a = geo.vertices[face.a]; let b = geo.vertices[face.b]; let c = geo.vertices[face.c]; From ad3575835bd117d2389f62ee63d840e75deb0f1a Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 14 Feb 2021 15:50:29 -0500 Subject: [PATCH 117/255] default preview labels. check for broken widget --- package.json | 2 +- src/kiri.js | 2 +- src/kiri/conf.js | 7 ++++++- src/license.js | 2 +- src/mode/fdm/prepare.js | 4 ++++ 5 files changed, 13 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 786ee4ae..6cbe3e91 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grid-apps", - "version": "2.7.5D", + "version": "2.7.6D", "description": "grid.space 3d slice & modeling tools", "author": "Stewart Allen ", "license": "MIT", diff --git a/src/kiri.js b/src/kiri.js index 0f3eb9ae..ce42796e 100644 --- a/src/kiri.js +++ b/src/kiri.js @@ -6,7 +6,7 @@ if (!self.kiri) { self.kiri = { - beta: 2705, + beta: 2706, driver: {}, // driver modules loader: [] // module loading: array of functions }; diff --git a/src/kiri/conf.js b/src/kiri/conf.js index 0c095f0e..c6e1c0c6 100644 --- a/src/kiri/conf.js +++ b/src/kiri/conf.js @@ -658,7 +658,12 @@ animesh: "200" }, // label state preferences - labels: {}, + labels: { + 'FDM-3-engage': false, + 'FDM-3-retract': false, + 'FDM-3-arrows': false, + 'FDM-3-move': false + }, // for passing temporary slice hints (topo currently) synth: {}, // widget extra info for slicing (extruder mapping) diff --git a/src/license.js b/src/license.js index 93f1012f..6015d405 100644 --- a/src/license.js +++ b/src/license.js @@ -3,7 +3,7 @@ let terms = { COPYRIGHT: "Copyright (C) Stewart Allen - All Rights Reserved", LICENSE: "See the license.md file included with the source distribution", - VERSION: "2.7.D5" + VERSION: "2.7.D6" }; if (typeof(module) === 'object') { diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index 1d40fa56..320b20ca 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -196,6 +196,10 @@ // so that they can use a separate extruder for (let widget of widgets.slice()) { let sslices = []; + if (!widget.slices) { + console.log('invalid widget', widget); + continue; + } for (let slice of widget.slices) { if (!slice.supports) { continue; From 55baeea6c8528fc68bbf807d6672586d545674dd Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 14 Feb 2021 16:21:51 -0500 Subject: [PATCH 118/255] fix mirroring. fix cache refresh bug --- app.js | 12 ++++++++---- src/kiri/widget.js | 6 ++++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/app.js b/app.js index 81d9e24b..c0a26730 100644 --- a/app.js +++ b/app.js @@ -780,10 +780,14 @@ function getCachedFile(file, fn) { let smod = lastmod(filePath), cmod = cached.mtime; - if (!smod) throw "missing source file"; - if (smod > cmod) cached = null; - - cached.lastcheck = now; + if (!smod) { + throw "missing source file"; + } + if (smod > cmod) { + cached = null; + } else { + cached.lastcheck = now; + } } } diff --git a/src/kiri/widget.js b/src/kiri/widget.js index af00fe36..622f2e27 100644 --- a/src/kiri/widget.js +++ b/src/kiri/widget.js @@ -519,12 +519,14 @@ PRO._mirror = function() { this.setWireframe(false); this.clearSlices(); - this.mesh.applyMatrix4(new THREE.Matrix4().makeScale(-1, 1, 1)); + let vert = this.getGeoVertices(); + for (let i=0; i Date: Sun, 14 Feb 2021 23:10:50 -0500 Subject: [PATCH 119/255] add non-manifold mesh healing preference --- src/kiri/conf.js | 3 ++- src/kiri/init.js | 3 +++ src/kiri/slicer.js | 3 +++ src/mode/fdm/slice.js | 1 + web/kiri/lang/en.js | 2 ++ 5 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/kiri/conf.js b/src/kiri/conf.js index c6e1c0c6..6499fb5a 100644 --- a/src/kiri/conf.js +++ b/src/kiri/conf.js @@ -655,7 +655,8 @@ exportPreview: false, decimate: true, detail: "good", - animesh: "200" + animesh: "200", + healMesh: false }, // label state preferences labels: { diff --git a/src/kiri/init.js b/src/kiri/init.js index f7413b84..b71f8569 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -152,6 +152,7 @@ control.exportLocal = UI.exportLocal.checked; control.exportPreview = UI.exportPreview.checked; control.decimate = UI.decimate.checked; + control.healMesh = UI.healMesh.checked; SPACE.view.setZoom(control.reverseZoom, control.zoomSpeed); // platform.layout(); API.conf.save(); @@ -1645,6 +1646,7 @@ parts: UC.newGroup(LANG.pt_menu, $('prefs-prt'), {inline: true}), detail: UC.newSelect(LANG.pt_qual_s, {title: LANG.pt_qual_l, action: detailSave}, "detail"), decimate: UC.newBoolean(LANG.pt_deci_s, booleanSave, {title: LANG.pt_deci_l}), + healMesh: UC.newBoolean(LANG.pt_heal_s, booleanSave, {title: LANG.pt_heal_l}), prefadd: UC.checkpoint($('prefs-add')), @@ -2373,6 +2375,7 @@ UI.reverseZoom.checked = control.reverseZoom; UI.autoSave.checked = control.autoSave; UI.decimate.checked = control.decimate; + UI.healMesh.checked = control.healMesh; lineTypeSave(); detailSave(); updateFPS(); diff --git a/src/kiri/slicer.js b/src/kiri/slicer.js index 515bb1e9..94816a56 100644 --- a/src/kiri/slicer.js +++ b/src/kiri/slicer.js @@ -530,6 +530,9 @@ // for topo slices, we just need the raw lines if (!topoMode && !simpleMode) { slice.groups = connectLines(slice.lines, slice.z); + if (options.union) { + slice.groups = POLY.flatten(POLY.union(POLY.nest(slice.groups), null, true), null, true); + } if ((debug && slice.lines.excessive) || xray) { const dash = xray || 3; slice.lines.forEach((line, i) => { diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index 9981bcff..74b9540e 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -151,6 +151,7 @@ height: sliceHeight, minHeight: sliceMinHeight, firstHeight: firstSliceHeight, + union: settings.controller.healMesh, // debug: true, // xray: 3, // view: view diff --git a/web/kiri/lang/en.js b/web/kiri/lang/en.js index 5783548e..d545d80d 100644 --- a/web/kiri/lang/en.js +++ b/web/kiri/lang/en.js @@ -164,6 +164,8 @@ kiri.lang['en-us'] = { pt_deci_l: "enable or disable point decimation\nduring port import. for faster slicing\nand lower memory usage", pt_qual_s: "quality", pt_qual_l: "level of detail to retain\nduring slicing operations\nlower is faster", + pt_heal_s: "heal mesh", + pt_heal_l: "attempt to heal\nnon-manifild meshes", xp_menu: "exports", From 56ffc24f7abb939235a1dddda58ef0e440d706b6 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 14 Feb 2021 23:31:06 -0500 Subject: [PATCH 120/255] auto-resize belt besd to fit large objects --- src/kiri/main.js | 46 +++++++++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 15 deletions(-) diff --git a/src/kiri/main.js b/src/kiri/main.js index 179c52b3..ad688fa7 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -1351,9 +1351,35 @@ updateSelectedBounds(); } + function fitDeviceToWidgets() { + let maxy = 0; + forAllWidgets(function(widget) { + let wb = widget.mesh.getBoundingBox().clone(); + maxy = Math.max(maxy, wb.max.y - wb.min.y); + }); + let dev = settings.device; + if (maxy > dev.bedDepth) { + dev.bedDepthSave = dev.bedDepth; + dev.bedDepth = maxy + 10; + SPACE.platform.setSize( + parseInt(dev.bedWidth), + parseInt(dev.bedDepth), + parseFloat(dev.bedHeight), + parseFloat(dev.maxHeight) + ); + return true; + } + } + function updateSelectedBounds(widgets) { // update bounds on selection for drag limiting let isBelt = settings.device.bedBelt; + if (isBelt) { + if (fitDeviceToWidgets()) { + platform.update_origin(); + SPACE.update(); + } + } let dvy = settings.device.bedDepth; let dvx = settings.device.bedWidth; let bounds_sel = new THREE.Box3(); @@ -1614,20 +1640,6 @@ wb.max.y += wp.y; bounds.union(wb); }); - if (settings.device.bedBelt) { - let dev = settings.device, - isBelt = dev.bedBelt, - maxy = bounds.max.y - bounds.min.y; - // if (maxy > dev.bedDepth) { - // console.log({maxy}, settings.device.bedDepth) - // SPACE.platform.setSize( - // parseInt(dev.bedWidth), - // parseInt(maxy), - // parseFloat(dev.bedHeight), - // parseFloat(dev.maxHeight) - // ); - // } - } return settings.bounds = bounds; } @@ -1889,6 +1901,10 @@ break; case MODES.FDM: space = space || ((proc.sliceSupportExtra || 0) * 2) + 1; + // auto resize device to support a larger object + if (isBelt) { + fitDeviceToWidgets(); + } break; } @@ -1942,7 +1958,7 @@ let bounds = platformUpdateBounds(), movey = -(dev.bedDepth / 2 + bounds.min.y); forAllWidgets(widget => { - // only move the master widget in the group + // only move the root widget in the group if (widget.id === widget.group.id) { widget.move(0, movey + 5, 0) } From 323dce32b63c96edfd221f5b042b00dab37c043b Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 14 Feb 2021 23:33:14 -0500 Subject: [PATCH 121/255] fix mesh heal tool tip. indicate performance hit --- web/kiri/lang/en.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/kiri/lang/en.js b/web/kiri/lang/en.js index d545d80d..66ad4513 100644 --- a/web/kiri/lang/en.js +++ b/web/kiri/lang/en.js @@ -165,7 +165,7 @@ kiri.lang['en-us'] = { pt_qual_s: "quality", pt_qual_l: "level of detail to retain\nduring slicing operations\nlower is faster", pt_heal_s: "heal mesh", - pt_heal_l: "attempt to heal\nnon-manifild meshes", + pt_heal_l: "attempt to heal\nnon-manifold meshes\nadds to slicing time", xp_menu: "exports", From 1c2b1c2220696d148815afd756a1098b05ee6d21 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 15 Feb 2021 01:09:31 -0500 Subject: [PATCH 122/255] fix gap layers --- notes.md | 4 +++- src/mode/fdm/slice.js | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/notes.md b/notes.md index 0a8cb119..86c2cb4f 100644 --- a/notes.md +++ b/notes.md @@ -10,13 +10,14 @@ * `P` client/worker interface normalization * `P` explore widget vertex reloading / replacing (Onshape primarily) +* `F` add profile only download / restore like devices +* `F` bundle current profile into exported device * `F` show slider range values in workspace units (on hover?) * `F` allow select of a range by typing in values in slices or workspace units * `F` add % field type with conversion (like units) * `F` complete G2/G3 arc output / input (85% now) * `F` expose grouping feature * `F` SVG import to 3D part like images -* `F` bundle current profile into exported device * `F` integrate svg nest arrange algorithm # FDM @@ -27,6 +28,7 @@ * `B` multi-extruder purge blocks fail to generate properly for rafts * `F` support pillar should conform to part +* `F` support pillar should have solid top/bottom * `F` more explicit line width control with ranges and min/max adaptive * `F` test outlining solid projected areas (internally) * `F` control for size of purge block (with 0=disabled) diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index 74b9540e..7f3b8fa8 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -201,7 +201,7 @@ continue; } for (let pslice of peer.slices) { - if (Math.abs(pslice.z - slice.z) > gap) { + if (Math.abs(Math.abs(pslice.z - slice.z) - gap) > 0.05) { continue; } // offset pslice tops by spro.sliceSupportOffset From 903fd2eff7972189569f987828ede770c3e7d6df Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 15 Feb 2021 11:05:47 -0500 Subject: [PATCH 123/255] fix process follows device and process changes are auto-saved --- src/kiri/init.js | 8 ++++++-- src/kiri/main.js | 29 ++++++++++++++++++++++++++--- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/kiri/init.js b/src/kiri/init.js index b71f8569..f45a19a0 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -723,9 +723,8 @@ let mode = API.mode.get(), current = settings(), local = isLocalDevice(devicename), - dproc = current.devproc[devicename], dev = current.device = CONF.device_from_code(code,mode), - proc = current.process, + dproc = current.devproc[devicename], // last process name for this device newdev = dproc === undefined, // first time device is selected predev = current.filter[mode], // previous device selection chgdev = predev !== devicename; // device is changing @@ -734,10 +733,12 @@ if (code.profiles) { for (let profile of code.profiles) { let profname = profile.processName; + // if no saved profile by that name for this mode... if (!current.sproc[mode][profname]) { console.log('adding profile', profname, 'to', mode); current.sproc[mode][profname] = profile; } + // if it's a new device, seed the new profile name as last profile if (newdev && !current.devproc[devicename]) { console.log('setting default profile for new device', devicename, 'to', profname); current.devproc[devicename] = dproc = profname; @@ -836,7 +837,9 @@ API.view.update_fields(); platform.update_size(); + // store current device name for this mode current.filter[mode] = devicename; + // cache device record for this mode (restored in setMode) current.cdev[mode] = currentDevice = dev; if (dproc) { @@ -994,6 +997,7 @@ let exp = btoa(JSON.stringify({ version: KIRI.version, device: selected, + process: API.process.code(), code: devs[selected], time: Date.now() })); diff --git a/src/kiri/main.js b/src/kiri/main.js index ad688fa7..5bde4966 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -257,6 +257,7 @@ layer_max: 0 }, device: { + code: currentDeviceCode, get: currentDeviceName, set: noop, // set during init clone: noop // set during init @@ -311,6 +312,10 @@ grid : function() { return false }, local : function() { return false } }, + process: { + code: currentProcessCode, + get: currentProcessName + }, platform, selection, show: { @@ -2185,6 +2190,11 @@ if (val === '' && tval == null) { continue; } + if (Array.isArray(tval) && Array.isArray(val)) { + if (JSON.stringify(tval) == JSON.stringify(val)) { + continue; + } + } if (tval != val) { // console.log(key, 'expected', val, 'got', tval); same = false; @@ -2551,13 +2561,14 @@ function loadSettings(e, named) { let mode = getMode(), - name = e ? e.target.getAttribute("load") : named || "default", + name = e ? e.target.getAttribute("load") : named || currentProcessName() || "default", load = settings.sproc[mode][name]; if (!load) return; - // clone loaded process into settings - settings.process = clone(load); + // cloning loaded process into settings requires user to save + // process before switching devices or risk losing any changes + settings.process = load;//clone(load); // update process name settings.process.processName = name; // save named process with the current device @@ -2815,6 +2826,18 @@ return settings.filter[getMode()]; } + function currentDeviceCode() { + return settings.devices[currentDeviceName()]; + } + + function currentProcessName() { + return settings.cproc[getMode()]; + } + + function currentProcessCode() { + return settings.sproc[getMode()][currentProcessName()]; + } + function setControlsVisible(show) { $('mid-lcol').style.display = show ? 'flex' : 'none'; $('mid-rcol').style.display = show ? 'flex' : 'none'; From 8d7e1c891b4ec42f01cd5907634f86b40c0f6a90 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 15 Feb 2021 12:37:54 -0500 Subject: [PATCH 124/255] add profile export/import. make all base64 code and download common / util --- notes.md | 1 - src/kiri/init.js | 30 ++++++----------------- src/kiri/main.js | 63 ++++++++++++++++++++++++++++++++++++++++++------ 3 files changed, 64 insertions(+), 30 deletions(-) diff --git a/notes.md b/notes.md index 86c2cb4f..23597b04 100644 --- a/notes.md +++ b/notes.md @@ -10,7 +10,6 @@ * `P` client/worker interface normalization * `P` explore widget vertex reloading / replacing (Onshape primarily) -* `F` add profile only download / restore like devices * `F` bundle current profile into exported device * `F` show slider range values in workspace units (on hover?) * `F` allow select of a range by typing in values in slices or workspace units diff --git a/src/kiri/init.js b/src/kiri/init.js index f45a19a0..5685e91a 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -549,7 +549,7 @@ if (reply) { let res = JSON.parse(reply); if (res && res.ver && res.rec) { - let set = JSON.parse(atob(res.rec)); + let set = API.util.b64dec(res.rec); set.id = res.space; set.ver = res.ver; API.conf.put(set); @@ -563,7 +563,7 @@ } function storeSettingsToServer(display) { - let set = btoa(JSON.stringify(settings())); + let set = API.util.b64enc(settings()); new moto.Ajax(function(reply) { if (reply) { let res = JSON.parse(reply); @@ -586,10 +586,7 @@ .replace(/\./g,'_'); UC.prompt("Export Device Filename", name).then(name => { if (name) { - let blob = new Blob([exp], {type: "octet/stream"}), - url = WIN.URL.createObjectURL(blob); - $('mod-any').innerHTML = `x`; - $('sexport').click(); + API.util.download(exp, `${name}.km`); } }); } @@ -601,13 +598,7 @@ if (name.toLowerCase().indexOf(".stl") < 0) { name = `${name}.stl`; } - let xprt = API.selection.export(), - blob = new Blob([xprt], {type: "octet/stream"}), - url = WIN.URL.createObjectURL(blob); - $('mod-any').innerHTML = [ - `x` - ].join(''); - $('sexport').click(); + API.util.download(API.selection.export(), name); }); } @@ -628,13 +619,8 @@ UC.confirm("Export Filename", {ok:true, cancel: false}, "workspace", opt).then(name => { if (name) { let work = $('incwork').checked, - json = API.conf.export({work}), - blob = new Blob([json], {type: "octet/stream"}), - url = WIN.URL.createObjectURL(blob); - $('mod-any').innerHTML = [ - `x` - ].join(''); - $('sexport').click(); + json = API.conf.export({work}); + API.util.download(json, `${name}.km`); } }); } @@ -994,13 +980,13 @@ showDevices(); }; UI.deviceExport.onclick = function() { - let exp = btoa(JSON.stringify({ + let exp = API.util.b64enc({ version: KIRI.version, device: selected, process: API.process.code(), code: devs[selected], time: Date.now() - })); + }); deviceExport(exp, selected); }; diff --git a/src/kiri/main.js b/src/kiri/main.js index 5bde4966..5b3ccc08 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -340,7 +340,10 @@ util: { isSecure, ui2rec: updateSettingsFromFields, - rec2ui: updateFieldsFromSettings + rec2ui: updateFieldsFromSettings, + download: downloadBlob, + b64enc: obj => { return base64js.fromByteArray(new TextEncoder().encode(JSON.stringify(obj))) }, + b64dec: obj => { return JSON.parse(new TextDecoder().decode(base64js.toByteArray(obj))) } }, view: { get: function() { return viewMode }, @@ -2221,18 +2224,19 @@ function settingsImport(data, ask) { if (typeof(data) === 'string') { try { - data = JSON.parse(new TextDecoder().decode(base64js.toByteArray(data))); + data = API.util.b64dec(data); } catch (e) { - UC.alert('invalid settings format'); + UC.alert('invalid import format'); console.log('data',data); return; } } if (LOCAL) console.log('import',data); let isSettings = (data.settings && data.version && data.time); + let isProcess = (data.process && data.version && data.time && data.mode && data.name); let isDevice = (data.device && data.version && data.time); let isWork = (data.work); - if (!isSettings && !isDevice) { + if (!isSettings && !isDevice && !isProcess) { UC.alert('invalid settings or device format'); console.log('data',data); return; @@ -2251,6 +2255,19 @@ API.show.devices(); } } + if (isProcess) { + if (settings.sproc[data.mode][data.name]) { + UC.confirm(`Replace process ${data.name}?`).then(yes => { + if (yes) { + settings.sproc[data.mode][data.name] = data.process; + API.conf.show(); + } + }); + } else { + settings.sproc[data.mode][data.name] = data.process; + API.conf.show(); + } + } if (isSettings) { settings = CONF.normalize(data.settings); SDB.setItem('ws-settings', JSON.stringify(settings)); @@ -2273,7 +2290,8 @@ if (ask) { let opt = {}; let prompt = isDevice ? - `Import device "${data.device}"?` : + `Import device "${data.device}"?` : isProcess ? + `Import process "${data.name}"?` : `Import settings made in Kiri:Moto version ${data.version} on
    ${new Date(data.time)}?`; if (data.screen) { opt.pre = [ @@ -2296,7 +2314,7 @@ const shot = opts.work || opts.screen ? SPACE.screenshot() : undefined; const work = opts.work ? KIRI.codec.encode(WIDGETS,{_json_:true}) : undefined; const view = opts.work ? SPACE.view.save() : undefined; - return base64js.fromByteArray(new TextEncoder().encode(JSON.stringify({ + return API.util.b64enc({ settings: settings, version: KIRI.version, screen: shot, @@ -2307,7 +2325,7 @@ moto: MOTO.id, init: SDB.getItem('kiri-init'), time: Date.now() - }))); + }); } function platformLoadFiles(files,group) { @@ -2559,6 +2577,24 @@ } } + function exportSettings(e) { + let mode = getMode(), + name = e.target.getAttribute("name"), + data = API.util.b64enc({ + process: settings.sproc[mode][name], + version: KIRI.version, + moto: MOTO.id, + time: Date.now(), + mode, + name + }); + UC.prompt("Export Process Filename", name).then(name => { + if (name) { + API.util.download(data, `${name}.km`); + } + }); + } + function loadSettings(e, named) { let mode = getMode(), name = e ? e.target.getAttribute("load") : named || currentProcessName() || "default", @@ -2605,6 +2641,7 @@ let row = DOC.createElement('div'), load = DOC.createElement('button'), edit = DOC.createElement('button'), + xprt = DOC.createElement('button'), del = DOC.createElement('button'), name = sk; @@ -2629,9 +2666,15 @@ edit.innerHTML = ''; edit.onclick = editSettings; + xprt.setAttribute('name', sk); + xprt.setAttribute('title', 'export'); + xprt.innerHTML = ''; + xprt.onclick = exportSettings; + row.setAttribute("class", "flow-row"); row.appendChild(edit); row.appendChild(load); + row.appendChild(xprt); row.appendChild(del); table.appendChild(row); }); @@ -2843,6 +2886,12 @@ $('mid-rcol').style.display = show ? 'flex' : 'none'; } + function downloadBlob(data, filename) { + let url = WIN.URL.createObjectURL(new Blob([data], {type: "octet/stream"})); + $('mod-any').innerHTML = `x`; + $('_dexport_').click(); + } + // prevent safari from exiting full screen mode DOC.onkeydown = function (evt) { if (evt.keyCode == 27) evt.preventDefault() } From da39af4292e8bd48b2f32bed3c57efa07e6617ee Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 15 Feb 2021 16:14:44 -0500 Subject: [PATCH 125/255] update platform additions after a forced resize --- src/kiri/main.js | 1 + src/moto/space.js | 1 + 2 files changed, 2 insertions(+) diff --git a/src/kiri/main.js b/src/kiri/main.js index 5b3ccc08..80d2dbd9 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -1375,6 +1375,7 @@ parseFloat(dev.bedHeight), parseFloat(dev.maxHeight) ); + SPACE.platform.update(); return true; } } diff --git a/src/moto/space.js b/src/moto/space.js index 0ed0ac35..04b4f56e 100644 --- a/src/moto/space.js +++ b/src/moto/space.js @@ -890,6 +890,7 @@ }, platform: { + update: updateDraws, tweenTo: tweenPlatform, setSize: setPlatformSizeUpdateGrid, setColor: setPlatformColor, From 373635a6fdc02ac54aacef2874ea1928138fe48c Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Tue, 16 Feb 2021 09:01:54 -0500 Subject: [PATCH 126/255] bump rev 2.7.D7 --- notes.md | 1 - package.json | 2 +- src/kiri.js | 2 +- src/license.js | 2 +- 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/notes.md b/notes.md index 23597b04..42168f74 100644 --- a/notes.md +++ b/notes.md @@ -10,7 +10,6 @@ * `P` client/worker interface normalization * `P` explore widget vertex reloading / replacing (Onshape primarily) -* `F` bundle current profile into exported device * `F` show slider range values in workspace units (on hover?) * `F` allow select of a range by typing in values in slices or workspace units * `F` add % field type with conversion (like units) diff --git a/package.json b/package.json index 6cbe3e91..dba165b8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grid-apps", - "version": "2.7.6D", + "version": "2.7.7D", "description": "grid.space 3d slice & modeling tools", "author": "Stewart Allen ", "license": "MIT", diff --git a/src/kiri.js b/src/kiri.js index ce42796e..f0a2f623 100644 --- a/src/kiri.js +++ b/src/kiri.js @@ -6,7 +6,7 @@ if (!self.kiri) { self.kiri = { - beta: 2706, + beta: 2707, driver: {}, // driver modules loader: [] // module loading: array of functions }; diff --git a/src/license.js b/src/license.js index 6015d405..00de7864 100644 --- a/src/license.js +++ b/src/license.js @@ -3,7 +3,7 @@ let terms = { COPYRIGHT: "Copyright (C) Stewart Allen - All Rights Reserved", LICENSE: "See the license.md file included with the source distribution", - VERSION: "2.7.D6" + VERSION: "2.7.D7" }; if (typeof(module) === 'object') { From 1e4c06b747a7c97792741c490bc808b6f3c3f3c3 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Tue, 16 Feb 2021 21:16:55 -0500 Subject: [PATCH 127/255] fix platform size update --- notes.md | 1 + src/kiri/init.js | 2 ++ src/kiri/main.js | 1 + 3 files changed, 4 insertions(+) diff --git a/notes.md b/notes.md index 42168f74..d59af98f 100644 --- a/notes.md +++ b/notes.md @@ -54,6 +54,7 @@ # FDM - BELT +* `B` ranges don't work with anchors * `B` multiple parts with one angled against origin "floats" in preview * `B` re-add progress calls for all work units * `F` arrange should just align down Z. no side to side. diff --git a/src/kiri/init.js b/src/kiri/init.js index 5685e91a..272679cd 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -822,6 +822,8 @@ API.view.update_fields(); platform.update_size(); + platform.update_origin(); + platform.update(); // store current device name for this mode current.filter[mode] = devicename; diff --git a/src/kiri/main.js b/src/kiri/main.js index 80d2dbd9..6d65f95e 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -109,6 +109,7 @@ load_files: platformLoadFiles, group: platformGroup, group_done: platformGroupDone, + update: SPACE.platform.update, set_font: SPACE.platform.setFont, set_axes: SPACE.platform.setAxes, set_volume: SPACE.platform.setVolume, From 8be93cb3c9805ad595d87aeb0f7cea7117d1ad44 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Tue, 16 Feb 2021 22:01:10 -0500 Subject: [PATCH 128/255] fix output order for slices with shells touching the belt --- src/dev/fdm/Creality.CR-30 | 23 +++++++++++++---------- src/kiri/print.js | 2 +- src/mode/fdm/prepare.js | 9 +++++---- src/mode/fdm/slice.js | 4 ++-- 4 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/dev/fdm/Creality.CR-30 b/src/dev/fdm/Creality.CR-30 index e9809728..d2f8d687 100644 --- a/src/dev/fdm/Creality.CR-30 +++ b/src/dev/fdm/Creality.CR-30 @@ -71,11 +71,11 @@ "sliceMinHeight": 0, "sliceSupportDensity": 0.25, "sliceSupportOffset": 0.4, - "sliceSupportGap": 1, + "sliceSupportGap": 0, "sliceSupportSize": 6, - "sliceSupportArea": 0.5, + "sliceSupportArea": 0.25, "sliceSupportExtra": 0, - "sliceSupportAngle": 2, + "sliceSupportAngle": 1, "sliceSupportNozzle": 0, "sliceSolidMinArea": 10, "sliceSolidLayers": 3, @@ -85,10 +85,12 @@ "firstLayerPrintMult": 1.15, "firstLayerYOffset": 0, "firstLayerBrim": 0, - "firstLayerBeltLead": 3, + "firstLayerBeltLead": 0, + "firstLayerFanSpeed": 0, "outputTemp": 210, "outputFanMax": 255, "outputBedTemp": 60, + "outputFanSpeed": 255, "outputFeedrate": 50, "outputFinishrate": 50, "outputSeekrate": 80, @@ -96,14 +98,15 @@ "outputFillMult": 1.25, "outputSparseMult": 1.25, "outputFanLayer": 0, - "outputRetractDist": 4, - "outputRetractSpeed": 30, - "outputRetractDwell": 30, - "outputShortPoly": 100.0, + "outputRetractDist": 4.5, + "outputRetractSpeed": 50, + "outputRetractWipe": 1, + "outputRetractDwell": 25, + "outputShortPoly": 60.0, "outputMinSpeed": 10.0, "outputCoastDist": 0.1, - "outputWipeDistance": 0, - "outputLayerRetract": true, + "outputWipeDistance": 1, + "outputLayerRetract": false, "detectThinWalls": true, "zHopDistance": 0, "antiBacklash": 0 diff --git a/src/kiri/print.js b/src/kiri/print.js index e3cb95ba..e4e3e094 100644 --- a/src/kiri/print.js +++ b/src/kiri/print.js @@ -845,7 +845,7 @@ // and enforce optimal shell order (outer first) if (isBelt && opt.onBelt) { startPoint = startClone; - shellOrder = 1; + shellOrder = -1; } // top object diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index 320b20ca..48c07e40 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -314,10 +314,11 @@ } } } + // todo remove b/c this is now calculated at slice time // flag slices as being on or off the bed / belt - for (let slice of widget.slices) { - slice.onbelt = Math.abs(minby - slice.minby) < 0.01; - } + // for (let slice of widget.slices) { + // slice.onbelt = Math.abs(minby - slice.minby) < 0.01; + // } } else { // when rafts used this is non-zero offset.z = zoff; @@ -410,7 +411,7 @@ params, // range parameters first: slice.index === 0, support: slice.widget.support, - onBelt: slice.onbelt, + onBelt: slice.belt.touch, pretract: (wipeDist) => { if (lastLayer && lastLayer.length) { let lastOut = lastLayer.last(); diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index 7f3b8fa8..8aaac1c4 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -299,7 +299,7 @@ }, "offsets"); // add lead in when specified in belt mode - if (!isSynth && isBelt && spro.firstLayerBeltLead) { + if (!isSynth && isBelt) { let wb = widget.bounds; // find adjusted zero point from slices let smin = Infinity; @@ -336,7 +336,7 @@ while (start.up && start.topShells().length === 0) { start = start.up; } - while (start && offset >= sliceHeight) { + while (offset && start && offset >= sliceHeight) { let addto = start.down; if (!addto) { addto = newSlice(start.z - sliceHeight); From 3c19539dc92def2445f6800451c806ed6d9b41c5 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Tue, 16 Feb 2021 22:06:54 -0500 Subject: [PATCH 129/255] fix access to missing field --- src/mode/fdm/prepare.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index 48c07e40..e6f5ee92 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -411,7 +411,7 @@ params, // range parameters first: slice.index === 0, support: slice.widget.support, - onBelt: slice.belt.touch, + onBelt: slice.belt && slice.belt.touch, pretract: (wipeDist) => { if (lastLayer && lastLayer.length) { let lastOut = lastLayer.last(); From 00849cc3c172705add7a4ac61365096334709aae Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 18 Feb 2021 00:12:16 -0500 Subject: [PATCH 130/255] add alt/option support paint and cmd/ctrl support erase --- src/kiri/init.js | 2 +- src/mode/fdm/client.js | 39 +++++++++++++++++++++++++-------------- src/mode/fdm/slice.js | 2 +- 3 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/kiri/init.js b/src/kiri/init.js index 272679cd..58566445 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -1697,7 +1697,7 @@ fdmSupport: UC.newGroup(LANG.sp_menu, null, {modes:FDM, marker:false}), sliceSupportNozzle: UC.newSelect(LANG.sp_nozl_s, {title:LANG.sp_nozl_l, modes:FDM}, "extruders"), - sliceSupportDensity: UC.newInput(LANG.sp_dens_s, {title:LANG.sp_dens_l, convert:UC.toFloat, bound:UC.bound(0.05,1.0), modes:FDM}), + sliceSupportDensity: UC.newInput(LANG.sp_dens_s, {title:LANG.sp_dens_l, convert:UC.toFloat, bound:UC.bound(0.0,1.0), modes:FDM}), fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}), sliceSupportSize: UC.newInput(LANG.sp_size_s, {title:LANG.sp_size_l, bound:UC.bound(1.0,200.0), convert:UC.toFloat, modes:FDM}), sliceSupportOffset: UC.newInput(LANG.sp_offs_s, {title:LANG.sp_offs_l, bound:UC.bound(0.0,200.0), convert:UC.toFloat, modes:FDM}), diff --git a/src/mode/fdm/client.js b/src/mode/fdm/client.js index 909e8d97..1b84a12a 100644 --- a/src/mode/fdm/client.js +++ b/src/mode/fdm/client.js @@ -10,7 +10,7 @@ FDM = KIRI.driver.FDM, SPACE, API, VIEWS, LANG, PROC, UI, UC, p1, p2, iw, - lastMode, lastView, lastPillar, + lastMode, lastView, lastPillar, fromPillar, isFdmMode = false, addingSupports = false, alert = [], @@ -186,6 +186,7 @@ delbox('supp'); api.hide.alert(alert); api.feature.hover = addingSupports = false; + fromPillar = undefined; }); api.event.on("fdm.supports.clear", func.sclear = () => { func.sdone(); @@ -263,8 +264,8 @@ }); } }); - api.event.on("mouse.hover.up", on => { - let { object, event } = on; + api.event.on("mouse.hover.up", func.hoverup = (on = {}) => { + let { event } = on; if (!isFdmMode) { return; } @@ -286,6 +287,7 @@ }); sa.splice(ix,1); API.conf.save(); + fromPillar = undefined; return; } if (!iw) return; @@ -299,8 +301,11 @@ let ws = (wa.support = wa.support || []); let x = p1.x - ip.x, y = -p1.z - ip.y, z = hy, id = Date.now(); let rec = {x, y, z, dw, dh, id}; + if (fromPillar && event && event.shiftKey) { + // console.log("lerp pillars from", fromPillar, 'to', rec); + } ws.push(Object.clone(rec)); - addWidgetSupport(iw, rec); + fromPillar = addWidgetSupport(iw, rec); API.conf.save(); }); api.event.on("mouse.hover", data => { @@ -310,11 +315,8 @@ if (!addingSupports) { return; } - // delbox('intZ'); - // delbox('intW'); - // addbox(point, 0xff0000, 'intZ'); delbox('supp'); - const { int, type, point } = data; + const { int, type, point, event } = data; const pillar = int ? int.object.pillar : undefined; if (lastPillar) { lastPillar.box.material.color.r = 0; @@ -323,6 +325,9 @@ if (pillar) { pillar.box.material.color.r = 0.5; lastPillar = pillar; + if (event && (event.metaKey || event.ctrlKey)) { + return func.hoverup(); + } return; } if (int && type === 'widget') { @@ -341,10 +346,10 @@ .append(SPACE.internals().platform) .appendAll(activeSupports()) ; - let i2 = ray.intersectObjects(targets, false); + let i2 = ray.intersectObjects(targets, false).filter(t => t.object.widget); if (i2 && i2.length > 0) { // prevent false matches close to origin of ray - i2 = i2.filter(i => i.distance > 0.01); + i2 = i2.filter(i => i.distance > 0.1); // prevent single point base to top matches if (i2.length > 1) { p2 = i2[0].point; @@ -352,12 +357,14 @@ let hy = (p1.y + p2.y) / 2; let dy = Math.abs(p1.y - p2.y); let dw = api.conf.get().process.sliceSupportSize / 2; - // addbox(p2, 0x00ff00, 'intW'); addbox({x:p1.x, y:hy, z:p1.z}, 0x0000dd, 'supp', { x:dw, y:dw, z:dy }); } } + if (event && event.altKey) { + return func.hoverup(); + } }); } @@ -383,18 +390,19 @@ } function addWidgetSupport(widget, pos) { - const { x, y, z, dw, dh, id } = pos; + const { x, y, z, rz, dw, dh, id } = pos; const sups = widget.sups = (widget.sups || {}); // prevent duplicate restore from repeated settings load calls if (!sups[id]) { pos.box = addbox( - { x, y, z }, 0x0000dd, id, + { x, y, z, rz }, 0x0000dd, id, { x:dw, y:dw, z:dh }, { group: widget.mesh } ); pos.box.pillar = Object.assign({widget}, pos); sups[id] = pos; widget.adds.push(pos.box); } + return sups[id]; } function updateVisiblity() { @@ -431,7 +439,7 @@ } } - function addbox(point, color, name, dim = {x:1,y:1,z:1}, opt = {}) { + function addbox(point, color, name, dim = {x:1,y:1,z:1,rz:0}, opt = {}) { delbox(name); const box = boxes[name] = new THREE.Mesh( new THREE.BoxGeometry(dim.x, dim.y, dim.z), @@ -449,6 +457,9 @@ group.add(box); box.groupTo = group; + if (dim.rz) { + opt.rotate = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0,0,1), dim.rz); + } if (opt.rotate) { opt.matrix = new THREE.Matrix4().makeRotationFromQuaternion(opt.rotate); } diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index 8aaac1c4..c38e9e73 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -201,7 +201,7 @@ continue; } for (let pslice of peer.slices) { - if (Math.abs(Math.abs(pslice.z - slice.z) - gap) > 0.05) { + if (Math.abs(Math.abs(pslice.z - slice.z) - gap) > 0.1) { continue; } // offset pslice tops by spro.sliceSupportOffset From 208ab2505d24487c76bb5459550573aae0a3abd3 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 18 Feb 2021 00:20:28 -0500 Subject: [PATCH 131/255] fix intersect filter to use absence of pillar rather than presence of widget --- src/mode/fdm/client.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mode/fdm/client.js b/src/mode/fdm/client.js index 1b84a12a..857a3524 100644 --- a/src/mode/fdm/client.js +++ b/src/mode/fdm/client.js @@ -346,7 +346,7 @@ .append(SPACE.internals().platform) .appendAll(activeSupports()) ; - let i2 = ray.intersectObjects(targets, false).filter(t => t.object.widget); + let i2 = ray.intersectObjects(targets, false).filter(t => !t.object.pillar); if (i2 && i2.length > 0) { // prevent false matches close to origin of ray i2 = i2.filter(i => i.distance > 0.1); From e66549915011b2e6de91e5973edf89407adada9c Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 18 Feb 2021 15:11:06 -0500 Subject: [PATCH 132/255] add interpolated from/to supports. still todo angling --- src/mode/fdm/client.js | 73 ++++++++++++++++++++++++++++++------------ 1 file changed, 53 insertions(+), 20 deletions(-) diff --git a/src/mode/fdm/client.js b/src/mode/fdm/client.js index 857a3524..335d63f7 100644 --- a/src/mode/fdm/client.js +++ b/src/mode/fdm/client.js @@ -302,12 +302,51 @@ let x = p1.x - ip.x, y = -p1.z - ip.y, z = hy, id = Date.now(); let rec = {x, y, z, dw, dh, id}; if (fromPillar && event && event.shiftKey) { - // console.log("lerp pillars from", fromPillar, 'to', rec); + let targets = api.widgets.meshes().append(SPACE.internals().platform); + let from = fromPillar, + d = { + x: rec.x - from.x, + y: rec.y - from.y, + z: rec.z - from.z + }; + let dist = Math.sqrt(d.x*d.x + d.y*d.y + d.z*d.z); + let lerp = UTIL.lerp(0,dist,dw).map(v => v/dist); + lerp.pop(); + for (let pct of lerp) { + let point = new THREE.Vector3(from.x + d.x * pct, from.z + d.z * pct - ip.y, from.y + d.y * pct); + addSupportAtPoint(targets, point); + } } ws.push(Object.clone(rec)); fromPillar = addWidgetSupport(iw, rec); API.conf.save(); }); + function addSupportAtPoint(targets, point) { + let up = new THREE.Vector3(0,1,0) + let dn = new THREE.Vector3(0,-1,0) + let rp = new THREE.Vector3(point.x, point.y, -point.z); + let iup = new THREE.Raycaster(rp, up) + .intersectObjects(targets, false) + .filter(t => !t.object.pillar); + if (iup.length && iup.length % 2 === 0) { + let idn = new THREE.Raycaster(rp, dn) + .intersectObjects(targets, false) + .filter(t => !t.object.pillar); + if (idn.length && idn.length % 2 === 0) { + iw = iup[0].object.widget || iw; + let wa = api.widgets.annotate(iw.id); + let ws = (wa.support = wa.support || []); + let phi = iup[0].point; + let plo = idn[0].point; + let mp = (phi.y - plo.y) / 2; + let dy = Math.abs(phi.y - plo.y); + let dw = api.conf.get().process.sliceSupportSize / 2; + let rec = { x:point.x, y:point.z, z:mp, dw, dh:dy, id: Math.random() * 0xffffffffff }; + ws.push(Object.clone(rec)); + fromPillar = addWidgetSupport(iw, rec); + } + } + } api.event.on("mouse.hover", data => { if (!isFdmMode) { return; @@ -342,25 +381,19 @@ if (int && int.face && int.face.normal.z < -0.1) { dir.y = -1; } - let targets = api.widgets.meshes() - .append(SPACE.internals().platform) - .appendAll(activeSupports()) - ; - let i2 = ray.intersectObjects(targets, false).filter(t => !t.object.pillar); - if (i2 && i2.length > 0) { - // prevent false matches close to origin of ray - i2 = i2.filter(i => i.distance > 0.1); - // prevent single point base to top matches - if (i2.length > 1) { - p2 = i2[0].point; - iw = i2[0].object.widget || iw; - let hy = (p1.y + p2.y) / 2; - let dy = Math.abs(p1.y - p2.y); - let dw = api.conf.get().process.sliceSupportSize / 2; - addbox({x:p1.x, y:hy, z:p1.z}, 0x0000dd, 'supp', { - x:dw, y:dw, z:dy - }); - } + let targets = api.widgets.meshes().append(SPACE.internals().platform); + let i2 = ray.intersectObjects(targets, false) + .filter(t => !t.object.pillar) // eliminate other pillars + .filter(i => i.distance > 0.1); // false matches close to origin of ray + if (i2.length && i2.length % 2 === 0) { + p2 = i2[0].point; + iw = i2[0].object.widget || iw; + let hy = (p1.y + p2.y) / 2; + let dy = Math.abs(p1.y - p2.y); + let dw = api.conf.get().process.sliceSupportSize / 2; + addbox({x:p1.x, y:hy, z:p1.z}, 0x0000dd, 'supp', { + x:dw, y:dw, z:dy + }); } if (event && event.altKey) { return func.hoverup(); From 1e064a193699a31a688e4cd688083582888d1fba Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 18 Feb 2021 16:12:04 -0500 Subject: [PATCH 133/255] account for widget position --- src/mode/fdm/client.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/mode/fdm/client.js b/src/mode/fdm/client.js index 335d63f7..f4aadc89 100644 --- a/src/mode/fdm/client.js +++ b/src/mode/fdm/client.js @@ -313,18 +313,18 @@ let lerp = UTIL.lerp(0,dist,dw).map(v => v/dist); lerp.pop(); for (let pct of lerp) { - let point = new THREE.Vector3(from.x + d.x * pct, from.z + d.z * pct - ip.y, from.y + d.y * pct); - addSupportAtPoint(targets, point); + let point = new THREE.Vector3(from.x + d.x * pct, from.z + d.z * pct, from.y + d.y * pct); + addSupportAtPoint(targets, point, ip); } } ws.push(Object.clone(rec)); fromPillar = addWidgetSupport(iw, rec); API.conf.save(); }); - function addSupportAtPoint(targets, point) { + function addSupportAtPoint(targets, point, ip) { let up = new THREE.Vector3(0,1,0) let dn = new THREE.Vector3(0,-1,0) - let rp = new THREE.Vector3(point.x, point.y, -point.z); + let rp = new THREE.Vector3(point.x + ip.x, point.y, -point.z - ip.y); let iup = new THREE.Raycaster(rp, up) .intersectObjects(targets, false) .filter(t => !t.object.pillar); @@ -338,7 +338,7 @@ let ws = (wa.support = wa.support || []); let phi = iup[0].point; let plo = idn[0].point; - let mp = (phi.y - plo.y) / 2; + let mp = (phi.y + plo.y) / 2; let dy = Math.abs(phi.y - plo.y); let dw = api.conf.get().process.sliceSupportSize / 2; let rec = { x:point.x, y:point.z, z:mp, dw, dh:dy, id: Math.random() * 0xffffffffff }; From 2dda131addb63b631c6d90d4ff1da49635720190 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 18 Feb 2021 17:26:24 -0500 Subject: [PATCH 134/255] adjust angle of starting pillar for range fills --- src/mode/fdm/client.js | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/mode/fdm/client.js b/src/mode/fdm/client.js index f4aadc89..9d94cfe2 100644 --- a/src/mode/fdm/client.js +++ b/src/mode/fdm/client.js @@ -311,17 +311,26 @@ }; let dist = Math.sqrt(d.x*d.x + d.y*d.y + d.z*d.z); let lerp = UTIL.lerp(0,dist,dw).map(v => v/dist); + let angle = rec.rz = Math.atan2(d.y,d.x); + let fromrec = ws.filter(r => r.id === from.id)[0]; + if (fromrec) { + from.rz = fromrec.rz = angle; + let q = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0,0,1), angle); + let m = new THREE.Matrix4().makeRotationFromQuaternion(q); + from.box.geometry.applyMatrix4(m); + } lerp.pop(); + let seed = Math.random(); for (let pct of lerp) { let point = new THREE.Vector3(from.x + d.x * pct, from.z + d.z * pct, from.y + d.y * pct); - addSupportAtPoint(targets, point, ip); + addSupportAtPoint(targets, point, ip, angle, seed++); } } ws.push(Object.clone(rec)); fromPillar = addWidgetSupport(iw, rec); API.conf.save(); }); - function addSupportAtPoint(targets, point, ip) { + function addSupportAtPoint(targets, point, ip, angle, id) { let up = new THREE.Vector3(0,1,0) let dn = new THREE.Vector3(0,-1,0) let rp = new THREE.Vector3(point.x + ip.x, point.y, -point.z - ip.y); @@ -341,7 +350,7 @@ let mp = (phi.y + plo.y) / 2; let dy = Math.abs(phi.y - plo.y); let dw = api.conf.get().process.sliceSupportSize / 2; - let rec = { x:point.x, y:point.z, z:mp, dw, dh:dy, id: Math.random() * 0xffffffffff }; + let rec = { rz:angle, x:point.x, y:point.z, z:mp, dw, dh:dy, id: id * 0xffffffffff }; ws.push(Object.clone(rec)); fromPillar = addWidgetSupport(iw, rec); } @@ -428,8 +437,8 @@ // prevent duplicate restore from repeated settings load calls if (!sups[id]) { pos.box = addbox( - { x, y, z, rz }, 0x0000dd, id, - { x:dw, y:dw, z:dh }, { group: widget.mesh } + { x, y, z }, 0x0000dd, id, + { x:dw, y:dw, z:dh, rz }, { group: widget.mesh } ); pos.box.pillar = Object.assign({widget}, pos); sups[id] = pos; From b88c47f6af136d1dbea9d635cab83f57208b1b1f Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 18 Feb 2021 17:27:08 -0500 Subject: [PATCH 135/255] bump rev 2.7.D8 --- package.json | 2 +- src/kiri.js | 2 +- src/license.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index dba165b8..ac261fdd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grid-apps", - "version": "2.7.7D", + "version": "2.7.8D", "description": "grid.space 3d slice & modeling tools", "author": "Stewart Allen ", "license": "MIT", diff --git a/src/kiri.js b/src/kiri.js index f0a2f623..a952c7e7 100644 --- a/src/kiri.js +++ b/src/kiri.js @@ -6,7 +6,7 @@ if (!self.kiri) { self.kiri = { - beta: 2707, + beta: 2708, driver: {}, // driver modules loader: [] // module loading: array of functions }; diff --git a/src/license.js b/src/license.js index 00de7864..c0214090 100644 --- a/src/license.js +++ b/src/license.js @@ -3,7 +3,7 @@ let terms = { COPYRIGHT: "Copyright (C) Stewart Allen - All Rights Reserved", LICENSE: "See the license.md file included with the source distribution", - VERSION: "2.7.D7" + VERSION: "2.7.D8" }; if (typeof(module) === 'object') { From 125f9cb16bbdbc551b80a311cf65c2e57feb9401 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 18 Feb 2021 22:47:52 -0500 Subject: [PATCH 136/255] fix restore from .km preserving widget annotations. fix trace ordering for tops that split down. fix support z span --- notes.md | 1 + src/kiri/main.js | 4 +-- src/kiri/print.js | 79 +++++++++++++++++++++++++++++++----------- src/mode/fdm/client.js | 18 ++++++---- 4 files changed, 72 insertions(+), 30 deletions(-) diff --git a/notes.md b/notes.md index d59af98f..41b35fc4 100644 --- a/notes.md +++ b/notes.md @@ -54,6 +54,7 @@ # FDM - BELT +* `B` auto bed resizing leaves the origin in the wrong place at first * `B` ranges don't work with anchors * `B` multiple parts with one angled against origin "floats" in preview * `B` re-add progress calls for all work units diff --git a/src/kiri/main.js b/src/kiri/main.js index 6d65f95e..eec825b6 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -2271,10 +2271,11 @@ } } if (isSettings) { + clearWorkspace(); settings = CONF.normalize(data.settings); SDB.setItem('ws-settings', JSON.stringify(settings)); - if (LOCAL) console.log('settings',Object.clone(settings)); restoreSettings(); + if (LOCAL) console.log('settings',Object.clone(settings)); if (isWork) { API.platform.clear(); KIRI.codec.decode(data.work).forEach(widget => { @@ -2416,7 +2417,6 @@ function restoreSettings(save) { let newset = ls2o('ws-settings') || settings; - settings = CONF.normalize(newset); // override camera from settings if (settings.controller.view) { diff --git a/src/kiri/print.js b/src/kiri/print.js index e4e3e094..b55057ad 100644 --- a/src/kiri/print.js +++ b/src/kiri/print.js @@ -566,12 +566,48 @@ return int; } - function outputTraces(poly, extrude) { + function outputTraces(poly, opt = {}) { if (!poly) return; if (Array.isArray(poly)) { - outputOrderClosest(poly, function(next) { - outputTraces(next, extrude); - }, null); + if (opt.sort) { + let polys = poly.slice().sort(function(a,b) { + return (a.perimeter() - b.perimeter()) * opt.sort; + }); + let debug = polys.length > 3; + let last; + while (polys.length) { + let next; + for (let p of polys) { + if (!last) { + next = p; + break; + } + if (opt.sort > 0) { + // in-out + if (last.isInside(p)) { + next = p; + break; + } + } else { + // out-in + if (p.isInside(last)) { + next = p; + break; + } + } + } + if (next) { + last = next; + polys.remove(next); + outputTraces(next, opt); + } else { + last = null; + } + } + } + // outputOrderClosest(poly, function(next) { + // outputTraces(next, opt); + // }, null); } else { let finishShell = poly.depth === 0 && !firstLayer; startPoint = scope.polyPrintPath(poly, startPoint, preout, { @@ -580,7 +616,7 @@ accel: finishShell, wipe: process.outputWipeDistance || 0, coast: firstLayer ? 0 : coastDist, - extrude: pref(extrude, shellMult), + extrude: pref(opt.extrude, shellMult), onfirst: function(firstPoint) { if (startPoint.distTo2D(firstPoint) > retractDist) { retract(); @@ -776,11 +812,11 @@ * the special exception that depth is considered into distance * so that inner polygons are emitted first. * - * @param {Array} array of Polygon or Polygon wrappers - * @param {Function} fn - * @param {Function} fnp convert 'next' object into a Polygon + * @param {Array} array of Polygons or Polygon wrappers (tops) + * @param {Function} fn call to emit next candidate + * @param {Function} fnp convert 'next' object into a Polygon for closeness */ - function outputOrderClosest(array, fn, fnp, newTop) { + function outputOrderClosest(array, fn, fnp) { if (array.length === 1) { return fn(array[0]); } @@ -800,7 +836,6 @@ d: find.distance - (poly.depth * thinWall), }); } - newTop = false; if (order.length === 0) { return; } @@ -848,23 +883,24 @@ shellOrder = -1; } - // top object - let bounds = POLY.flatten(next.shellsAtDepth(0).clone(true)); + // innermost shells + let inner = next.innerShells() || []; // output inner polygons - if (shellOrder === 1) - outputTraces([].appendAll(next.innerShells() || [])); + if (shellOrder === 1) outputTraces(inner); + + outputTraces(next.shells, { sort: shellOrder }); // sort perimeter polygon by length to go out-to-in or in-to-out - (next.shells || []).sort(function(a,b) { - return a.perimeter() > b.perimeter() ? shellOrder : -shellOrder; - }).forEach(function(poly, index) { - outputTraces(poly); - }); + // this causes too much seeking when nesting splits into disconnected areas + // (next.shells || []).sort(function(a,b) { + // return a.perimeter() > b.perimeter() ? shellOrder : -shellOrder; + // }).forEach(function(poly, index) { + // outputTraces(poly); + // }); // output outer polygons - if (shellOrder === -1) - outputTraces([].appendAll(next.innerShells() || [])); + if (shellOrder === -1) outputTraces(inner); // output thin fill outputFills(next.thin_fill, {near: true}); @@ -876,6 +912,7 @@ lastTop = next; } }, function(obj) { + // for tops return obj instanceof Polygon ? obj : obj.poly; }); diff --git a/src/mode/fdm/client.js b/src/mode/fdm/client.js index 9d94cfe2..854a6b4f 100644 --- a/src/mode/fdm/client.js +++ b/src/mode/fdm/client.js @@ -9,8 +9,11 @@ UTIL = BASE.util, FDM = KIRI.driver.FDM, SPACE, API, VIEWS, LANG, PROC, UI, UC, + nextID = Date.now(), p1, p2, iw, - lastMode, lastView, lastPillar, fromPillar, + lastBox, + lastMode, lastView, + lastPillar, fromPillar, isFdmMode = false, addingSupports = false, alert = [], @@ -291,16 +294,16 @@ return; } if (!iw) return; + let { point, dim } = lastBox; p1.y = Math.max(0, p1.y); p2.y = Math.max(0, p2.y); - let hy = (p1.y + p2.y) / 2; - let dh = Math.abs(p1.y - p2.y); + let dh = dim.z; let dw = api.conf.get().process.sliceSupportSize / 2; let ip = iw.track.pos; let wa = api.widgets.annotate(iw.id); let ws = (wa.support = wa.support || []); - let x = p1.x - ip.x, y = -p1.z - ip.y, z = hy, id = Date.now(); - let rec = {x, y, z, dw, dh, id}; + let id = ++nextID; + let rec = {x: point.x - ip.x, y: -point.z - ip.y, z: point.y, dw, dh, id}; if (fromPillar && event && event.shiftKey) { let targets = api.widgets.meshes().append(SPACE.internals().platform); let from = fromPillar, @@ -350,7 +353,7 @@ let mp = (phi.y + plo.y) / 2; let dy = Math.abs(phi.y - plo.y); let dw = api.conf.get().process.sliceSupportSize / 2; - let rec = { rz:angle, x:point.x, y:point.z, z:mp, dw, dh:dy, id: id * 0xffffffffff }; + let rec = { rz:angle, x:point.x, y:point.z, z:mp, dw, dh:dy, id }; ws.push(Object.clone(rec)); fromPillar = addWidgetSupport(iw, rec); } @@ -416,7 +419,6 @@ Object.values(widget.sups || {}).forEach(support => { active.push(support.box); support.box.support = true; - // console.log({support}); }); }); return active; @@ -495,6 +497,8 @@ box.position.y = point.y; box.position.z = point.z; + lastBox = {point, dim}; + const group = opt.group || SPACE.scene group.add(box); box.groupTo = group; From acc773e9d78d963b49023f54a6a231511f05a3bb Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 19 Feb 2021 12:09:39 -0500 Subject: [PATCH 137/255] fix support density in ranges --- src/mode/fdm/prepare.js | 2 +- src/mode/fdm/slice.js | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index e6f5ee92..be1c7c07 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -524,7 +524,7 @@ } // add brim, if specified if (first && firstLayerBrim) { - let {emit, tool } = first; + let { emit, tool } = first; let y = maxy; let z = minz; let b = Math.max(firstLayerBrim, 1); diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index c38e9e73..f090632e 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -398,18 +398,21 @@ }); lastType = newType; }, "infill"); - } else if (isSynth && supportDensity) { + } else if (isSynth) { forSlices(0.5, 0.7, slice => { + let params = getRangeParameters(settings, slice.index); + let density = params.sliceSupportDensity; + if (density) for (let top of slice.tops) { let offset = []; POLY.expand(top.shells, -nozzleSize/4, slice.z, offset); - fillSupportPolys(offset, lineWidth, supportDensity, slice.z); + fillSupportPolys(offset, lineWidth, density, slice.z); top.fill_lines = offset.map(o => o.fill).flat().filter(v => v); } }, "infill"); } - // belt supports are their own thing + // auto support generation if (!isBelt && !isSynth && supportDensity && spro.sliceSupportEnable) { forSlices(0.7, 0.8, slice => { doSupport(slice, spro, shadow); From 3c4a282f67ec621859ac3f1a16c305041009a12a Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 20 Feb 2021 10:55:59 -0500 Subject: [PATCH 138/255] experimental new form of thin wall handling --- src/geo/polygons.js | 17 +++++++++++++++++ src/mode/fdm/slice.js | 30 +++++++++++++++++++++++------- 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/src/geo/polygons.js b/src/geo/polygons.js index d1279995..0413565a 100644 --- a/src/geo/polygons.js +++ b/src/geo/polygons.js @@ -30,6 +30,7 @@ expand, expand_lines, union, + inset, nest, diff, setZ, @@ -540,6 +541,22 @@ return opts.flat ? opts.outs : polys; } + function inset(polys, dist, count, z) { + let total = count; + let layers = []; + let ref = polys; + while (count-- > 0 && ref && ref.length) { + let off = offset(ref, -dist, {z}); + let mid = offset(off, dist / 2, {z}); + let cmp = offset(off, dist, {z}); + let gap = []; + subtract(ref, cmp, gap, null, z); + layers.push({idx: total-count, off, mid, gap}); + ref = off; + } + return layers; + } + /** * todo use clipper opne poly clipping? * diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index f090632e..3505ba31 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -59,6 +59,7 @@ FDM.slice = function(settings, widget, onupdate, ondone) { FDM.fixExtruders(settings); let render = settings.render !== false, + ctrl = settings.controller, spro = settings.process, sdev = settings.device, isBelt = sdev.bedBelt, @@ -85,8 +86,8 @@ beltfact = Math.cos(Math.PI/4), invbfact = 1 / beltfact; - isFlat = settings.controller.lineType === "flat"; - isThin = !isFlat && settings.controller.lineType === "line"; + isFlat = ctrl.lineType === "flat"; + isThin = !isFlat && ctrl.lineType === "line"; offset = lineWidth / 2; if (isFlat) { @@ -151,7 +152,7 @@ height: sliceHeight, minHeight: sliceMinHeight, firstHeight: firstSliceHeight, - union: settings.controller.healMesh, + union: ctrl.healMesh, // debug: true, // xray: 3, // view: view @@ -289,7 +290,8 @@ doShells(slice, count, offset, fillOff, { vase: vaseMode, thin: spro.detectThinWalls && !isSynth, - widget: widget + widget: widget, + danger: ctrl.danger }); if (solid) { let fillSpace = fillSpacing * spaceMult; @@ -569,7 +571,23 @@ let dist = p.first().distTo2D(p.last()); if (dist < 1) p.open = false; } }); - if (opt.thin) { + + if (opt.danger && opt.thin) { + top.thin_fill = []; + let layers = POLY.inset(top_poly, offsetN, count, z); + last = layers.last().mid; + top.shells = layers.map(r => r.mid).flat(); + layers.map(r => r.gap).forEach((polys, i) => { + let off = offset1; + polys = POLY.offset(polys, -off * 0.8, {z, minArea: 0}); + if (polys.length) { + top.thin_fill.appendAll(cullIntersections( + fillArea(polys, 45, off/2, []),//, 0.01, off*2), + fillArea(polys, 135, off/2, [])//, 0.01, off*2), + )); + } + }); + } else if (opt.thin) { top.thin_fill = []; let oso = {z, count, gaps: [], outs: [], minArea: 0.05}; POLY.offset(top_poly, [-offset1, -offsetN], oso); @@ -593,8 +611,6 @@ top.thin_fill.appendAll(cullIntersections( fillArea(polys, 45, off/2, [], 0.01, off*2), fillArea(polys, 135, off/2, [], 0.01, off*2), - // fillArea(polys, 90, off, [], 0.05, off*4), - // fillArea(polys, 180, off, [], 0.05, off*4), )); gaps = polys; }); From 2a345c8471bb8b77e7e2d0e331e0488188fed01c Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 20 Feb 2021 11:36:50 -0500 Subject: [PATCH 139/255] tweak thin fill parameters --- src/mode/fdm/slice.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index 3505ba31..b7b12bfc 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -571,7 +571,6 @@ let dist = p.first().distTo2D(p.last()); if (dist < 1) p.open = false; } }); - if (opt.danger && opt.thin) { top.thin_fill = []; let layers = POLY.inset(top_poly, offsetN, count, z); @@ -582,8 +581,8 @@ polys = POLY.offset(polys, -off * 0.8, {z, minArea: 0}); if (polys.length) { top.thin_fill.appendAll(cullIntersections( - fillArea(polys, 45, off/2, []),//, 0.01, off*2), - fillArea(polys, 135, off/2, [])//, 0.01, off*2), + fillArea(polys, 45, off, [], off/4, off*4), + fillArea(polys, 135, off, [], off/4, off*4), )); } }); @@ -607,7 +606,6 @@ oso.gaps.forEach((polys, i) => { let off = (i == 0 ? offset1 : offsetN); polys = POLY.offset(polys, -off * 0.8, {z, minArea: 0}); - // polys.forEach(p => { slice.solids.trimmed.push(p); }); top.thin_fill.appendAll(cullIntersections( fillArea(polys, 45, off/2, [], 0.01, off*2), fillArea(polys, 135, off/2, [], 0.01, off*2), From bc33c71f34ee7a2dcc0eb97b556e3813b3acc8e1 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 20 Feb 2021 22:50:03 -0500 Subject: [PATCH 140/255] add new experimental thin fill --- src/dev/fdm/Creality.CR-30 | 2 +- src/geo/base.js | 4 +- src/geo/polygon.js | 176 +++++++++++++++++++++++++++++++++++++ src/geo/polygons.js | 5 ++ src/kiri/init.js | 1 - src/kiri/main.js | 19 ++-- src/kiri/print.js | 19 ++-- src/mode/fdm/slice.js | 27 +++--- 8 files changed, 216 insertions(+), 37 deletions(-) diff --git a/src/dev/fdm/Creality.CR-30 b/src/dev/fdm/Creality.CR-30 index d2f8d687..a080edbd 100644 --- a/src/dev/fdm/Creality.CR-30 +++ b/src/dev/fdm/Creality.CR-30 @@ -53,7 +53,7 @@ "origin_center": false, "extrude_abs": true, "bed_belt": true, - "bed_width": 215, + "bed_width": 220, "bed_depth": 300, "build_height": 170 }, diff --git a/src/geo/base.js b/src/geo/base.js index 04b7dca8..0c0bfcff 100644 --- a/src/geo/base.js +++ b/src/geo/base.js @@ -15,7 +15,7 @@ function time() { return Date.now() } - function lerp(from, to, maxInc) { + function lerp(from, to, maxInc, incFrom) { let dir = Math.sign(to - from); let delta = Math.abs(to - from); let steps = Math.floor(delta / maxInc); @@ -25,7 +25,7 @@ steps++; per = delta / steps; } - let out = []; + let out = incFrom ? [from] : []; while (steps-- > 0) { from += per * dir; out.push(from); diff --git a/src/geo/polygon.js b/src/geo/polygon.js index 3235eb34..465c9a91 100644 --- a/src/geo/polygon.js +++ b/src/geo/polygon.js @@ -260,6 +260,182 @@ return Math.abs(diff); } + // generate center crossing point cloud + PRO.centers = function(step, z, min, max, opt = {}) { + let cloud = [], + bounds = this.bounds, + points = this.points, + length = points.length, + lines = opt.lines || false; + + for (let y of UTIL.lerp(bounds.miny + 0.01, bounds.maxy - 0.01, step, true)) { + let ints = []; + for (let i=0; i y) || + (p1.y > y && p2.y <= y) + ) ints.push([p1,p2]); + } + let cntr = []; + if (ints.length && ints.length % 2 === 0) { + for (let int of ints) { + let [p1, p2] = int; + if (p2.y < p1.y) { + let tp = p1; + p1 = p2; + p2 = tp; + } + let minx = Math.min(p1.x, p2.x); + let maxx = Math.max(p1.x, p2.x); + let miny = Math.min(p1.y, p2.y); + let maxy = Math.max(p1.y, p2.y); + let dx = p2.x - p1.x; + let dy = maxy - miny; + let pct = (y - miny) / dy; + let xpo = p1.x + pct * dx; + cntr.push(xpo); + } + } + cntr.sort((a, b) => { + return b - a; + }); + let lp, eo = 0; + for (let x of cntr) { + let p = BASE.newPoint(x, y, z); + if (eo++ % 2) { + let d = lp.distTo2D(p); + if (d >= min && d <= max) { + if (lines) { + cloud.push(lp); + cloud.push(p); + } else { + cloud.push(BASE.newPoint( + (lp.x + p.x) / 2, y, z + )); + } + } + } else { + lp = p; + } + } + } + + for (let x of UTIL.lerp(bounds.minx + 0.01, bounds.maxx - 0.01, step, true)) { + let ints = []; + for (let i=0; i x) || + (p1.x > x && p2.x <= x) + ) ints.push([p1,p2]); + } + let cntr = []; + if (ints.length && ints.length % 2 === 0) { + for (let int of ints) { + let [p1, p2] = int; + if (p2.x < p1.x) { + let tp = p1; + p1 = p2; + p2 = tp; + } + let minx = Math.min(p1.x, p2.x); + let maxx = Math.max(p1.x, p2.x); + let miny = Math.min(p1.y, p2.y); + let maxy = Math.max(p1.y, p2.y); + let dx = maxx - minx; + let dy = p2.y - p1.y; + let pct = (x - minx) / dx; + let ypo = p1.y + pct * dy; + cntr.push(ypo); + } + } + cntr.sort((a, b) => { + return b - a; + }); + let lp, eo = 0; + for (let y of cntr) { + let p = BASE.newPoint(x, y, z); + if (eo++ % 2) { + let d = lp.distTo2D(p); + if (d >= min && d <= max) { + if (lines) { + cloud.push(lp); + cloud.push(p); + } else { + cloud.push(BASE.newPoint( + x, (lp.y + p.y) / 2, z + )); + } + } + } else { + lp = p; + } + } + } + + if (lines) { + return cloud; + } + + let mindist = opt.mindist || step * 1.5; + + function build(poly) { + let lastp = poly.last(); + let minp; + let mind = Infinity; + for (let point of cloud) { + let dist = point.distTo2D(lastp); + if (dist < mindist && dist < mind) { + mind = dist; + minp = point; + } + } + if (minp) { + cloud = cloud.filter(p => p !== minp); + poly.push(minp); + return true; + } + return false; + } + + // join points into polys + let polys = []; + let poly = []; + while (cloud.length) { + if (poly.length === 0) { + poly = [ cloud.shift() ]; + polys.push(poly); + continue; + } + if (build(poly)) { + continue; + } + if (!poly.flip) { + poly.reverse(); + poly.flip = true; + continue; + } + if (poly.length) { + poly = []; + } else { + throw "whoop there it is"; + } + } + + return polys + .filter(poly => poly.length > 1) + .map(poly => { + let np = BASE.newPolygon().setOpen(); + for (let p of poly) { + np.push(p); + } + return np; + }); + }; + PRO.debur = function(dist) { if (this.len < 2) { return null; diff --git a/src/geo/polygons.js b/src/geo/polygons.js index 0413565a..4e710b0b 100644 --- a/src/geo/polygons.js +++ b/src/geo/polygons.js @@ -541,6 +541,11 @@ return opts.flat ? opts.outs : polys; } + /** + * progressive insetting that does inset + outset to debur as well + * as performing subtractive analysis between initial layer shell (ref) + * and last offset (cmp) to produce gap candidates (for thinfill) + */ function inset(polys, dist, count, z) { let total = count; let layers = []; diff --git a/src/kiri/init.js b/src/kiri/init.js index 58566445..2a0cdaec 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -2201,7 +2201,6 @@ SPACE.mouse.up((event, int) => { if (event.button === 2 && API.view.isArrange()) { - console.log({up: event, int}); let style = UI.context.style; style.display = 'flex'; style.left = `${event.clientX-3}px`; diff --git a/src/kiri/main.js b/src/kiri/main.js index eec825b6..7b3f9dc8 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -1002,14 +1002,15 @@ KIRI.client.sync(); KIRI.client.rotate(settings); + let segtimes = {}, + segNumber = 0, + errored = false, + startTime = Date.now(), + lastMsg; + // for each widget, slice forAllWidgets(function(widget) { - let segtimes = {}, - segNumber = 0, - errored = false, - startTime = Date.now(), - lastMsg, - camOrLaser = mode === 'CAM' || mode === 'LASER', + let camOrLaser = mode === 'CAM' || mode === 'LASER', stack = widget.stack = STACKS.create(widget.id, widget.mesh), factor = (widget.getVertices().count / defvert); @@ -1022,7 +1023,7 @@ if (sliced) { // update segment time if (lastMsg) { - segtimes[`${segNumber++}_${lastMsg}`] = mark - startTime; + segtimes[`${widget.id}_${segNumber++}_${lastMsg}`] = mark - startTime; } API.event.emit('slice', getMode()); } @@ -1048,7 +1049,7 @@ KIRI.client.unrotate(settings, () => { forAllWidgets(widget => { // on done - segtimes[`${segNumber++}_draw`] = widget.render(widget.stack); + segtimes[`${widget.id}_${segNumber++}_draw`] = widget.render(widget.stack); // rotate stack for belt beds if (widget.rotinfo) { widget.stack.obj.rotate(widget.rotinfo); @@ -1086,7 +1087,7 @@ if (msg && msg !== lastMsg) { let mark = Date.now(); if (lastMsg) { - segtimes[`${segNumber++}_${lastMsg}`] = mark - startTime; + segtimes[`${widget.id}_${segNumber++}_${lastMsg}`] = mark - startTime; } lastMsg = msg; startTime = mark; diff --git a/src/kiri/print.js b/src/kiri/print.js index b55057ad..b7b15056 100644 --- a/src/kiri/print.js +++ b/src/kiri/print.js @@ -604,10 +604,11 @@ last = null; } } + } else { + outputOrderClosest(poly, function(next) { + outputTraces(next, opt); + }, null); } - // outputOrderClosest(poly, function(next) { - // outputTraces(next, opt); - // }, null); } else { let finishShell = poly.depth === 0 && !firstLayer; startPoint = scope.polyPrintPath(poly, startPoint, preout, { @@ -887,20 +888,12 @@ let inner = next.innerShells() || []; // output inner polygons - if (shellOrder === 1) outputTraces(inner); + if (shellOrder === 1) outputTraces(inner, { sort: shellOrder }); outputTraces(next.shells, { sort: shellOrder }); - // sort perimeter polygon by length to go out-to-in or in-to-out - // this causes too much seeking when nesting splits into disconnected areas - // (next.shells || []).sort(function(a,b) { - // return a.perimeter() > b.perimeter() ? shellOrder : -shellOrder; - // }).forEach(function(poly, index) { - // outputTraces(poly); - // }); - // output outer polygons - if (shellOrder === -1) outputTraces(inner); + if (shellOrder === -1) outputTraces(inner, { sort: shellOrder }); // output thin fill outputFills(next.thin_fill, {near: true}); diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index b7b12bfc..29182c3d 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -21,7 +21,8 @@ shell: { check: 0x0077bb, face: 0x0077bb, line: 0x0077bb, opacity: 1 }, fill: { check: 0x00bb77, face: 0x00bb77, line: 0x00bb77, opacity: 1 }, infill: { check: 0x3322bb, face: 0x3322bb, line: 0x3322bb, opacity: 1 }, - support: { check: 0xaa5533, face: 0xaa5533, line: 0xaa5533, opacity: 1 } + support: { check: 0xaa5533, face: 0xaa5533, line: 0xaa5533, opacity: 1 }, + gaps: { check: 0xaa3366, face: 0xaa3366, line: 0xaa3366, opacity: 1 } }, PROTO = Object.clone(COLOR), bwcomp = (1 / Math.cos(Math.PI/4)), @@ -463,6 +464,10 @@ .setLayer("shells", isSynth ? COLOR.support : COLOR.shell) .addPolys(top.shells, vopt({ offset, height })); + if (top.gaps) output + .setLayer("gaps", COLOR.gaps) + .addPolys(top.gaps, vopt({ offset, height, thin: true })); + // if (isThin && debug) { // slice.output() // .setLayer('offset', { face: 0, line: 0x888888 }) @@ -573,19 +578,19 @@ } }); if (opt.danger && opt.thin) { top.thin_fill = []; + top.fill_sparse = []; let layers = POLY.inset(top_poly, offsetN, count, z); last = layers.last().mid; top.shells = layers.map(r => r.mid).flat(); - layers.map(r => r.gap).forEach((polys, i) => { - let off = offset1; - polys = POLY.offset(polys, -off * 0.8, {z, minArea: 0}); - if (polys.length) { - top.thin_fill.appendAll(cullIntersections( - fillArea(polys, 45, off, [], off/4, off*4), - fillArea(polys, 135, off, [], off/4, off*4), - )); - } - }); + top.gaps = layers.map(r => r.gap).flat(); + let off = offsetN; + let min = off * 0.9; + let max = off * 4; + for (let poly of layers.map(r => r.gap).flat()) { + let centers = poly.centers(off/2, z, min, max, {lines:false}); + top.fill_sparse.appendAll(centers); + // top.thin_fill.appendAll(centers); + } } else if (opt.thin) { top.thin_fill = []; let oso = {z, count, gaps: [], outs: [], minArea: 0.05}; From aab127c4aa0c7d244291141ed4cf69fb116b13e0 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 20 Feb 2021 22:50:34 -0500 Subject: [PATCH 141/255] bump rev 2.7.D9 --- package.json | 2 +- src/kiri.js | 2 +- src/license.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index ac261fdd..79c94216 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grid-apps", - "version": "2.7.8D", + "version": "2.7.9D", "description": "grid.space 3d slice & modeling tools", "author": "Stewart Allen ", "license": "MIT", diff --git a/src/kiri.js b/src/kiri.js index a952c7e7..54f672c3 100644 --- a/src/kiri.js +++ b/src/kiri.js @@ -6,7 +6,7 @@ if (!self.kiri) { self.kiri = { - beta: 2708, + beta: 2709, driver: {}, // driver modules loader: [] // module loading: array of functions }; diff --git a/src/license.js b/src/license.js index c0214090..2cc47962 100644 --- a/src/license.js +++ b/src/license.js @@ -3,7 +3,7 @@ let terms = { COPYRIGHT: "Copyright (C) Stewart Allen - All Rights Reserved", LICENSE: "See the license.md file included with the source distribution", - VERSION: "2.7.D8" + VERSION: "2.7.D9" }; if (typeof(module) === 'object') { From 804620d91e737d81b27c1d32dcaca0e860c4c8bb Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 20 Feb 2021 23:10:41 -0500 Subject: [PATCH 142/255] filter false gap positives. also faster --- src/geo/polygons.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/geo/polygons.js b/src/geo/polygons.js index 4e710b0b..e6b389cb 100644 --- a/src/geo/polygons.js +++ b/src/geo/polygons.js @@ -555,7 +555,13 @@ let mid = offset(off, dist / 2, {z}); let cmp = offset(off, dist, {z}); let gap = []; - subtract(ref, cmp, gap, null, z); + let aref = ref.map(p => p.areaDeep()).reduce((a,p) => a +p); + let cref = cmp.length ? cmp.map(p => p.areaDeep()).reduce((a,p) => a + p) : 0; + // threshold subtraction to area deltas > 0.1 % to filter out false + // positives where inset/outset are identical floating point error + if (Math.abs(aref - cref) > 1 - (Math.abs(aref / cref) / 1000)) { + subtract(ref, cmp, gap, null, z); + } layers.push({idx: total-count, off, mid, gap}); ref = off; } From d5c6e8aad6e46388a0e684e74308da3a8cb8a982 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 21 Feb 2021 00:17:21 -0500 Subject: [PATCH 143/255] fix thin wall (centers) for compound polys --- src/geo/polygon.js | 50 +++++++++++++++++++++++++++---------------- src/mode/fdm/slice.js | 4 ++-- 2 files changed, 33 insertions(+), 21 deletions(-) diff --git a/src/geo/polygon.js b/src/geo/polygon.js index 465c9a91..72f444fd 100644 --- a/src/geo/polygon.js +++ b/src/geo/polygon.js @@ -264,19 +264,28 @@ PRO.centers = function(step, z, min, max, opt = {}) { let cloud = [], bounds = this.bounds, - points = this.points, - length = points.length, - lines = opt.lines || false; + lines = opt.lines || false, + stepoff = step / 2, + set = [this.points]; - for (let y of UTIL.lerp(bounds.miny + 0.01, bounds.maxy - 0.01, step, true)) { + if (this.inner) { + for (let inner of this.inner) { + set.push(inner.points); + } + } + + for (let y of UTIL.lerp(bounds.miny + stepoff, bounds.maxy - stepoff, step, true)) { let ints = []; - for (let i=0; i y) || - (p1.y > y && p2.y <= y) - ) ints.push([p1,p2]); + for (let points of set) { + let length = points.length; + for (let i=0; i y) || + (p1.y > y && p2.y <= y) + ) ints.push([p1,p2]); + } } let cntr = []; if (ints.length && ints.length % 2 === 0) { @@ -322,15 +331,18 @@ } } - for (let x of UTIL.lerp(bounds.minx + 0.01, bounds.maxx - 0.01, step, true)) { + for (let x of UTIL.lerp(bounds.minx + stepoff, bounds.maxx - stepoff, step, true)) { let ints = []; - for (let i=0; i x) || - (p1.x > x && p2.x <= x) - ) ints.push([p1,p2]); + for (let points of set) { + let length = points.length; + for (let i=0; i x) || + (p1.x > x && p2.x <= x) + ) ints.push([p1,p2]); + } } let cntr = []; if (ints.length && ints.length % 2 === 0) { diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index 29182c3d..ee43ea86 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -584,12 +584,12 @@ top.shells = layers.map(r => r.mid).flat(); top.gaps = layers.map(r => r.gap).flat(); let off = offsetN; - let min = off * 0.9; + let min = off * 0.75; let max = off * 4; for (let poly of layers.map(r => r.gap).flat()) { let centers = poly.centers(off/2, z, min, max, {lines:false}); top.fill_sparse.appendAll(centers); - // top.thin_fill.appendAll(centers); + // top.fill_lines.appendAll(centers); } } else if (opt.thin) { top.thin_fill = []; From d9950bb9f0c85d98abe3245b32683abde588bec4 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 21 Feb 2021 18:00:28 -0500 Subject: [PATCH 144/255] fix first pillar re-orientation in linear chains --- src/mode/fdm/client.js | 45 ++++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/src/mode/fdm/client.js b/src/mode/fdm/client.js index 854a6b4f..c7b10bb0 100644 --- a/src/mode/fdm/client.js +++ b/src/mode/fdm/client.js @@ -111,6 +111,7 @@ lastView = view; updateVisiblity(); filterSynth(); + func.sdone(); // let ranges = API.conf.get().process.ranges; if (isFdmMode) { if (lastView === VIEWS.SLICE) { @@ -277,33 +278,21 @@ } delbox('supp'); if (lastPillar) { - const {widget, box, id} = lastPillar; - widget.adds.remove(box); - widget.mesh.remove(box); - delete widget.sups[id]; - let sa = API.widgets.annotate(widget.id).support; - let ix = 0; - sa.forEach((rec,i) => { - if (rec.id === id) { - ix = i; - } - }); - sa.splice(ix,1); - API.conf.save(); - fromPillar = undefined; + removeWidgetSupport(lastPillar.widget, lastPillar); return; } if (!iw) return; let { point, dim } = lastBox; p1.y = Math.max(0, p1.y); p2.y = Math.max(0, p2.y); + let rz = dim.rz; let dh = dim.z; let dw = api.conf.get().process.sliceSupportSize / 2; let ip = iw.track.pos; let wa = api.widgets.annotate(iw.id); let ws = (wa.support = wa.support || []); let id = ++nextID; - let rec = {x: point.x - ip.x, y: -point.z - ip.y, z: point.y, dw, dh, id}; + let rec = {x: point.x - ip.x, y: -point.z - ip.y, z: point.y, rz, dw, dh, id}; if (fromPillar && event && event.shiftKey) { let targets = api.widgets.meshes().append(SPACE.internals().platform); let from = fromPillar, @@ -318,9 +307,9 @@ let fromrec = ws.filter(r => r.id === from.id)[0]; if (fromrec) { from.rz = fromrec.rz = angle; - let q = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0,0,1), angle); - let m = new THREE.Matrix4().makeRotationFromQuaternion(q); - from.box.geometry.applyMatrix4(m); + removeWidgetSupport(iw, fromPillar); + ws.push(Object.clone(fromrec)); + addWidgetSupport(iw, fromrec); } lerp.pop(); let seed = Math.random(); @@ -389,6 +378,7 @@ p1 = point; let dir = new THREE.Vector3(0,1,0) let ray = new THREE.Raycaster(point, dir); + let rz = int && int.face ? Math.atan2(int.face.normal.y, int.face.normal.x) : 0; // when on object, project down on downward faces if (int && int.face && int.face.normal.z < -0.1) { dir.y = -1; @@ -404,7 +394,7 @@ let dy = Math.abs(p1.y - p2.y); let dw = api.conf.get().process.sliceSupportSize / 2; addbox({x:p1.x, y:hy, z:p1.z}, 0x0000dd, 'supp', { - x:dw, y:dw, z:dy + x:dw, y:dw, z:dy, rz }); } if (event && event.altKey) { @@ -449,6 +439,23 @@ return sups[id]; } + function removeWidgetSupport(widget, rec) { + const {box, id} = rec; + widget.adds.remove(box); + widget.mesh.remove(box); + delete widget.sups[id]; + let sa = API.widgets.annotate(widget.id).support; + let ix = 0; + sa.forEach((rec,i) => { + if (rec.id === id) { + ix = i; + } + }); + sa.splice(ix,1); + API.conf.save(); + fromPillar = undefined; + } + function updateVisiblity() { API.widgets.all().forEach(w => { setSupportVisiblity(w, lastMode === 'FDM' && lastView === VIEWS.ARRANGE); From 8c9ce8b690b5c1c1fcab92ab02a7c7eeb150cab4 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 21 Feb 2021 22:50:39 -0500 Subject: [PATCH 145/255] use widget filenames in export dialog --- src/kiri/export.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/kiri/export.js b/src/kiri/export.js index ebecd552..7c048c69 100644 --- a/src/kiri/export.js +++ b/src/kiri/export.js @@ -123,8 +123,15 @@ SDB['kiri-print-seq'] = printSeq++; let settings = API.conf.get(), + names = API.widgets.all() + .map(w => w.meta ? w.meta.file : undefined) + .filter(v => v) + .map(v => v.replace(/ /g,'-')) + .map(v => v.substring(0,20)) + .map(v => v.split('.')[0]), + name = names[0] || (MODE === MODES.CAM ? "cnc" : "print"), MODE = API.mode.get_id(), - pre = (MODE === MODES.CAM ? "cnc-" : "print-") + (printSeq.toString().padStart(3,"0")), + pre = `${name}-${(printSeq.toString().padStart(3,"0"))}`, filename = pre,// + (new Date().getTime().toString(36)), fileext = settings.device.gcodeFExt || "gcode", codeproc = settings.device.gcodeProc, From 7c63a4dbcbde1813b7137f5ea55c6139b93367ca Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 21 Feb 2021 22:54:50 -0500 Subject: [PATCH 146/255] fix auto-save to sproc of proper process name --- src/kiri/main.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/kiri/main.js b/src/kiri/main.js index 7b3f9dc8..7c5cb05d 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -2217,6 +2217,7 @@ } const mode = settings.mode; settings.sproc[mode].default = settings.process; + settings.sproc[mode][settings.process.processName] = settings.process; settings.device.bedBelt = UI.deviceBelt.checked; settings.device.bedRound = UI.deviceRound.checked; settings.device.originCenter = UI.deviceOrigin.checked; From 48676116f8ef4d1ce4a67304fa86ad8c4985ce3f Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 21 Feb 2021 22:55:42 -0500 Subject: [PATCH 147/255] bump rev 2.7.D10 --- package.json | 2 +- src/kiri.js | 2 +- src/license.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 79c94216..1742ea2c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grid-apps", - "version": "2.7.9D", + "version": "2.7.10D", "description": "grid.space 3d slice & modeling tools", "author": "Stewart Allen ", "license": "MIT", diff --git a/src/kiri.js b/src/kiri.js index 54f672c3..c72e5da1 100644 --- a/src/kiri.js +++ b/src/kiri.js @@ -6,7 +6,7 @@ if (!self.kiri) { self.kiri = { - beta: 2709, + beta: 2710, driver: {}, // driver modules loader: [] // module loading: array of functions }; diff --git a/src/license.js b/src/license.js index 2cc47962..83a3e0bd 100644 --- a/src/license.js +++ b/src/license.js @@ -3,7 +3,7 @@ let terms = { COPYRIGHT: "Copyright (C) Stewart Allen - All Rights Reserved", LICENSE: "See the license.md file included with the source distribution", - VERSION: "2.7.D9" + VERSION: "2.7.D10" }; if (typeof(module) === 'object') { From b793f9e756bc11f1b9e59f421246910ee3e2408e Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 22 Feb 2021 18:45:58 -0500 Subject: [PATCH 148/255] fix missing $ in string expansion --- src/mode/fdm/export.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mode/fdm/export.js b/src/mode/fdm/export.js index 829b7c70..25f52f9b 100644 --- a/src/mode/fdm/export.js +++ b/src/mode/fdm/export.js @@ -383,7 +383,7 @@ if (nozzleTemp !== lastNozzleTemp) { if (t0) append(`M104 S${nozzleTemp} T0`); if (t1) append(`M104 S${nozzleTemp} T1`); - if (!(t0 || t1)) append(`M104 S{nozzleTemp} T${tool}`); + if (!(t0 || t1)) append(`M104 S${nozzleTemp} T${tool}`); lastNozzleTemp = nozzleTemp; } From 47bcad3c55fd2b36f4f8b6c12c35c1e7d5c18974 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 22 Feb 2021 19:32:54 -0500 Subject: [PATCH 149/255] cleanup generated thin wall polys --- notes.md | 2 +- src/geo/polygon.js | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/notes.md b/notes.md index 41b35fc4..25a8ae2c 100644 --- a/notes.md +++ b/notes.md @@ -2,7 +2,7 @@ ## `C` cosmetic, `F` functional, `P` performance, `B` bug fix -* `B` origin bug (Onshape?) when switching modes in 2.5 and 2.6 +* `B` origin (and bed size) bug (Onshape?) when switching modes in 2.5 and 2.6 * `P` duplicate objects should share same slice data unless rotated or scaled * `P` allow selection to me decimated on demand (context menu?) diff --git a/src/geo/polygon.js b/src/geo/polygon.js index 72f444fd..cf210693 100644 --- a/src/geo/polygon.js +++ b/src/geo/polygon.js @@ -444,6 +444,10 @@ for (let p of poly) { np.push(p); } + np = np.clean(); + if (np.last().distTo2D(np.first()) <= max) { + np.push(np.first()); + } return np; }); }; From c0be2080e800e8a2ab74f99371b3e3bd9f7c90dc Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 22 Feb 2021 19:33:26 -0500 Subject: [PATCH 150/255] bump rev 2.7.D11 --- package.json | 2 +- src/kiri.js | 2 +- src/license.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 1742ea2c..feb155a5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grid-apps", - "version": "2.7.10D", + "version": "2.7.11D", "description": "grid.space 3d slice & modeling tools", "author": "Stewart Allen ", "license": "MIT", diff --git a/src/kiri.js b/src/kiri.js index c72e5da1..968acbf1 100644 --- a/src/kiri.js +++ b/src/kiri.js @@ -6,7 +6,7 @@ if (!self.kiri) { self.kiri = { - beta: 2710, + beta: 2711, driver: {}, // driver modules loader: [] // module loading: array of functions }; diff --git a/src/license.js b/src/license.js index 83a3e0bd..a18edf41 100644 --- a/src/license.js +++ b/src/license.js @@ -3,7 +3,7 @@ let terms = { COPYRIGHT: "Copyright (C) Stewart Allen - All Rights Reserved", LICENSE: "See the license.md file included with the source distribution", - VERSION: "2.7.D10" + VERSION: "2.7.D11" }; if (typeof(module) === 'object') { From 366232bd4df5e3e6c747986ed1dffd7691fc8c37 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 22 Feb 2021 20:57:17 -0500 Subject: [PATCH 151/255] fix var declaration order --- src/kiri/export.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kiri/export.js b/src/kiri/export.js index 7c048c69..67783e97 100644 --- a/src/kiri/export.js +++ b/src/kiri/export.js @@ -123,6 +123,7 @@ SDB['kiri-print-seq'] = printSeq++; let settings = API.conf.get(), + MODE = API.mode.get_id(), names = API.widgets.all() .map(w => w.meta ? w.meta.file : undefined) .filter(v => v) @@ -130,7 +131,6 @@ .map(v => v.substring(0,20)) .map(v => v.split('.')[0]), name = names[0] || (MODE === MODES.CAM ? "cnc" : "print"), - MODE = API.mode.get_id(), pre = `${name}-${(printSeq.toString().padStart(3,"0"))}`, filename = pre,// + (new Date().getTime().toString(36)), fileext = settings.device.gcodeFExt || "gcode", From 11f4a4cdbfb5c6b143ef34e13b2e9bb810e5386a Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 22 Feb 2021 22:37:38 -0500 Subject: [PATCH 152/255] add swizzler when cleaning open polygons to ensure start/end make sense --- src/geo/polygon.js | 35 +++++++++++++++++++++++++++++++---- src/kiri/print.js | 2 +- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/geo/polygon.js b/src/geo/polygon.js index cf210693..006896b4 100644 --- a/src/geo/polygon.js +++ b/src/geo/polygon.js @@ -444,10 +444,10 @@ for (let p of poly) { np.push(p); } - np = np.clean(); if (np.last().distTo2D(np.first()) <= max) { - np.push(np.first()); + np.setClosed(); } + np = np.clean(); return np; }); }; @@ -1403,9 +1403,11 @@ return this; }; - function fromClipperPath(path,z) { + function fromClipperPath(path, z) { let poly = newPolygon(), i = 0, l = path.length; - while (i < l) poly.push(newPoint(null,null,z,null,path[i++])); + while (i < l) { + poly.push(newPoint(null,null,z,null,path[i++])); + } return poly; }; @@ -1425,6 +1427,31 @@ poly.parent = parent || this.parent; poly.area2 = this.area2; poly.open = this.open; + if (this.open) { + // when open, ensure first point on new poly matches old + let start = this.points[0]; + let points = poly.points; + let length = points.length; + let mi, min = Infinity; + for (let i=0; i 0 means first point didn't match + if (mi) { + let nupoints = []; + for (let i=mi; i Date: Mon, 22 Feb 2021 23:20:00 -0500 Subject: [PATCH 153/255] added support for array values in language maps --- src/kiri/lang.js | 7 +- web/kiri/lang/en.js | 324 ++++++++++++++++++++++---------------------- 2 files changed, 168 insertions(+), 163 deletions(-) diff --git a/src/kiri/lang.js b/src/kiri/lang.js index d5fe584c..f82ad861 100644 --- a/src/kiri/lang.js +++ b/src/kiri/lang.js @@ -39,7 +39,12 @@ // update current map from chosen map Object.keys(map).forEach(key => { if (LANG.en[key]) { - LANG.current[key] = map[key]; + let val = map[key]; + // turn arrays into newline separated strings + if (Array.isArray(val)) { + val = val.join('\n'); + } + LANG.current[key] = val; } else { invalid.push(key); } diff --git a/web/kiri/lang/en.js b/web/kiri/lang/en.js index 66ad4513..7b73d9b9 100644 --- a/web/kiri/lang/en.js +++ b/web/kiri/lang/en.js @@ -6,7 +6,7 @@ kiri.lang['en-us'] = { enable: "enable", settings: "settings", - acct_xpo: "make a backup of your device\nand device profiles with the\noption to include workspace\nobjects and positions", + acct_xpo: ["make a backup of your device","and device profiles with the","option to include workspace","objects and positions"], // DEVICE dialog groups dv_gr_dev: "device", @@ -26,9 +26,9 @@ kiri.lang['en-us'] = { dv_bedd_s: "depth", dv_bedd_l: "workspace units", dv_bedh_s: "height", - dv_bedh_l: "max build height\nin workspace units", + dv_bedh_l: ["max build height","in workspace units"], dv_spmx_s: "max spindle", - dv_spmx_l: "max spindle rpm speed\n0 to disable", + dv_spmx_l: ["max spindle rpm speed","0 to disable"], dv_xtab_s: "absolute positioning", dv_xtab_l: "extrusion moves absolute", dv_orgc_s: "origin center", @@ -44,11 +44,11 @@ kiri.lang['en-us'] = { dv_prog_s: "progress", dv_prog_l: "output on each % progress", dv_layr_s: "layer", - dv_layr_l: "output at each\nlayer change", + dv_layr_l: ["output at each","layer change"], dv_tksp_s: "token spacer", - dv_tksp_l: "add a space between\ngcode axis parameters\nG0X0Y0X0\nvs\nG0 X0 Y0 Z0", + dv_tksp_l: ["add a space between","gcode axis parameters","G0X0Y0X0","vs","G0 X0 Y0 Z0"], dv_strc_s: "strip comments", - dv_strc_l: "strip gcode comments\ncomments begin with ;", + dv_strc_l: ["strip gcode comments","comments begin with ;"], dv_fext_s: "file extension", dv_fext_l: "file name extension", dv_dwll_s: "dwell", @@ -129,43 +129,43 @@ kiri.lang['en-us'] = { op_dang_s: "experimental", op_dang_l: "show experimental parameters", op_hopo_s: "hover pop", - op_hopo_l: "enable menu hover\nto activate", + op_hopo_l: ["enable menu hover","to activate"], op_dark_s: "dark mode", op_dark_l: "dark mode interface", op_comp_s: "compact ui", - op_comp_l: "compact user interface\nbetter for small screens\nand tablets", + op_comp_l: ["compact user interface","better for small screens","and tablets"], op_shor_s: "show origin", op_shor_l: "show device or process origin", op_shru_s: "show rulers", - op_shru_l: "show axes rulers\non major gridlines", + op_shru_l: ["show axes rulers","on major gridlines"], op_sped_s: "show speeds", - op_sped_l: "show speed to color bar\nin preview mode", + op_sped_l: ["show speed to color bar","in preview mode"], op_auto_s: "auto layout", - op_auto_l: "automatically layout platform\nwhen new items added", + op_auto_l: ["automatically layout platform","when new items added"], op_free_s: "free layout", - op_free_l: "permit dragable layout\nno effect in laser mode", + op_free_l: ["permit dragable layout","no effect in laser mode"], op_spcr_s: "spacing", - op_spcr_l: "spacing between objects\nduring auto layout\nin workspace units", + op_spcr_l: ["spacing between objects","during auto layout","in workspace units"], op_invr_s: "invert zoom", - op_invr_l: "invert mouse wheel\nscroll zoom", + op_invr_l: ["invert mouse wheel","scroll zoom"], op_save_s: "auto save", - op_save_l: "preserve objects in workspace\nbetween application reloads", + op_save_l: ["preserve objects in workspace","between application reloads"], op_line_s: "line type", - op_line_l: "line style for path rendering\nimpacts 3d performance\npath: 3d best\nflat: 2d good\nline = 1d fast", + op_line_l: ["line style for path rendering","impacts 3d performance","path: 3d best","flat: 2d good","line = 1d fast"], op_unit_s: "units", - op_unit_l: "workspace units affects\nspeeds and distances", + op_unit_l: ["workspace units affects","speeds and distances"], op_anim_s: "animate", - op_anim_l: "animation mesh density\nhigher is more dense\ntakes more memory\nand is slower", + op_anim_l: ["animation mesh density","higher is more dense","takes more memory","and is slower"], lo_menu: "layout", pt_menu: "parts", pt_deci_s: "decimate", - pt_deci_l: "enable or disable point decimation\nduring port import. for faster slicing\nand lower memory usage", + pt_deci_l: ["enable or disable point decimation","during port import. for faster slicing","and lower memory usage"], pt_qual_s: "quality", - pt_qual_l: "level of detail to retain\nduring slicing operations\nlower is faster", + pt_qual_l: ["level of detail to retain","during slicing operations","lower is faster"], pt_heal_s: "heal mesh", - pt_heal_l: "attempt to heal\nnon-manifold meshes\nadds to slicing time", + pt_heal_l: ["attempt to heal","non-manifold meshes","adds to slicing time"], xp_menu: "exports", @@ -177,160 +177,160 @@ kiri.lang['en-us'] = { // FDM SLICING sl_menu: "layers", sl_lahi_s: "height", - sl_lahi_l: "height of each slice\nlayer in millimeters", + sl_lahi_l: ["height of each slice","layer in millimeters"], ad_minl_s: "height min", - ad_minl_l: "adaptive min layer height\nin millimeters\nmust be non-zero", + ad_minl_l: ["adaptive min layer height","in millimeters","must be non-zero"], sl_ltop_s: "top layers", - sl_ltop_l: "number of solid layers\nto enforce at the\ntop of the print", + sl_ltop_l: ["number of solid layers","to enforce at the","top of the print"], sl_lsld_s: "solid layers", - sl_lsld_l: "solid fill areas computed\nfrom layer deltas. see\nlayer pop menu", + sl_lsld_l: ["solid fill areas computed","from layer deltas. see","layer pop menu"], sl_lbot_s: "base layers", - sl_lbot_l: "number of solid layers\nto enforce at the\nbottom of the print", + sl_lbot_l: ["number of solid layers","to enforce at the","bottom of the print"], ad_adap_s: "adaptive", - ad_adap_l: "use adaptive layer heights\nwith 'layer height' as max\nand 'layer min' as the min", + ad_adap_l: ["use adaptive layer heights","with 'layer height' as max","and 'layer min' as the min"], // FDM SHELLS sl_shel_s: "shell count", - sl_shel_l: "number of perimeter\nwalls to generate", + sl_shel_l: ["number of perimeter","walls to generate"], sl_ordr_s: "shell order", - sl_ordr_l: "output shell order\ninside to outside\nor outside to inside\naffects surface quality", + sl_ordr_l: ["output shell order","inside to outside","or outside to inside","affects surface quality"], sl_strt_s: "layer start", - sl_strt_l: "layer starting point\nlast = last layer end\ncenter = part center\norigin = device origin", + sl_strt_l: ["layer starting point","last = last layer end","center = part center","origin = device origin"], ad_thin_s: "thin walls", - ad_thin_l: "detect and fill gaps\nbetween shell walls", + ad_thin_l: ["detect and fill gaps","between shell walls"], // FDM FILL fi_menu: "infill", fi_type: "type", fi_pcnt_s: "fill fraction", - fi_pcnt_l: "fill density values\n0.0 - 1.0", + fi_pcnt_l: ["fill density values","0.0 - 1.0"], fi_angl_s: "solid start", - fi_angl_l: "starting angle in degrees\n90 degrees added to \neach following layer\napplies only to solid layers", + fi_angl_l: ["starting angle in degrees","90 degrees added to ","each following layer","applies only to solid layers"], fi_over_s: "overlap", - fi_over_l: "overlap with shell and other fill\nas fraction of nozzle diameter\n0.0 - 1.0", + fi_over_l: ["overlap with shell and other fill","as fraction of nozzle diameter","0.0 - 1.0"], // fi_rate_s: "print speed", - fi_rate_l: "extrusion speed for infill\nset to 0 to use default\noutput print speeds", + fi_rate_l: ["extrusion speed for infill","set to 0 to use default","output print speeds"], // FDM FIRST LAYER fl_menu: "base", fl_lahi_s: "layer height", - fl_lahi_l: "height of each slice\nin millimeters\nshould be >= slice height", + fl_lahi_l: ["height of each slice","in millimeters","should be >= slice height"], fl_rate_s: "shell speed", - fl_rate_l: "shell printing max speed\nin millimeters / minute", + fl_rate_l: ["shell printing max speed","in millimeters / minute"], fl_frat_s: "fill speed", - fl_frat_l: "fill printing max speed\nin millimeters / minute", + fl_frat_l: ["fill printing max speed","in millimeters / minute"], fl_mult_s: "flow factor", - fl_mult_l: "extrusion multiplier\n0.0 - 2.0", + fl_mult_l: ["extrusion multiplier","0.0 - 2.0"], fl_sfac_s: "width factor", - fl_sfac_l: "multiplier on nozzle size\nchanges line spacing", + fl_sfac_l: ["multiplier on nozzle size","changes line spacing"], fl_skrt_s: "skirt count", - fl_skrt_l: "number of first-layer offset\nbrims to generate", + fl_skrt_l: ["number of first-layer offset","brims to generate"], fl_skro_s: "skirt offset", - fl_skro_l: "skirt offset from part\nin millimeters", + fl_skro_l: ["skirt offset from part","in millimeters"], fl_nozl_s: "nozzle temp", - fl_nozl_l: "degrees in celsius\noutput setting used\nwhen this is zero", + fl_nozl_l: ["degrees in celsius","output setting used","when this is zero"], fl_bedd_s: "bed temp", - fl_bedd_l: "degrees in celsius\noutput setting used\nwhen this is zero", + fl_bedd_l: ["degrees in celsius","output setting used","when this is zero"], fr_spac_s: "raft gap", - fr_spac_l: "additional layer spacing\nbetween 1st layer and raft\nin millimeters", + fr_spac_l: ["additional layer spacing","between 1st layer and raft","in millimeters"], fr_nabl_s: "raft enable", - fr_nabl_l: "create a raft under the\nmodel for better adhesion\nuses skirt offset and\ndisables skirt output", + fr_nabl_l: ["create a raft under the","model for better adhesion","uses skirt offset and","disables skirt output"], // FDM BELT ONLY fl_zoff_s: "belt offset", - fl_zoff_l: "height offset from belt\nof lowest extrusion\nin millimeters", + fl_zoff_l: ["height offset from belt","of lowest extrusion","in millimeters"], fl_brim_s: "brim size", - fl_brim_l: "add brim to part bottom\nsize is width in millimeters\n0 to disable", + fl_brim_l: ["add brim to part bottom","size is width in millimeters","0 to disable"], fl_brmn_s: "brim trigger", - fl_brmn_l: "add brims only when segment\nfacing belt is shorter than this\nvalue in millimeters\n0 = Infinity", + fl_brmn_l: ["add brims only when segment","facing belt is shorter than this","value in millimeters","0 = Infinity"], fl_bled_s: "part anchor", - fl_bled_l: "belt part anchor\nat start of print\nin millimeters", + fl_bled_l: ["belt part anchor","at start of print","in millimeters"], // FDM SUPPORT sp_menu: "support", sp_detect: "detect", sp_dens_s: "density", - sp_dens_l: "fraction 0.0 - 1.0\nrecommended 0.15\n0 to disable", + sp_dens_l: ["fraction 0.0 - 1.0","recommended 0.15","0 to disable"], sp_size_s: "pillar size", - sp_size_l: "pillar width\nin millimeters", + sp_size_l: ["pillar width","in millimeters"], sp_offs_s: "part offset", - sp_offs_l: "offset from part\nin millimeters", + sp_offs_l: ["offset from part","in millimeters"], sp_gaps_s: "gap layers", - sp_gaps_l: "number of layers\noffset from part", + sp_gaps_l: ["number of layers","offset from part"], sp_span_s: "max span", - sp_span_l: "unsupported span that causes\na new support to be generated\nin millimeters", + sp_span_l: ["unsupported span that causes","a new support to be generated","in millimeters"], sp_angl_s: "max angle", - sp_angl_l: "max overhang angle before\nsupporting pillar is generated", + sp_angl_l: ["max overhang angle before","supporting pillar is generated"], sp_area_s: "min area", - sp_area_l: "minimum area for\na support column\nin millimeters", + sp_area_l: ["minimum area for","a support column","in millimeters"], sp_xpnd_s: "expand", - sp_xpnd_l: "expand support area\nbeyond part boundary\nin millimeters", + sp_xpnd_l: ["expand support area","beyond part boundary","in millimeters"], sp_nozl_s: "extruder", - sp_nozl_l: "in multi-extruder systems\nthe extruder to use for\nsupport material", + sp_nozl_l: ["in multi-extruder systems","the extruder to use for","support material"], sp_auto_s: "automatic", - sp_auto_l: "enable generated supports\nusing at-slice-time geometry\nsupports will only appear\nafter slicing completes", + sp_auto_l: ["enable generated supports","using at-slice-time geometry","supports will only appear","after slicing completes"], // LASER SLICING ls_offs_s: "offset", - ls_offs_l: "adjust for beam width\nin millimeters", + ls_offs_l: ["adjust for beam width","in millimeters"], ls_lahi_s: "height", - ls_lahi_l: "layer height\nin millimeters\n0 = auto/detect", + ls_lahi_l: ["layer height","in millimeters","0 = auto/detect"], ls_lahm_s: "min", - ls_lahm_l: "layer height minimum\nwill merge auto slices\nunder this thickness\nin millimeters", + ls_lahm_l: ["layer height minimum","will merge auto slices","under this thickness","in millimeters"], ls_sngl_s: "single", - ls_sngl_l: "perform only one slice\nat specified layer height", + ls_sngl_l: ["perform only one slice","at specified layer height"], // CNC COMMON terms cc_tool: "tool", cc_offs_s: "offset", - cc_offs_l: "offset tool center\nfrom chosen path", + cc_offs_l: ["offset tool center","from chosen path"], cc_spnd_s: "spindle rpm", - cc_spnd_l: "spindle speed in\nrevolutions / minute", + cc_spnd_l: ["spindle speed in","revolutions / minute"], cc_sovr_s: "step over", - cc_sovr_l: "as a fraction of\ntool diameter", + cc_sovr_l: ["as a fraction of","tool diameter"], cc_sdwn_s: "step down", - cc_sdwn_l: "step down depth\nfor each pass\nin workspace units\n0 to disable", + cc_sdwn_l: ["step down depth","for each pass","in workspace units","0 to disable"], cc_feed_s: "feed rate", - cc_feed_l: "max cutting speed in\nworkspace units / minute", + cc_feed_l: ["max cutting speed in","workspace units / minute"], cc_plng_s: "plunge rate", - cc_plng_l: "max z axis speed in\nworkspace units / minute", + cc_plng_l: ["max z axis speed in","workspace units / minute"], // CNC COMMON cc_menu: "limits", cc_flip: "flip", cc_rapd_s: "xy feed", - cc_rapd_l: "max xy moves feedrate\nin workspace units / minute", + cc_rapd_l: ["max xy moves feedrate","in workspace units / minute"], cc_rzpd_s: "z feed", - cc_rzpd_l: "max z moves feedrate\nin workspace units / minute", + cc_rzpd_l: ["max z moves feedrate","in workspace units / minute"], cc_loff_s: "offset", - cc_loff_l: "distance from stock face\nfor leveling pass\nin workspace units", + cc_loff_l: ["distance from stock face","for leveling pass","in workspace units"], // CNC ROUGHING cr_menu: "rough", cr_lsto_s: "leave stock", - cr_lsto_l: "horizontal offset from vertical faces\nstock to leave for finishing pass\nin workspace units", + cr_lsto_l: ["horizontal offset from vertical faces","stock to leave for finishing pass","in workspace units"], cr_ease_s: "ease down", - cr_ease_l: "plunge cuts will\nspiral down or ease\nalong a linear path", + cr_ease_l: ["plunge cuts will","spiral down or ease","along a linear path"], cr_clrt_s: "clear top", - cr_clrt_l: "run a clearing pass over\nthe bounding area of the part\nat z = 0", + cr_clrt_l: ["run a clearing pass over","the bounding area of the part","at z = 0"], cr_clrp_s: "clear voids", - cr_clrp_l: "mill out through pockets\ninstead of just the outline", + cr_clrp_l: ["mill out through pockets","instead of just the outline"], cr_clrf_s: "clear faces", - cr_clrf_l: "interpolate step down to\nclear any detected flat areas", + cr_clrf_l: ["interpolate step down to","clear any detected flat areas"], cr_olin_s: "inside only", - cr_olin_l: "limit cutting to\ninside part boundaries", + cr_olin_l: ["limit cutting to","inside part boundaries"], // CNC OUTLINE co_menu: "outline", co_dogb_s: "dogbones", - co_dogb_l: "insert dogbone cuts\ninto inside corners", + co_dogb_l: ["insert dogbone cuts","into inside corners"], co_wide_s: "wide cutout", - co_wide_l: "widen outside cutout paths\nfor deep cuts in hard material", + co_wide_l: ["widen outside cutout paths","for deep cuts in hard material"], co_olin_s: "inside only", - co_olin_l: "limit cutting to\ninside part boundaries", + co_olin_l: ["limit cutting to","inside part boundaries"], co_olot_s: "outside only", - co_olot_l: "limit cutting to\nexterior part boundaries\nwhich can be thought of\nas the shadow outline", + co_olot_l: ["limit cutting to","exterior part boundaries","which can be thought of","as the shadow outline"], co_omit_s: "omit through", co_omit_l: "eliminate thru holes", co_olen_s: "enable", @@ -339,11 +339,11 @@ kiri.lang['en-us'] = { // CNC CONTOUR cn_menu: "contour", cf_angl_s: "max angle", - cf_angl_l: "angles greater than this\nare considered vertical", + cf_angl_l: ["angles greater than this","are considered vertical"], cf_curv_s: "curves only", - cf_curv_l: "limit linear cleanup\nto curved surfaces", + cf_curv_l: ["limit linear cleanup","to curved surfaces"], cf_olin_s: "inside only", - cf_olin_l: "limit cutting to\ninside part boundaries", + cf_olin_l: ["limit cutting to","inside part boundaries"], cf_linx_s: "enable y pass", cf_linx_l: "linear y-axis finishing", cf_liny_s: "enable x pass", @@ -352,37 +352,37 @@ kiri.lang['en-us'] = { // CNC TRACE cu_menu: "trace", cu_type_s: "type", - cu_type_l: "follow = tool tip follows line\nright or left = tool tip\nfollows line offset by tool radius", + cu_type_l: ["follow = tool tip follows line","right or left = tool tip","follows line offset by tool radius"], // CNC DRILLING cd_menu: "drill", cd_axis: "axis", cd_points: "points", cd_plpr_s: "plunge per", - cd_plpr_l: "max plunge between\ndwell periods\nin workspace units\n0 to disable", + cd_plpr_l: ["max plunge between","dwell periods","in workspace units","0 to disable"], cd_dwll_s: "dwell time", - cd_dwll_l: "dwell time\nbetween plunges in\nin milliseconds", + cd_dwll_l: ["dwell time","between plunges in","in milliseconds"], cd_lift_s: "drill lift", - cd_lift_l: "lift between plunges\nafter dwell period\nin workspace units\n0 to disable", + cd_lift_l: ["lift between plunges","after dwell period","in workspace units","0 to disable"], cd_regi_s: "register", - cd_regi_l: "drill registration holes\nfor double-sided parts\nindependent of enable\ndrilling but uses same\ntool and settings", + cd_regi_l: ["drill registration holes","for double-sided parts","independent of enable","drilling but uses same","tool and settings"], // CNC CUTOUT TABS ct_menu: "tabs", ct_angl_s: "angle", - ct_angl_l: "starting angle for tab spacing\nin degrees (0-360)", + ct_angl_l: ["starting angle for tab spacing","in degrees (0-360)"], ct_numb_s: "count", - ct_numb_l: "number of tabs to use\nwill be spaced evenly\naround the part", + ct_numb_l: ["number of tabs to use","will be spaced evenly","around the part"], ct_wdth_s: "width", ct_wdth_l: "width in workspace units", ct_hght_s: "height", ct_hght_l: "height in workspace units", ct_dpth_s: "depth", - ct_dpth_l: "distance in workspace units\nthat the tab projects from\nthe part surface", + ct_dpth_l: ["distance in workspace units","that the tab projects from","the part surface"], ct_midl_s: "midline", - ct_midl_l: "use midline of tab\ninstead of z bottom\nfor double-sided work", + ct_midl_l: ["use midline of tab","instead of z bottom","for double-sided work"], ct_nabl_s: "auto", - ct_nabl_l: "auto generate radial tabs\nprojected from part center\nusing count and angle offset", + ct_nabl_l: ["auto generate radial tabs","projected from part center","using count and angle offset"], // OUTPUT ou_menu: "output", @@ -390,31 +390,31 @@ kiri.lang['en-us'] = { // LASER KNIFE dk_menu: "knife", dk_dpth_s: "cut depth", - dk_dpth_l: "final cut depth\nin millimeters", + dk_dpth_l: ["final cut depth","in millimeters"], dk_pass_s: "cut passes", - dk_pass_l: "number of passes\ndown to cut depth", + dk_pass_l: ["number of passes","down to cut depth"], dk_offs_s: "tip offset", - dk_offs_l: "distance from blade tip\nto center of tool\nin millimeters", + dk_offs_l: ["distance from blade tip","to center of tool","in millimeters"], // OUTPUT LASER ou_spac_s: "spacing", - ou_spac_l: "distance between layer output\nin millimeters", + ou_spac_l: ["distance between layer output","in millimeters"], ou_scal_s: "scaling", ou_scal_l: "multiplier (0.1 to 100)", ou_powr_s: "power", - ou_powr_l: "0 - 100\nrepresents %", + ou_powr_l: ["0 - 100","represents %"], ou_sped_s: "speed", ou_sped_l: "millimeters / minute", ou_mrgd_s: "merged", - ou_mrgd_l: "merge all layers using\ncolor coding to denote\nstacking depth", + ou_mrgd_l: ["merge all layers using","color coding to denote","stacking depth"], ou_grpd_s: "grouped", - ou_grpd_l: "retain each layer as\na unified grouping\ninstead of separated\npolygons", + ou_grpd_l: ["retain each layer as","a unified grouping","instead of separated","polygons"], ou_layr_s: "layer order", - ou_layr_l: "output layer order\nfrom top right to\nbottom left", + ou_layr_l: ["output layer order","from top right to","bottom left"], ou_layo_s: "layer color", - ou_layo_l: "output layer colors\nfor each z index\noverridden by merged", + ou_layo_l: ["output layer colors","for each z index","overridden by merged"], ou_drkn_s: "drag knife", - ou_drkn_l: "enable drag knife\noutput in gcode\ncut radii are added\nto corners with\ncut down passes", + ou_drkn_l: ["enable drag knife","output in gcode","cut radii are added","to corners with","cut down passes"], // OUTPUT FDM ou_nozl_s: "nozzle temp", @@ -422,54 +422,54 @@ kiri.lang['en-us'] = { ou_bedd_s: "bed temp", ou_bedd_l: "degrees in celsius", ou_feed_s: "print speed", - ou_feed_l: "max print speed\nmillimeters / minute", + ou_feed_l: ["max print speed","millimeters / minute"], ou_fini_s: "finish speed", - ou_fini_l: "outermost shell speed\nmillimeters / minute", + ou_fini_l: ["outermost shell speed","millimeters / minute"], ou_move_s: "move speed", - ou_move_l: "non-print move speed\nmillimeters / minute\n0 = enable G0 moves", + ou_move_l: ["non-print move speed","millimeters / minute","0 = enable G0 moves"], ou_shml_s: "shell factor", ou_flml_s: "solid factor", ou_spml_s: "infill factor", - ou_exml_l: "extrusion multiplier\n0.0 - 2.0", + ou_exml_l: ["extrusion multiplier","0.0 - 2.0"], ou_fans_s: "fan speed", ou_fans_l: "0 - 255", // OUTPUT CAM ou_toll_s: "tolerance", - ou_toll_l: "surface precision\nin workspace units\nlower is slower and\nuses more memory\n0 = automatic based\non animate preference", + ou_toll_l: ["surface precision","in workspace units","lower is slower and","uses more memory","0 = automatic based","on animate preference"], ou_zanc_s: "z anchor", - ou_zanc_l: "controls the position of the part\nwhen stock Z exceeds part Z", + ou_zanc_l: ["controls the position of the part","when stock Z exceeds part Z"], ou_ztof_s: "z offset", - ou_ztof_l: "offset z anchor\nin workspace units\nhas no effect when\nanchor is middle", + ou_ztof_l: ["offset z anchor","in workspace units","has no effect when","anchor is middle"], ou_zbot_s: "z bottom", - ou_zbot_l: "offset from part bottom\nto limit cutting depth\nin workspace units", + ou_zbot_l: ["offset from part bottom","to limit cutting depth","in workspace units"], ou_zclr_s: "z clearance", - ou_zclr_l: "safe travel offset\nfrom top of part\nin workspace units", + ou_zclr_l: ["safe travel offset","from top of part","in workspace units"], ou_ztru_s: "z thru", - ou_ztru_l: "extend cutout pass down\nin workspace units", + ou_ztru_l: ["extend cutout pass down","in workspace units"], ou_conv_s: "conventional", - ou_conv_l: "milling direction\nuncheck for 'climb'", + ou_conv_l: ["milling direction","uncheck for 'climb'"], ou_depf_s: "depth first", - ou_depf_l: "optimize pocket cuts\nwith depth priority", + ou_depf_l: ["optimize pocket cuts","with depth priority"], // CAM STOCK cs_menu: "stock", cs_wdth_s: "width", - cs_wdth_l: "width (x) in workspace units\n0 defaults to part size", + cs_wdth_l: ["width (x) in workspace units","0 defaults to part size"], cs_dpth_s: "depth", - cs_dpth_l: "depth (y) in workspace units\n0 defaults to part size", + cs_dpth_l: ["depth (y) in workspace units","0 defaults to part size"], cs_hght_s: "height", - cs_hght_l: "height (z) in workspace units\n0 defaults to part size", + cs_hght_l: ["height (z) in workspace units","0 defaults to part size"], cs_offs_s: "offset", - cs_offs_l: "use width, depth, height\nas offsets from max\npart size on platform", + cs_offs_l: ["use width, depth, height","as offsets from max","part size on platform"], cs_clip_s: "clip to", - cs_clip_l: "rough and outline\nclip cutting paths\nto defined stock", + cs_clip_l: ["rough and outline","clip cutting paths","to defined stock"], cs_offe_s: "enable", cs_offe_l: "enable milling stock", // ORIGIN (CAM & LASER) or_bnds_s: "origin bounds", - or_bnds_l: "origin is relative to\nboundary of all objects", + or_bnds_l: ["origin is relative to","boundary of all objects"], or_cntr_s: "origin center", or_cntr_l: "origin is referenced from the center", or_topp_s: "origin top", @@ -478,98 +478,98 @@ kiri.lang['en-us'] = { // FDM ADVANCED ad_menu: "expert", ad_rdst_s: "retract dist", - ad_rdst_l: "amount to retract filament\nfor long moves. in millimeters", + ad_rdst_l: ["amount to retract filament","for long moves. in millimeters"], ad_rrat_s: "retract rate", - ad_rrat_l: "speed of filament\nretraction in mm/s", + ad_rrat_l: ["speed of filament","retraction in mm/s"], ad_rdwl_s: "engage dwell", ad_wpln_s: "retract wipe", - ad_wpln_l: "non-printing move\nafter retraction\nin millimeters", - ad_rdwl_l: "time between re-engaging\nfilament and movement\nin milliseconds", + ad_wpln_l: ["non-printing move","after retraction","in millimeters"], + ad_rdwl_l: ["time between re-engaging","filament and movement","in milliseconds"], ad_scst_s: "shell coast", - ad_scst_l: "non-printing end\nof perimeter shells\nin millimeters", + ad_scst_l: ["non-printing end","of perimeter shells","in millimeters"], ad_msol_s: "min solid", - ad_msol_l: "minimum area (mm^2)\nrequired to keep solid\nmust be > 0.1", + ad_msol_l: ["minimum area (mm^2)","required to keep solid","must be > 0.1"], ad_mins_s: "min speed", - ad_mins_l: "minimum speed\nfor short segments", + ad_mins_l: ["minimum speed","for short segments"], ad_spol_s: "short path", - ad_spol_l: "polygons shorter than this\nwill have their print speed\nscaled down to min speed\nin millimeters", + ad_spol_l: ["polygons shorter than this","will have their print speed","scaled down to min speed","in millimeters"], ad_arct_s: "arc tolerance", - ad_arct_l: "convert faceted lines to arcs\ncenter point drift tolerance\nwhen matching arc points\nconsider values around 0.15\nin millimeters\n0 to disable", + ad_arct_l: ["convert faceted lines to arcs","center point drift tolerance","when matching arc points","consider values around 0.15","in millimeters","0 to disable"], ad_zhop_s: "z hop dist", - ad_zhop_l: "amount to raise z\non retraction moves\nin millimeters\n0 to disable", + ad_zhop_l: ["amount to raise z","on retraction moves","in millimeters","0 to disable"], ad_abkl_s: "anti-backlash", - ad_abkl_l: "for better flat surface finish\nuse micro-movements to cancel\nbacklash in solid layer output\nin millimeters\n0 to disable\nif your firmware has M425\nput that in the gcode header\nand leave this as 0", + ad_abkl_l: ["for better flat surface finish","use micro-movements to cancel","backlash in solid layer output","in millimeters","0 to disable","if your firmware has M425","put that in the gcode header","and leave this as 0"], ad_lret_s: "layer retract", - ad_lret_l: "force filament retraction\nbetween layers", + ad_lret_l: ["force filament retraction","between layers"], ad_play_s: "polish layers", - ad_play_l: "polish up to specified\n# of layers at a time", + ad_play_l: ["polish up to specified","# of layers at a time"], ad_pspd_s: "polish speed", - ad_pspd_l: "polishing speed\nin millimeters / minute", + ad_pspd_l: ["polishing speed","in millimeters / minute"], // CAM EXPERT cx_fast_s: "skip shadow", - cx_fast_l: "disable overhang detection\ncan be faster and use less\nmemory with complex models\nbut fails with overhangs\ntry enabling if slicing\nhangs during shadowing", + cx_fast_l: ["disable overhang detection","can be faster and use less","memory with complex models","but fails with overhangs","try enabling if slicing","hangs during shadowing"], // FDM GCODE ag_menu: "gcode", ag_nozl_s: "nozzle", ag_nozl_l: "select output nozzle or head", ag_paws_s: "pause layers", - ag_paws_l: "comma-separated list of layers\nto inject pause commands before", + ag_paws_l: ["comma-separated list of layers","to inject pause commands before"], ag_loop_s: "loop layers", - ag_loop_l: "layer ranges to repeat in the format\nfirst-last-count,first-last-count,...\nomitted count = 1", + ag_loop_l: ["layer ranges to repeat in the format","first-last-count,first-last-count,...","omitted count = 1"], // SLA MENU sa_menu: "slicing", sa_lahe_s: "layer height", - sa_lahe_l: "layer height\nin millimeters", + sa_lahe_l: ["layer height","in millimeters"], sa_shel_s: "hollow shell", - sa_shel_l: "shell thickness in mm\nuse multiple of layer height\nuse 0 for solid (disabled)", + sa_shel_l: ["shell thickness in mm","use multiple of layer height","use 0 for solid (disabled)"], sa_otop_s: "open top", - sa_otop_l: "if shell is enabled\nresults in an open top", + sa_otop_l: ["if shell is enabled","results in an open top"], sa_obas_s: "open base", - sa_obas_l: "if shell is enabled\nresults in an open base\ndisabled with supports", + sa_obas_l: ["if shell is enabled","results in an open base","disabled with supports"], sa_layr_m: "layers", sa_lton_s: "light on time", - sa_lton_l: "layer light on\ntime in seconds", + sa_lton_l: ["layer light on","time in seconds"], sa_ltof_s: "light off time", - sa_ltof_l: "layer light off\ntime in seconds", + sa_ltof_l: ["layer light off","time in seconds"], sa_pldi_s: "peel distance", - sa_pldi_l: "peel distance\nin millimeters", + sa_pldi_l: ["peel distance","in millimeters"], sa_pllr_s: "peel lift rate", - sa_pllr_l: "peel lift speed\nin mm/sec", + sa_pllr_l: ["peel lift speed","in mm/sec"], sa_pldr_s: "peel drop rate", - sa_pldr_l: "peel drop speed\nin mm/sec", + sa_pldr_l: ["peel drop speed","in mm/sec"], sa_base_m: "base", sa_balc_s: "layer count", - sa_balc_l: "number of\nbase layers", - sa_bltn_l: "base layer light on\ntime in seconds", - sa_bltf_l: "base layer light off\ntime in seconds", + sa_balc_l: ["number of","base layers"], + sa_bltn_l: ["base layer light on","time in seconds"], + sa_bltf_l: ["base layer light off","time in seconds"], sa_infl_m: "infill", sa_ifdn_s: "density", - sa_ifdn_l: "percent infill\nrequires shell\n0 = disabled\nvalid 0.0 - 1.0", + sa_ifdn_l: ["percent infill","requires shell","0 = disabled","valid 0.0 - 1.0"], sa_iflw_s: "line width", - sa_iflw_l: "hatch line width\nin millimeters", + sa_iflw_l: ["hatch line width","in millimeters"], sa_supp_m: "support", sa_slyr_s: "base layers", - sa_slyr_l: "base support layers\nvalue range 0-10", + sa_slyr_l: ["base support layers","value range 0-10"], sa_slgp_s: "gap layers", - sa_slgp_l: "number of layers between\nraft and bottom of object", + sa_slgp_l: ["number of layers between","raft and bottom of object"], sa_sldn_s: "density", - sa_sldn_l: "used to compute the\nnumber of support pillars\n0.0-1.0 (0 = disable)", + sa_sldn_l: ["used to compute the","number of support pillars","0.0-1.0 (0 = disable)"], sa_slsz_s: "size", - sa_slsz_l: "max size of a\nsupport pillar\nin millimeters", + sa_slsz_l: ["max size of a","support pillar","in millimeters"], sa_slpt_s: "points", - sa_slpt_l: "number of points in\neach support pillar\nin millimeters", + sa_slpt_l: ["number of points in","each support pillar","in millimeters"], sl_slen_l: "enable supports", sa_outp_m: "output", sa_opzo_s: "z offset", - sa_opzo_l: "z layer offset\nalmost always 0.0\n0.0-1.0 in millimeters", + sa_opzo_l: ["z layer offset","almost always 0.0","0.0-1.0 in millimeters"], sa_opaa_s: "anti alias", - sa_opaa_l: "enable anti-aliasing\nproduces larger files\ncan blur details" + sa_opaa_l: ["enable anti-aliasing","produces larger files","can blur details"] }; From 7cf18ef9cebc256626c9f558b1051c07c1763866 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Tue, 23 Feb 2021 00:08:45 -0500 Subject: [PATCH 154/255] add localization for left menu and dialogs --- src/kiri/init.js | 11 ++++ web/kiri/index.html | 122 ++++++++++++++++++++++---------------------- web/kiri/lang/en.js | 65 ++++++++++++++++++++++- 3 files changed, 136 insertions(+), 62 deletions(-) diff --git a/src/kiri/init.js b/src/kiri/init.js index 2a0cdaec..21295154 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -2535,6 +2535,17 @@ // by any future script loads (above) KIRI.lang.set(); + // update static html elements with language overrides + for (let el of [...DOC.querySelectorAll("[lk]")]) { + let key = el.getAttribute('lk'); + let val = LANG[key]; + if (val) { + el.innerText = val; + } else { + console.log({missing_ln: key}); + } + } + // schedule init_one to run after all page content is loaded // unless a languge script is loading first, in which case it // will call init once it's done (or failed) diff --git a/web/kiri/index.html b/web/kiri/index.html index fddfea3d..0c144829 100644 --- a/web/kiri/index.html +++ b/web/kiri/index.html @@ -45,17 +45,17 @@
    - +
    english
    danish
    - +
    - +
    @@ -74,56 +74,56 @@
    - +
    - +
    -
    -
    - +
    - +
    -
    - +
    - +
    - +
    - +
    - +
    @@ -133,43 +133,43 @@
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    @@ -196,12 +196,12 @@
    -
    reset
    +
    reset
    - +
    @@ -222,9 +222,9 @@
    -
    -
    -
    +
    +
    +
    @@ -249,7 +249,7 @@
    - +
    @@ -260,7 +260,7 @@
    - +
    - +
    @@ -296,27 +296,27 @@
    - +
    - +
    - +
    - +
    - +
    @@ -324,23 +324,23 @@
    -
    -
    +
    +
    -
    -
    -
    shaft
    +
    +
    +
    shaft
    -
    flute
    +
    flute
    -
    taper
    +
    taper
    @@ -351,13 +351,13 @@
    - - + +
    - Application Preferences + Application Preferences
    @@ -440,14 +440,14 @@
    - - + +
    - - - + + +
    - +
    diff --git a/web/kiri/lang/en.js b/web/kiri/lang/en.js index 7b73d9b9..632b8a26 100644 --- a/web/kiri/lang/en.js +++ b/web/kiri/lang/en.js @@ -2,12 +2,75 @@ // map for any missing key/value pairs kiri.lang['en'] = kiri.lang['en-us'] = { - version: "version", + // common keys and menus + animate: "animate", // CAM animate button + arrange: "arrange", // layout workspace objects + axis: "axis", // left object scale pop menu + clear: "clear", // clear workspace (remove all objects) + copy: "copy", + delete: "delete", + detail: "detail", + done: "done", enable: "enable", + export: "export", + files: "files", + help: "help", + ghost: "ghost", // left render pop menu (wireframe) + hide: "hide", // left render pop menu (invisible) + home: "home", + import: "import", + language: "language", + machine: "machine", // device or machine + metric: "metric", + name: "name", + prefs: "prefs", // left menu "preferences" + preview: "preview", + recent: "recent", + render: "render", // left render pop menu + reset: "reset", + rotate: "rotate", // left rotate pop menu + save: "save", + scale: "scale", // left object scale pop menu + setup: "setup", settings: "settings", + size: "size", + solid: "solid", // view type pop menu + tool: "tool", + tools: "tools", // CAM tool menu button + top: "top", + type: "type", // CAM tool type + version: "version", + view: "view", // left view pop menu + wire: "wire", // left render pop menu acct_xpo: ["make a backup of your device","and device profiles with the","option to include workspace","objects and positions"], + // RIGHT-CLICK CONTEXT MENU + rc_clws: "clear workspace", + rc_xpws: "export workspace", + rc_lafl: "lay flat", + rc_mirr: "mirror", + rc_dupl: "duplicate", + rc_xstl: "export as STL", + + // DEVICE MENU and related dialogs + dm_sldt: "select a device type", + dm_stdd: "standard devices", + dm_mydd: "my devices", + dm_seld: "selected device", + dm_rcnt: "recent files", + dm_savs: "saved settings", + dm_appp: "Application Preferences", + + // CAM Tool Dialog + td_tyem: "end", // end mill + td_tybm: "ball", // ball mill + td_tytm: "taper", // taper mill + td_tonm: "tool #", + td_shft: "shaft", // endmill shaft specs + td_flut: "flute", // endmill flute specs + td_tapr: "taper", // endmill taper specs + // DEVICE dialog groups dv_gr_dev: "device", dv_gr_ext: "extruder", From 3a7922d1d3c9e06aaac4cb4d543977672ad56feb Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Tue, 23 Feb 2021 01:10:57 -0500 Subject: [PATCH 155/255] add option to select single lines instead of polylines for traces --- src/kiri/conf.js | 1 + src/mode/cam/client.js | 6 ++++-- src/mode/cam/driver.js | 8 ++++---- src/mode/cam/slice.js | 13 ++++++++++--- web/kiri/lang/en.js | 2 ++ 5 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/kiri/conf.js b/src/kiri/conf.js index 6499fb5a..31223651 100644 --- a/src/kiri/conf.js +++ b/src/kiri/conf.js @@ -465,6 +465,7 @@ camTraceDown: 0, camTraceSpeed: 250, camTracePlunge: 200, + camTraceLines: false, camDrillTool: 1000, camDrillSpindle: 1000, camDrillDownSpeed: 250, diff --git a/src/mode/cam/client.js b/src/mode/cam/client.js index 84e24f68..f7f6b10e 100644 --- a/src/mode/cam/client.js +++ b/src/mode/cam/client.js @@ -578,7 +578,7 @@ } }); }); - }); + }, poppedRec.single); api.feature.hover = true; api.feature.hoverAdds = true; func.hover = func.traceHover; @@ -867,7 +867,8 @@ step: 'camTraceOver', down: 'camTraceDown', rate: 'camTraceSpeed', - plunge: 'camTracePlunge' + plunge: 'camTracePlunge', + single: 'camTraceLines', }).inputs = { tool: UC.newSelect(LANG.cc_tool, {}, "tools"), sep: UC.newBlank({class:"pop-sep"}), @@ -879,6 +880,7 @@ rate: UC.newInput(LANG.cc_feed_s, {title:LANG.cc_feed_l, convert:UC.toInt, units:true}), plunge: UC.newInput(LANG.cc_plng_s, {title:LANG.cc_plng_l, convert:UC.toInt, units:true}), sep: UC.newBlank({class:"pop-sep"}), + single: UC.newBoolean(LANG.cc_sngl_s, undefined, {title:LANG.cc_sngl_l}), select: UC.newRow([ UC.newButton(undefined, func.traceAdd, {icon:''}), UC.newButton(undefined, func.traceDone, {icon:''}), diff --git a/src/mode/cam/driver.js b/src/mode/cam/driver.js index 27560cbe..6629f311 100644 --- a/src/mode/cam/driver.js +++ b/src/mode/cam/driver.js @@ -25,11 +25,11 @@ KIRI.loader.push(function(API) { if (KIRI.client) - CAM.traces = function(ondone) { + CAM.traces = function(ondone, single) { KIRI.client.sync(); let settings = API.conf.get(); let widgets = API.widgets.map(); - KIRI.client.send("cam_traces", { settings }, output => { + KIRI.client.send("cam_traces", { settings, single }, output => { let ids = []; KIRI.codec.decode(output).forEach(rec => { ids.push(rec.id); @@ -41,9 +41,9 @@ if (KIRI.worker) KIRI.worker.cam_traces = function(data, send) { - const { settings } = data; + const { settings, single } = data; const widgets = Object.values(wcache); - const fresh = widgets.filter(widget => CAM.traces(settings, widget)); + const fresh = widgets.filter(widget => CAM.traces(settings, widget, single)); send.done(KIRI.codec.encode(fresh.map(widget => { return { id: widget.id, traces: widget.traces, diff --git a/src/mode/cam/slice.js b/src/mode/cam/slice.js index 25e1ee25..4a8600db 100644 --- a/src/mode/cam/slice.js +++ b/src/mode/cam/slice.js @@ -221,8 +221,8 @@ } }; - CAM.traces = function(settings, widget) { - if (widget.traces) { + CAM.traces = function(settings, widget, single) { + if (widget.traces && widget.trace_single === single) { // do no work if cached return false; } @@ -257,7 +257,13 @@ return; } } - traces.push(poly); + if (single) { + poly.forEachSegment((p1, p2) => { + traces.push(newPolygon().append(p1).append(p2).setOpen()); + }, poly.open); + } else { + traces.push(poly); + } }); }; let opts = { each: oneach, over: false, flatoff: 0, edges: true, openok: true }; @@ -265,6 +271,7 @@ opts.over = true; slicer.slice(indices, opts); widget.traces = traces; + widget.trace_single = single; return true; }; diff --git a/web/kiri/lang/en.js b/web/kiri/lang/en.js index 632b8a26..68714f46 100644 --- a/web/kiri/lang/en.js +++ b/web/kiri/lang/en.js @@ -357,6 +357,8 @@ kiri.lang['en-us'] = { cc_feed_l: ["max cutting speed in","workspace units / minute"], cc_plng_s: "plunge rate", cc_plng_l: ["max z axis speed in","workspace units / minute"], + cc_sngl_s: "select lines only", + cc_sngl_l: ["select only single edges","instead of connected polylines"], // CNC COMMON cc_menu: "limits", From ff7181f55fa9ce51c4ec9f251bdf67d73676b258 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Tue, 23 Feb 2021 10:08:04 -0500 Subject: [PATCH 156/255] add jpg image loading --- src/kiri/main.js | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/kiri/main.js b/src/kiri/main.js index 7c5cb05d..dd9419c4 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -2344,6 +2344,7 @@ isstl = lower.indexOf(".stl") > 0, issvg = lower.indexOf(".svg") > 0, ispng = lower.indexOf(".png") > 0, + isjpg = lower.indexOf(".jpg") > 0, isgcode = lower.indexOf(".gcode") > 0 || lower.indexOf(".nc") > 0, isset = lower.indexOf(".b64") > 0 || lower.indexOf(".km") > 0; reader.file = files[i]; @@ -2368,9 +2369,10 @@ if (issvg) loadCode(e.target.result, 'svg'); if (isset) settingsImport(e.target.result, true); if (ispng) loadImageDialog(e.target.result, e.target.file.name); + if (isjpg) loadImageConvert(e.target.result, e.target.file.name); if (--loaded === 0) platform.group_done(isgcode); }; - if (isstl || ispng) { + if (isstl || ispng || isjpg) { reader.readAsArrayBuffer(reader.file); } else { reader.readAsBinaryString(reader.file); @@ -2378,6 +2380,25 @@ } } + function loadImageConvert(res, name) { + let url = URL.createObjectURL(new Blob([res])); + + $('mod-any').innerHTML = ``; + + let img = $('xsrc'); + let can = $('xdst'); + + img.onload = () => { + can.width = img.width; + can.height = img.height; + let ctx = can.getContext('2d'); + ctx.drawImage(img, 0, 0); + fetch(can.toDataURL()).then(r => r.arrayBuffer()).then(data => { + loadImageDialog(data, name); + }); + }; + } + function loadFile() { $('load-file').onchange = function(event) { DBUG.log(event); From 6a429d9598ce19dcedfaaec3f10624076aa98633 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Tue, 23 Feb 2021 16:40:49 -0500 Subject: [PATCH 157/255] limit omitthru to outside only. catch and report step down of 0 or less --- src/mode/cam/ops.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/mode/cam/ops.js b/src/mode/cam/ops.js index 69434c45..f43667d7 100644 --- a/src/mode/cam/ops.js +++ b/src/mode/cam/ops.js @@ -109,6 +109,10 @@ let { tshadow, shadowTop, ztOff, zBottom, zMax } = state; let { process, stock } = settings; + if (op.down <= 0) { + throw `invalid step down "${op.down}"`; + } + let roughIn = op.inside; let roughTop = op.top; let roughDown = op.down; @@ -390,6 +394,10 @@ let { updateToolDiams, zThru, zBottom, shadowTop, tabs, cutTabs, cutPolys } = state; let { process, stock } = settings; + if (op.down <= 0) { + throw `invalid step down "${op.down}"`; + } + let toolDiam = this.toolDiam = new CAM.Tool(settings, op.tool).fluteDiameter(); updateToolDiams(toolDiam); @@ -453,7 +461,7 @@ tops = tshadow; } - if (op.omitthru) { + if (op.outside && op.omitthru) { // eliminate thru holes from shadow for (let hole of thruHoles) { for (let top of tops) { From f4b8a8b5d296dd763d128aa38b9b3a235f2b469c Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Tue, 23 Feb 2021 21:18:10 -0500 Subject: [PATCH 158/255] bump rev 2.7.D12 --- package.json | 2 +- src/kiri.js | 2 +- src/license.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index feb155a5..b0960d4e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grid-apps", - "version": "2.7.11D", + "version": "2.7.12D", "description": "grid.space 3d slice & modeling tools", "author": "Stewart Allen ", "license": "MIT", diff --git a/src/kiri.js b/src/kiri.js index 968acbf1..dd11b4ce 100644 --- a/src/kiri.js +++ b/src/kiri.js @@ -6,7 +6,7 @@ if (!self.kiri) { self.kiri = { - beta: 2711, + beta: 2712, driver: {}, // driver modules loader: [] // module loading: array of functions }; diff --git a/src/license.js b/src/license.js index a18edf41..550b0e42 100644 --- a/src/license.js +++ b/src/license.js @@ -3,7 +3,7 @@ let terms = { COPYRIGHT: "Copyright (C) Stewart Allen - All Rights Reserved", LICENSE: "See the license.md file included with the source distribution", - VERSION: "2.7.D11" + VERSION: "2.7.D12" }; if (typeof(module) === 'object') { From 3d993e99d03891e4fcd1b7b9d31c285fe05c0897 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Wed, 24 Feb 2021 04:22:10 -0500 Subject: [PATCH 159/255] fixes #109 Uncaught TypeError --- src/mode/fdm/prepare.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index be1c7c07..8db5507c 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -68,7 +68,7 @@ offset = process.outputBrimOffset || (process.outputRaft ? 4 : 0); // compute first brim - widgets.forEach(function(widget) { + widgets.filter(w => w.slices.length).forEach(function(widget) { let tops = []; // collect top outer polygons widget.slices[0].tops.forEach(function(top) { From 5bb6e6e905b2b911d3cfd76f9a04527131590aa9 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Wed, 24 Feb 2021 10:40:00 -0500 Subject: [PATCH 160/255] disable purge blocks in belt mode --- src/mode/fdm/prepare.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index 8db5507c..32db121e 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -267,7 +267,7 @@ // generate purge block for given nozzle function purge(nozzle, track, layer, start, z, using) { - if (extcount < 2) { + if (extcount < 2 || isBelt) { return start; } let rec = track[nozzle]; From 18fded64dbb899cb7d4ee8fd07e6d7e38999e16e Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Wed, 24 Feb 2021 11:09:02 -0500 Subject: [PATCH 161/255] clean up work cancellation --- src/kiri/client.js | 31 ++++++++++++++++++++----------- src/kiri/init.js | 3 ++- src/kiri/main.js | 4 +++- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/kiri/client.js b/src/kiri/client.js index 116f7143..27ed2c91 100644 --- a/src/kiri/client.js +++ b/src/kiri/client.js @@ -14,8 +14,8 @@ let KIRI = self.kiri = self.kiri || {}, seqid = 1, syncd = {}, running = {}, - slicing = {}, - worker = null + worker = null, + restarting = false // occ = new Worker("/kiri/ext/occ-worker.js", {type:"module"}), ; @@ -57,25 +57,34 @@ KIRI.work = { } }, - isSlicing: function() { + isBusy: function() { let current = 0; - for (let key in slicing) { - current++; + for (let rec of Object.values(running)) { + if (rec.fn) current++; } return current > 0; }, restart: function() { + // prevent re-entry from cancel callback + if (restarting) { + return; + } + if (worker) { worker.terminate(); } - // for (let key in slicing) { - // slicing[key]({error: "cancelled slicing"}); - // } + restarting = true; + + for (let key in running) { + let rec = running[key]; + if (rec.fn) { + rec.fn({error: "cancelled operation"}); + } + } syncd = {}; - slicing = {}; running = {}; worker = KIRI.work.newWorker(); @@ -95,6 +104,8 @@ KIRI.work = { onreply(reply.data, reply); }; + + restarting = false; }, decimate: function(vertices, options, callback) { @@ -169,14 +180,12 @@ KIRI.work = { }, slice: function(settings, widget, callback) { - slicing[widget.id] = callback; send("slice", { id: widget.id, settings: settings }, function(reply) { callback(reply); if (reply.done || reply.error) { - delete slicing[widget.id]; // in belt mode, slicing modifies a widget and requires re-sync if (settings.device.bedBelt) { widget.modified = true; diff --git a/src/kiri/init.js b/src/kiri/init.js index 21295154..15b4d105 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -242,7 +242,8 @@ // hide all dialogs API.dialog.hide(); // cancel slicing - if (KIRI.work.isSlicing()) KIRI.work.restart(); + API.function.cancel(); + // if (KIRI.work.isSlicing()) KIRI.work.restart(); // kill any poppers in compact mode UC.hidePoppers(); // and send an event (used by FDM client) diff --git a/src/kiri/main.js b/src/kiri/main.js index dd9419c4..291a2666 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -918,7 +918,9 @@ } function cancelWorker() { - if (KIRI.work.isSlicing()) KIRI.work.restart(); + if (KIRI.work.isBusy()) { + KIRI.work.restart(); + } } function showSlider() { From c628383a109dedcbf6dec59ecfdf7d1b50f77c29 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Wed, 24 Feb 2021 12:28:17 -0500 Subject: [PATCH 162/255] prevent drop actions when a dialog is open. fixes #107 --- src/kiri/init.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/kiri/init.js b/src/kiri/init.js index 21295154..34867da5 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -1270,6 +1270,12 @@ function dragOverHandler(evt) { evt.stopPropagation(); evt.preventDefault(); + + // prevent drop actions when a dialog is open + if (API.modal.visible()) { + return; + } + evt.dataTransfer.dropEffect = 'copy'; let oldcolor = SPACE.platform.setColor(0x00ff00); if (oldcolor !== 0x00ff00) platformColor = oldcolor; @@ -1283,6 +1289,11 @@ evt.stopPropagation(); evt.preventDefault(); + // prevent drop actions when a dialog is open + if (API.modal.visible()) { + return; + } + SPACE.platform.setColor(platformColor); let files = evt.dataTransfer.files; From 90c5db97eb204f0ddefc69ebed412c7068c89889 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Wed, 24 Feb 2021 15:19:26 -0500 Subject: [PATCH 163/255] experimental extension of ease-down --- src/mode/cam/ops.js | 18 +++++++++++++----- src/mode/cam/prepare.js | 20 ++++++++++++++++---- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/mode/cam/ops.js b/src/mode/cam/ops.js index f43667d7..4d0e0ce3 100644 --- a/src/mode/cam/ops.js +++ b/src/mode/cam/ops.js @@ -311,8 +311,10 @@ let { polyEmit, poly2polyEmit, depthRoughPath } = ops; let { camOut, newLayer, printPoint } = ops; let { settings, widget } = state; - let { process } = settings; + let { process, controller } = settings; + let danger = controller.danger; + let easeDown = process.camEaseDown; let cutdir = process.camConventional; let depthFirst = process.camDepthFirst; let depthData = []; @@ -372,7 +374,9 @@ // return POLY.nest(level.filter(poly => poly.depth === 0)); return POLY.nest(level.filter(poly => poly.depth === 0).clone()); }); - printPoint = depthRoughPath(printPoint, 0, depthData, tops, polyEmit); + // experimental start of ease down + let ease = danger && op.down && easeDown ? op.down : 0; + printPoint = depthRoughPath(printPoint, 0, depthData, tops, polyEmit, false, ease); // printPoint = depthRoughPath(printPoint, 0, depthData, tops, (poly, index, count, start) => { // console.log({z: poly.getZ(), i: poly.id, index, poly}); // return polyEmit(poly, index, count, start); @@ -542,8 +546,10 @@ let { polyEmit, poly2polyEmit, depthOutlinePath } = ops; let { camOut, newLayer, printPoint } = ops; let { settings, widget } = state; - let { process } = settings; + let { process, controller } = settings; + let danger = controller.danger; + let easeDown = process.camEaseDown; let toolDiam = this.toolDiam; let cutdir = process.camConventional; let depthFirst = process.camDepthFirst; @@ -592,8 +598,10 @@ printPoint = flatLevels[0] .sort((a,b) => { return a.area() - b.area() })[0] .average(); - printPoint = depthOutlinePath(printPoint, 0, flatLevels, toolDiam, polyEmit, false); - printPoint = depthOutlinePath(printPoint, 0, flatLevels, toolDiam, polyEmit, true); + // experimental start of ease down + let ease = danger && op.down && easeDown ? op.down : 0; + printPoint = depthOutlinePath(printPoint, 0, flatLevels, toolDiam, polyEmit, false, ease); + printPoint = depthOutlinePath(printPoint, 0, flatLevels, toolDiam, polyEmit, true, ease); } } diff --git a/src/mode/cam/prepare.js b/src/mode/cam/prepare.js index b4fc4b3a..a5ebc0f3 100644 --- a/src/mode/cam/prepare.js +++ b/src/mode/cam/prepare.js @@ -414,7 +414,7 @@ return last; } - function depthRoughPath(start, depth, levels, tops, emitter, fit) { + function depthRoughPath(start, depth, levels, tops, emitter, fit, ease) { let level = levels[depth]; if (!level) { return start; @@ -424,13 +424,19 @@ fitted.filter(top => !top.level_emit).forEach(top => { top.level_emit = true; let inside = level.filter(poly => poly.isInside(top)); + if (ease) { + start.z += ease; + } start = poly2polyEmit(inside, start, emitter, { mark: "emark", perm: true }); - start = depthRoughPath(start, depth + 1, levels, tops, emitter, top); + if (ease) { + start.z += ease; + } + start = depthRoughPath(start, depth + 1, levels, tops, emitter, top, ease); }); return start; } - function depthOutlinePath(start, depth, levels, radius, emitter, clr) { + function depthOutlinePath(start, depth, levels, radius, emitter, clr, ease) { let bottm = depth < levels.length - 1 ? levels[levels.length - 1] : null; let above = levels[depth-1]; let level = levels[depth]; @@ -458,8 +464,14 @@ // omit polys that match bottom level polys unless level above is cleared start = poly2polyEmit(level, start, (poly, index, count, fromPoint) => { poly.level_emit = true; + if (ease) { + fromPoint.z += ease; + } fromPoint = polyEmit(poly, index, count, fromPoint); - fromPoint = depthOutlinePath(fromPoint, depth + 1, levels, radius, emitter, clr); + if (ease) { + fromPoint.z += ease; + } + fromPoint = depthOutlinePath(fromPoint, depth + 1, levels, radius, emitter, clr, ease); return fromPoint; }, {weight: true}); return start; From 1f2a1ab133df46508c0b047338ae8a3121e50d26 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Wed, 24 Feb 2021 19:27:39 -0500 Subject: [PATCH 164/255] bump rev 2.7.D13 --- package.json | 2 +- src/kiri.js | 2 +- src/license.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index b0960d4e..ce6775e6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grid-apps", - "version": "2.7.12D", + "version": "2.7.13D", "description": "grid.space 3d slice & modeling tools", "author": "Stewart Allen ", "license": "MIT", diff --git a/src/kiri.js b/src/kiri.js index dd11b4ce..5a488ab4 100644 --- a/src/kiri.js +++ b/src/kiri.js @@ -6,7 +6,7 @@ if (!self.kiri) { self.kiri = { - beta: 2712, + beta: 2713, driver: {}, // driver modules loader: [] // module loading: array of functions }; diff --git a/src/license.js b/src/license.js index 550b0e42..919dcfcb 100644 --- a/src/license.js +++ b/src/license.js @@ -3,7 +3,7 @@ let terms = { COPYRIGHT: "Copyright (C) Stewart Allen - All Rights Reserved", LICENSE: "See the license.md file included with the source distribution", - VERSION: "2.7.D12" + VERSION: "2.7.D13" }; if (typeof(module) === 'object') { From 1fb42cbc67d5472dd1dd1e291f7f1e9a5dc07571 Mon Sep 17 00:00:00 2001 From: Michael K Johnson Date: Wed, 24 Feb 2021 19:51:42 -0500 Subject: [PATCH 165/255] instructions for non-root local install --- readme.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/readme.md b/readme.md index fbf1b802..b4c50b56 100644 --- a/readme.md +++ b/readme.md @@ -1,6 +1,6 @@ [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://paypal.me/gridspace3d?locale.x=en_US) -Contributions in all forms (code, bug reports, community engagenment, cash money, etc) are warmly welcomed. They all go to the bottom line of making better apps. +Contributions in all forms (code, bug reports, community engagement, cash money, etc) are warmly welcomed. They all go to the bottom line of making better apps. [![Discord](https://img.shields.io/discord/688863523207774209)](https://discord.com/channels/688863523207774209/688863523211968535) ![GitHub](https://img.shields.io/github/license/GridSpace/grid-apps) @@ -54,6 +54,21 @@ to start a local instance of the apps. then open [Kiri:Moto](http://localhost:8080/kiri) or [Meta:Moto](http://localhost:8080/meta) on your local host +Alternatively, if you are using a packaged version of npm that ships with +a Linux distribution, but still want to install in your home directory, you +can use + +``` +npm config set prefix ~/.local +``` + +If gs-app-server is not found, then perhaps ~/.local/bin is not in +your path. You can either add it to your path, or you can run: + +``` +~/local/bin/gs-app-server --debug +``` + ### Windows Developers this git repo requires symbolic link support. on Windows, this means you have to clone the repo in a command shell with Administrator privileges. From 339dc7fa211ca56e30e51a6729bbb316133aca5e Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 26 Feb 2021 07:52:43 -0500 Subject: [PATCH 166/255] reorder lang key rewrites. reorder code.load event --- src/kiri/init.js | 26 +++++++++++++++----------- src/kiri/main.js | 3 +-- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/kiri/init.js b/src/kiri/init.js index f8c11aab..7cce2dfc 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -2520,6 +2520,19 @@ } } + // update static html elements with language overrides + UI.lang = function() { + for (let el of [...DOC.querySelectorAll("[lk]")]) { + let key = el.getAttribute('lk'); + let val = LANG[key]; + if (val) { + el.innerText = val; + } else { + console.log({missing_ln: key}); + } + } + }; + // if a language needs to load, the script is injected and loaded // first. once this loads, or doesn't, the initialization begins let lang_set = undefined; @@ -2535,6 +2548,7 @@ STATS.set('ll',lang); scr.onload = function() { KIRI.lang.set(lang); + UI.lang(); init_one(); }; scr.onerror = function(err) { @@ -2546,17 +2560,7 @@ // set to browser default which will be overridden // by any future script loads (above) KIRI.lang.set(); - - // update static html elements with language overrides - for (let el of [...DOC.querySelectorAll("[lk]")]) { - let key = el.getAttribute('lk'); - let val = LANG[key]; - if (val) { - el.innerText = val; - } else { - console.log({missing_ln: key}); - } - } + UI.lang(); // schedule init_one to run after all page content is loaded // unless a languge script is loading first, in which case it diff --git a/src/kiri/main.js b/src/kiri/main.js index 291a2666..c7aeaef0 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -1236,10 +1236,9 @@ } function loadCode(code, type) { + API.event.emit("code.load", {code, type}); setViewMode(VIEWS.PREVIEW); setOpacity(0); - - API.event.emit("code.load", {code, type}); KIRI.client.parse({code, type, settings}, progress => { API.show.progress(progress, "parsing"); }, (layers, maxSpeed) => { From 2b140ec0ed7ee9132061a54aef7f0b4c2782b954 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 26 Feb 2021 07:54:41 -0500 Subject: [PATCH 167/255] start french localization --- web/kiri/lang/fr-fr-help.html | 1 + web/kiri/lang/fr-help.html | 1 + web/kiri/lang/fr.js | 640 ++++++++++++++++++++++++++++++++++ 3 files changed, 642 insertions(+) create mode 120000 web/kiri/lang/fr-fr-help.html create mode 120000 web/kiri/lang/fr-help.html create mode 100644 web/kiri/lang/fr.js diff --git a/web/kiri/lang/fr-fr-help.html b/web/kiri/lang/fr-fr-help.html new file mode 120000 index 00000000..881705c6 --- /dev/null +++ b/web/kiri/lang/fr-fr-help.html @@ -0,0 +1 @@ +en-help.html \ No newline at end of file diff --git a/web/kiri/lang/fr-help.html b/web/kiri/lang/fr-help.html new file mode 120000 index 00000000..881705c6 --- /dev/null +++ b/web/kiri/lang/fr-help.html @@ -0,0 +1 @@ +en-help.html \ No newline at end of file diff --git a/web/kiri/lang/fr.js b/web/kiri/lang/fr.js new file mode 100644 index 00000000..d2f019e5 --- /dev/null +++ b/web/kiri/lang/fr.js @@ -0,0 +1,640 @@ +// French localization for Kiri:Moto +// Will defer to English map for any missing key/value pairs +kiri.lang['fr'] = +kiri.lang['fr-fr'] = { + // common keys and menus + animate: "animer", // CAM animate button + arrange: "arranger", // layout workspace objects + axis: "axe", // left object scale pop menu + clear: "débarrasser", // clear workspace (remove all objects) + copy: "copier", + delete: "supprimer", + detail: "détail", + done: "terminé", + enable: "permettre", + export: "exporter", + files: "fichiers", + help: "aide", + ghost: "translucide", // left render pop menu (wireframe) + hide: "cacher", // left render pop menu (invisible) + home: "position d'origine", + import: "importer", + language: "langue", + machine: "machine", // device or machine + metric: "métrique", + name: "nom", + prefs: "prefs", // left menu "preferences" + preview: "prévisualiser", + recent: "récent", + render: "rendre", // left render pop menu + reset: "remettre", + rotate: "tourner", // left rotate pop menu + save: "sauvegarder", + scale: "échelle", // left object scale pop menu + setup: "setup", + settings: "paramètres", + size: "taille", + solid: "solide", // view type pop menu + tool: "outil", + tools: "outils", // CAM tool menu button + top: "haut", + type: "genre", // CAM tool type + version: "version", + view: "vue", // left view pop menu + wire: "filaire", // left render pop menu + + acct_xpo: ["faites un sauvegarde de votre machine","et des profils des machines avec","l'option d'inclure les","objets et positions d'environnement"], + + // RIGHT-CLICK CONTEXT MENU + rc_clws: "débarrasser l'environnement", + rc_xpws: "exporter l'environnement", + rc_lafl: "poser à plat", + rc_mirr: "refléter", + rc_dupl: "dupliquer", + rc_xstl: "exporter en STL", + + // DEVICE MENU and related dialogs + dm_sldt: "sélectionner un genre de machine", + dm_stdd: "machines standard", + dm_mydd: "mes machines", + dm_seld: "machine sélectionnée", + dm_rcnt: "fichiers récents", + dm_savs: "paramètres sauvegardé", + dm_appp: "Préférences d'Application", + + // CAM Tool Dialog + td_tyem: "end", // end mill + td_tybm: "ball", // ball mill + td_tytm: "taper", // taper mill + td_tonm: "tool #", + td_shft: "shaft", // endmill shaft specs + td_flut: "flute", // endmill flute specs + td_tapr: "taper", // endmill taper specs + + // DEVICE dialog groups + dv_gr_dev: "device", + dv_gr_ext: "extruder", + dv_gr_out: "output", + dv_gr_gco: "gcode macros", + + // DEVICE dialog (_s = label, _l = hover help) + dv_name_s: "name", + dv_name_l: "device name", + dv_fila_s: "filament", + dv_fila_l: "diameter in millimeters", + dv_nozl_s: "nozzle", + dv_nozl_l: "diameter in millimeters", + dv_bedw_s: "width", + dv_bedw_l: "workspace units", + dv_bedd_s: "depth", + dv_bedd_l: "workspace units", + dv_bedh_s: "height", + dv_bedh_l: ["max build height","in workspace units"], + dv_spmx_s: "max spindle", + dv_spmx_l: ["max spindle rpm speed","0 to disable"], + dv_xtab_s: "absolute positioning", + dv_xtab_l: "extrusion moves absolute", + dv_orgc_s: "origin center", + dv_orgc_l: "bed origin center", + // dv_orgt_s: "origin top", + // dv_orgt_l: "part z origin top", + dv_bedc_s: "circular bed", + dv_bedc_l: "device bed is circular", + dv_belt_s: "belt bed", + dv_belt_l: "continuous printing bed", + dv_fanp_s: "fan power", + dv_fanp_l: "set cooling fan power", + dv_prog_s: "progress", + dv_prog_l: "output on each % progress", + dv_layr_s: "layer", + dv_layr_l: ["output at each","layer change"], + dv_tksp_s: "token spacer", + dv_tksp_l: ["add a space between","gcode axis parameters","G0X0Y0X0","vs","G0 X0 Y0 Z0"], + dv_strc_s: "strip comments", + dv_strc_l: ["strip gcode comments","comments begin with ;"], + dv_fext_s: "file extension", + dv_fext_l: "file name extension", + dv_dwll_s: "dwell", + dv_dwll_l: "gcode dwell script", + dv_tool_s: "tool change", + dv_tool_l: "tool change script", + dv_sspd_s: "spindle speed", + dv_sspd_l: "set spindle speed", + dv_paus_s: "pause", + dv_paus_l: "gcode pause script", + dv_head_s: "header", + dv_head_l: "gcode header script", + dv_foot_s: "footer", + dv_foot_l: "gcode footer script", + dv_lzon_s: "laser on", + dv_lzon_l: "gcode laser on script", + dv_lzof_s: "laser off", + dv_lzof_l: "gcode laser off script", + dv_exts_s: "select", + dv_exts_l: "gcode run to enable this extruder", + dv_dext_s: "deselect", + dv_dext_l: "gcode run before enabling another extruder", + dv_extd_s: "deselect", + dv_extd_l: "gcode to deselect this extruder", + dv_exox_s: "offset x", + dv_exox_l: "nozzle offset x", + dv_exoy_s: "offset y", + dv_exoy_l: "nozzle offset y", + + // MODE + mo_menu: "mode", + mo_fdmp: "FDM Print", + mo_slap: "SLA Print", + mo_lazr: "Laser Cut", + mo_cncm: "CNC Mill", + + // SETUP + su_menu: "setup", + su_devi: "Devices", + su_tool: "Tools", + su_locl: "Local", + su_xprt: "Export", + su_help: "Help", + + // LOAD + fe_menu: "file", + fn_recn: "Recent", + fn_impo: "Import", + + // FUNCTION + fn_menu: "action", + fn_arra: "Arrange", + fn_slic: "Slice", + fn_prev: "Preview", + fn_expo: "Export", + + // VIEW + vu_menu: "view", + vu_home: "Home", + vu_rset: "Reset", + vu_sptp: "Top", + vu_spfr: "Front", + vu_splt: "Left", + vu_sprt: "Right", + + // WORKSPACE + ws_menu: "view", + ws_save: "Save", + ws_cler: "Clear", + + // OPTIONS + op_menu: "interface", + op_disp: "display", + op_xprt_s: "expert", + op_xprt_l: "show more settings options", + op_decl_s: "decals", + op_decl_l: "show device decals and logos", + op_dang_s: "experimental", + op_dang_l: "show experimental parameters", + op_hopo_s: "hover pop", + op_hopo_l: ["enable menu hover","to activate"], + op_dark_s: "dark mode", + op_dark_l: "dark mode interface", + op_comp_s: "compact ui", + op_comp_l: ["compact user interface","better for small screens","and tablets"], + op_shor_s: "show origin", + op_shor_l: "show device or process origin", + op_shru_s: "show rulers", + op_shru_l: ["show axes rulers","on major gridlines"], + op_sped_s: "show speeds", + op_sped_l: ["show speed to color bar","in preview mode"], + op_auto_s: "auto layout", + op_auto_l: ["automatically layout platform","when new items added"], + op_free_s: "free layout", + op_free_l: ["permit dragable layout","no effect in laser mode"], + op_spcr_s: "spacing", + op_spcr_l: ["spacing between objects","during auto layout","in workspace units"], + op_invr_s: "invert zoom", + op_invr_l: ["invert mouse wheel","scroll zoom"], + op_save_s: "auto save", + op_save_l: ["preserve objects in workspace","between application reloads"], + op_line_s: "line type", + op_line_l: ["line style for path rendering","impacts 3d performance","path: 3d best","flat: 2d good","line = 1d fast"], + op_unit_s: "units", + op_unit_l: ["workspace units affects","speeds and distances"], + op_anim_s: "animate", + op_anim_l: ["animation mesh density","higher is more dense","takes more memory","and is slower"], + + lo_menu: "layout", + + pt_menu: "parts", + pt_deci_s: "decimate", + pt_deci_l: ["enable or disable point decimation","during port import. for faster slicing","and lower memory usage"], + pt_qual_s: "quality", + pt_qual_l: ["level of detail to retain","during slicing operations","lower is faster"], + pt_heal_s: "heal mesh", + pt_heal_l: ["attempt to heal","non-manifold meshes","adds to slicing time"], + + xp_menu: "exports", + + // SETTINGS + se_menu: "profile", + se_load: "load", + se_save: "save", + + // FDM SLICING + sl_menu: "layers", + sl_lahi_s: "height", + sl_lahi_l: ["height of each slice","layer in millimeters"], + ad_minl_s: "height min", + ad_minl_l: ["adaptive min layer height","in millimeters","must be non-zero"], + sl_ltop_s: "top layers", + sl_ltop_l: ["number of solid layers","to enforce at the","top of the print"], + sl_lsld_s: "solid layers", + sl_lsld_l: ["solid fill areas computed","from layer deltas. see","layer pop menu"], + sl_lbot_s: "base layers", + sl_lbot_l: ["number of solid layers","to enforce at the","bottom of the print"], + ad_adap_s: "adaptive", + ad_adap_l: ["use adaptive layer heights","with 'layer height' as max","and 'layer min' as the min"], + + // FDM SHELLS + sl_shel_s: "shell count", + sl_shel_l: ["number of perimeter","walls to generate"], + sl_ordr_s: "shell order", + sl_ordr_l: ["output shell order","inside to outside","or outside to inside","affects surface quality"], + sl_strt_s: "layer start", + sl_strt_l: ["layer starting point","last = last layer end","center = part center","origin = device origin"], + ad_thin_s: "thin walls", + ad_thin_l: ["detect and fill gaps","between shell walls"], + + // FDM FILL + fi_menu: "infill", + fi_type: "type", + fi_pcnt_s: "fill fraction", + fi_pcnt_l: ["fill density values","0.0 - 1.0"], + fi_angl_s: "solid start", + fi_angl_l: ["starting angle in degrees","90 degrees added to ","each following layer","applies only to solid layers"], + fi_over_s: "overlap", + fi_over_l: ["overlap with shell and other fill","as fraction of nozzle diameter","0.0 - 1.0"], + // fi_rate_s: "print speed", + fi_rate_l: ["extrusion speed for infill","set to 0 to use default","output print speeds"], + + // FDM FIRST LAYER + fl_menu: "base", + fl_lahi_s: "layer height", + fl_lahi_l: ["height of each slice","in millimeters","should be >= slice height"], + fl_rate_s: "shell speed", + fl_rate_l: ["shell printing max speed","in millimeters / minute"], + fl_frat_s: "fill speed", + fl_frat_l: ["fill printing max speed","in millimeters / minute"], + fl_mult_s: "flow factor", + fl_mult_l: ["extrusion multiplier","0.0 - 2.0"], + fl_sfac_s: "width factor", + fl_sfac_l: ["multiplier on nozzle size","changes line spacing"], + fl_skrt_s: "skirt count", + fl_skrt_l: ["number of first-layer offset","brims to generate"], + fl_skro_s: "skirt offset", + fl_skro_l: ["skirt offset from part","in millimeters"], + fl_nozl_s: "nozzle temp", + fl_nozl_l: ["degrees in celsius","output setting used","when this is zero"], + fl_bedd_s: "bed temp", + fl_bedd_l: ["degrees in celsius","output setting used","when this is zero"], + fr_spac_s: "raft gap", + fr_spac_l: ["additional layer spacing","between 1st layer and raft","in millimeters"], + fr_nabl_s: "raft enable", + fr_nabl_l: ["create a raft under the","model for better adhesion","uses skirt offset and","disables skirt output"], + + // FDM BELT ONLY + fl_zoff_s: "belt offset", + fl_zoff_l: ["height offset from belt","of lowest extrusion","in millimeters"], + fl_brim_s: "brim size", + fl_brim_l: ["add brim to part bottom","size is width in millimeters","0 to disable"], + fl_brmn_s: "brim trigger", + fl_brmn_l: ["add brims only when segment","facing belt is shorter than this","value in millimeters","0 = Infinity"], + fl_bled_s: "part anchor", + fl_bled_l: ["belt part anchor","at start of print","in millimeters"], + + // FDM SUPPORT + sp_menu: "support", + sp_detect: "detect", + sp_dens_s: "density", + sp_dens_l: ["fraction 0.0 - 1.0","recommended 0.15","0 to disable"], + sp_size_s: "pillar size", + sp_size_l: ["pillar width","in millimeters"], + sp_offs_s: "part offset", + sp_offs_l: ["offset from part","in millimeters"], + sp_gaps_s: "gap layers", + sp_gaps_l: ["number of layers","offset from part"], + sp_span_s: "max span", + sp_span_l: ["unsupported span that causes","a new support to be generated","in millimeters"], + sp_angl_s: "max angle", + sp_angl_l: ["max overhang angle before","supporting pillar is generated"], + sp_area_s: "min area", + sp_area_l: ["minimum area for","a support column","in millimeters"], + sp_xpnd_s: "expand", + sp_xpnd_l: ["expand support area","beyond part boundary","in millimeters"], + sp_nozl_s: "extruder", + sp_nozl_l: ["in multi-extruder systems","the extruder to use for","support material"], + sp_auto_s: "automatic", + sp_auto_l: ["enable generated supports","using at-slice-time geometry","supports will only appear","after slicing completes"], + + // LASER SLICING + ls_offs_s: "offset", + ls_offs_l: ["adjust for beam width","in millimeters"], + ls_lahi_s: "height", + ls_lahi_l: ["layer height","in millimeters","0 = auto/detect"], + ls_lahm_s: "min", + ls_lahm_l: ["layer height minimum","will merge auto slices","under this thickness","in millimeters"], + ls_sngl_s: "single", + ls_sngl_l: ["perform only one slice","at specified layer height"], + + // CNC COMMON terms + cc_tool: "tool", + cc_offs_s: "offset", + cc_offs_l: ["offset tool center","from chosen path"], + cc_spnd_s: "spindle rpm", + cc_spnd_l: ["spindle speed in","revolutions / minute"], + cc_sovr_s: "step over", + cc_sovr_l: ["as a fraction of","tool diameter"], + cc_sdwn_s: "step down", + cc_sdwn_l: ["step down depth","for each pass","in workspace units","0 to disable"], + cc_feed_s: "feed rate", + cc_feed_l: ["max cutting speed in","workspace units / minute"], + cc_plng_s: "plunge rate", + cc_plng_l: ["max z axis speed in","workspace units / minute"], + cc_sngl_s: "select lines only", + cc_sngl_l: ["select only single edges","instead of connected polylines"], + + // CNC COMMON + cc_menu: "limits", + cc_flip: "flip", + cc_rapd_s: "xy feed", + cc_rapd_l: ["max xy moves feedrate","in workspace units / minute"], + cc_rzpd_s: "z feed", + cc_rzpd_l: ["max z moves feedrate","in workspace units / minute"], + + cc_loff_s: "offset", + cc_loff_l: ["distance from stock face","for leveling pass","in workspace units"], + + // CNC ROUGHING + cr_menu: "rough", + cr_lsto_s: "leave stock", + cr_lsto_l: ["horizontal offset from vertical faces","stock to leave for finishing pass","in workspace units"], + cr_ease_s: "ease down", + cr_ease_l: ["plunge cuts will","spiral down or ease","along a linear path"], + cr_clrt_s: "clear top", + cr_clrt_l: ["run a clearing pass over","the bounding area of the part","at z = 0"], + cr_clrp_s: "clear voids", + cr_clrp_l: ["mill out through pockets","instead of just the outline"], + cr_clrf_s: "clear faces", + cr_clrf_l: ["interpolate step down to","clear any detected flat areas"], + cr_olin_s: "inside only", + cr_olin_l: ["limit cutting to","inside part boundaries"], + + // CNC OUTLINE + co_menu: "outline", + co_dogb_s: "dogbones", + co_dogb_l: ["insert dogbone cuts","into inside corners"], + co_wide_s: "wide cutout", + co_wide_l: ["widen outside cutout paths","for deep cuts in hard material"], + co_olin_s: "inside only", + co_olin_l: ["limit cutting to","inside part boundaries"], + co_olot_s: "outside only", + co_olot_l: ["limit cutting to","exterior part boundaries","which can be thought of","as the shadow outline"], + co_omit_s: "omit through", + co_omit_l: "eliminate thru holes", + co_olen_s: "enable", + co_olen_l: "enabled outline cutting", + + // CNC CONTOUR + cn_menu: "contour", + cf_angl_s: "max angle", + cf_angl_l: ["angles greater than this","are considered vertical"], + cf_curv_s: "curves only", + cf_curv_l: ["limit linear cleanup","to curved surfaces"], + cf_olin_s: "inside only", + cf_olin_l: ["limit cutting to","inside part boundaries"], + cf_linx_s: "enable y pass", + cf_linx_l: "linear y-axis finishing", + cf_liny_s: "enable x pass", + cf_liny_l: "linear x-axis finishing", + + // CNC TRACE + cu_menu: "trace", + cu_type_s: "type", + cu_type_l: ["follow = tool tip follows line","right or left = tool tip","follows line offset by tool radius"], + + // CNC DRILLING + cd_menu: "drill", + cd_axis: "axis", + cd_points: "points", + cd_plpr_s: "plunge per", + cd_plpr_l: ["max plunge between","dwell periods","in workspace units","0 to disable"], + cd_dwll_s: "dwell time", + cd_dwll_l: ["dwell time","between plunges in","in milliseconds"], + cd_lift_s: "drill lift", + cd_lift_l: ["lift between plunges","after dwell period","in workspace units","0 to disable"], + cd_regi_s: "register", + cd_regi_l: ["drill registration holes","for double-sided parts","independent of enable","drilling but uses same","tool and settings"], + + // CNC CUTOUT TABS + ct_menu: "tabs", + ct_angl_s: "angle", + ct_angl_l: ["starting angle for tab spacing","in degrees (0-360)"], + ct_numb_s: "count", + ct_numb_l: ["number of tabs to use","will be spaced evenly","around the part"], + ct_wdth_s: "width", + ct_wdth_l: "width in workspace units", + ct_hght_s: "height", + ct_hght_l: "height in workspace units", + ct_dpth_s: "depth", + ct_dpth_l: ["distance in workspace units","that the tab projects from","the part surface"], + ct_midl_s: "midline", + ct_midl_l: ["use midline of tab","instead of z bottom","for double-sided work"], + ct_nabl_s: "auto", + ct_nabl_l: ["auto generate radial tabs","projected from part center","using count and angle offset"], + + // OUTPUT + ou_menu: "output", + + // LASER KNIFE + dk_menu: "knife", + dk_dpth_s: "cut depth", + dk_dpth_l: ["final cut depth","in millimeters"], + dk_pass_s: "cut passes", + dk_pass_l: ["number of passes","down to cut depth"], + dk_offs_s: "tip offset", + dk_offs_l: ["distance from blade tip","to center of tool","in millimeters"], + + // OUTPUT LASER + ou_spac_s: "spacing", + ou_spac_l: ["distance between layer output","in millimeters"], + ou_scal_s: "scaling", + ou_scal_l: "multiplier (0.1 to 100)", + ou_powr_s: "power", + ou_powr_l: ["0 - 100","represents %"], + ou_sped_s: "speed", + ou_sped_l: "millimeters / minute", + ou_mrgd_s: "merged", + ou_mrgd_l: ["merge all layers using","color coding to denote","stacking depth"], + ou_grpd_s: "grouped", + ou_grpd_l: ["retain each layer as","a unified grouping","instead of separated","polygons"], + ou_layr_s: "layer order", + ou_layr_l: ["output layer order","from top right to","bottom left"], + ou_layo_s: "layer color", + ou_layo_l: ["output layer colors","for each z index","overridden by merged"], + ou_drkn_s: "drag knife", + ou_drkn_l: ["enable drag knife","output in gcode","cut radii are added","to corners with","cut down passes"], + + // OUTPUT FDM + ou_nozl_s: "nozzle temp", + ou_nozl_l: "degrees in celsius", + ou_bedd_s: "bed temp", + ou_bedd_l: "degrees in celsius", + ou_feed_s: "print speed", + ou_feed_l: ["max print speed","millimeters / minute"], + ou_fini_s: "finish speed", + ou_fini_l: ["outermost shell speed","millimeters / minute"], + ou_move_s: "move speed", + ou_move_l: ["non-print move speed","millimeters / minute","0 = enable G0 moves"], + ou_shml_s: "shell factor", + ou_flml_s: "solid factor", + ou_spml_s: "infill factor", + ou_exml_l: ["extrusion multiplier","0.0 - 2.0"], + ou_fans_s: "fan speed", + ou_fans_l: "0 - 255", + + // OUTPUT CAM + ou_toll_s: "tolerance", + ou_toll_l: ["surface precision","in workspace units","lower is slower and","uses more memory","0 = automatic based","on animate preference"], + ou_zanc_s: "z anchor", + ou_zanc_l: ["controls the position of the part","when stock Z exceeds part Z"], + ou_ztof_s: "z offset", + ou_ztof_l: ["offset z anchor","in workspace units","has no effect when","anchor is middle"], + ou_zbot_s: "z bottom", + ou_zbot_l: ["offset from part bottom","to limit cutting depth","in workspace units"], + ou_zclr_s: "z clearance", + ou_zclr_l: ["safe travel offset","from top of part","in workspace units"], + ou_ztru_s: "z thru", + ou_ztru_l: ["extend cutout pass down","in workspace units"], + ou_conv_s: "conventional", + ou_conv_l: ["milling direction","uncheck for 'climb'"], + ou_depf_s: "depth first", + ou_depf_l: ["optimize pocket cuts","with depth priority"], + + // CAM STOCK + cs_menu: "stock", + cs_wdth_s: "width", + cs_wdth_l: ["width (x) in workspace units","0 defaults to part size"], + cs_dpth_s: "depth", + cs_dpth_l: ["depth (y) in workspace units","0 defaults to part size"], + cs_hght_s: "height", + cs_hght_l: ["height (z) in workspace units","0 defaults to part size"], + cs_offs_s: "offset", + cs_offs_l: ["use width, depth, height","as offsets from max","part size on platform"], + cs_clip_s: "clip to", + cs_clip_l: ["rough and outline","clip cutting paths","to defined stock"], + cs_offe_s: "enable", + cs_offe_l: "enable milling stock", + + // ORIGIN (CAM & LASER) + or_bnds_s: "origin bounds", + or_bnds_l: ["origin is relative to","boundary of all objects"], + or_cntr_s: "origin center", + or_cntr_l: "origin is referenced from the center", + or_topp_s: "origin top", + or_topp_l: "origin is references from the top of objects", + + // FDM ADVANCED + ad_menu: "expert", + ad_rdst_s: "retract dist", + ad_rdst_l: ["amount to retract filament","for long moves. in millimeters"], + ad_rrat_s: "retract rate", + ad_rrat_l: ["speed of filament","retraction in mm/s"], + ad_rdwl_s: "engage dwell", + ad_wpln_s: "retract wipe", + ad_wpln_l: ["non-printing move","after retraction","in millimeters"], + ad_rdwl_l: ["time between re-engaging","filament and movement","in milliseconds"], + ad_scst_s: "shell coast", + ad_scst_l: ["non-printing end","of perimeter shells","in millimeters"], + ad_msol_s: "min solid", + ad_msol_l: ["minimum area (mm^2)","required to keep solid","must be > 0.1"], + ad_mins_s: "min speed", + ad_mins_l: ["minimum speed","for short segments"], + ad_spol_s: "short path", + ad_spol_l: ["polygons shorter than this","will have their print speed","scaled down to min speed","in millimeters"], + ad_arct_s: "arc tolerance", + ad_arct_l: ["convert faceted lines to arcs","center point drift tolerance","when matching arc points","consider values around 0.15","in millimeters","0 to disable"], + ad_zhop_s: "z hop dist", + ad_zhop_l: ["amount to raise z","on retraction moves","in millimeters","0 to disable"], + ad_abkl_s: "anti-backlash", + ad_abkl_l: ["for better flat surface finish","use micro-movements to cancel","backlash in solid layer output","in millimeters","0 to disable","if your firmware has M425","put that in the gcode header","and leave this as 0"], + ad_lret_s: "layer retract", + ad_lret_l: ["force filament retraction","between layers"], + ad_play_s: "polish layers", + ad_play_l: ["polish up to specified","# of layers at a time"], + ad_pspd_s: "polish speed", + ad_pspd_l: ["polishing speed","in millimeters / minute"], + + // CAM EXPERT + cx_fast_s: "skip shadow", + cx_fast_l: ["disable overhang detection","can be faster and use less","memory with complex models","but fails with overhangs","try enabling if slicing","hangs during shadowing"], + + // FDM GCODE + ag_menu: "gcode", + ag_nozl_s: "nozzle", + ag_nozl_l: "select output nozzle or head", + ag_paws_s: "pause layers", + ag_paws_l: ["comma-separated list of layers","to inject pause commands before"], + ag_loop_s: "loop layers", + ag_loop_l: ["layer ranges to repeat in the format","first-last-count,first-last-count,...","omitted count = 1"], + + // SLA MENU + sa_menu: "slicing", + sa_lahe_s: "layer height", + sa_lahe_l: ["layer height","in millimeters"], + sa_shel_s: "hollow shell", + sa_shel_l: ["shell thickness in mm","use multiple of layer height","use 0 for solid (disabled)"], + sa_otop_s: "open top", + sa_otop_l: ["if shell is enabled","results in an open top"], + sa_obas_s: "open base", + sa_obas_l: ["if shell is enabled","results in an open base","disabled with supports"], + + sa_layr_m: "layers", + sa_lton_s: "light on time", + sa_lton_l: ["layer light on","time in seconds"], + sa_ltof_s: "light off time", + sa_ltof_l: ["layer light off","time in seconds"], + sa_pldi_s: "peel distance", + sa_pldi_l: ["peel distance","in millimeters"], + sa_pllr_s: "peel lift rate", + sa_pllr_l: ["peel lift speed","in mm/sec"], + sa_pldr_s: "peel drop rate", + sa_pldr_l: ["peel drop speed","in mm/sec"], + + sa_base_m: "base", + sa_balc_s: "layer count", + sa_balc_l: ["number of","base layers"], + sa_bltn_l: ["base layer light on","time in seconds"], + sa_bltf_l: ["base layer light off","time in seconds"], + + sa_infl_m: "infill", + sa_ifdn_s: "density", + sa_ifdn_l: ["percent infill","requires shell","0 = disabled","valid 0.0 - 1.0"], + sa_iflw_s: "line width", + sa_iflw_l: ["hatch line width","in millimeters"], + + sa_supp_m: "support", + sa_slyr_s: "base layers", + sa_slyr_l: ["base support layers","value range 0-10"], + sa_slgp_s: "gap layers", + sa_slgp_l: ["number of layers between","raft and bottom of object"], + sa_sldn_s: "density", + sa_sldn_l: ["used to compute the","number of support pillars","0.0-1.0 (0 = disable)"], + sa_slsz_s: "size", + sa_slsz_l: ["max size of a","support pillar","in millimeters"], + sa_slpt_s: "points", + sa_slpt_l: ["number of points in","each support pillar","in millimeters"], + sl_slen_l: "enable supports", + + sa_outp_m: "output", + sa_opzo_s: "z offset", + sa_opzo_l: ["z layer offset","almost always 0.0","0.0-1.0 in millimeters"], + sa_opaa_s: "anti alias", + sa_opaa_l: ["enable anti-aliasing","produces larger files","can blur details"] +}; \ No newline at end of file From 98ad9853d68ddeb180ec2df22782621ffccac212 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 26 Feb 2021 09:32:34 -0500 Subject: [PATCH 168/255] fix gcode parsing progress message --- src/kiri/client.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kiri/client.js b/src/kiri/client.js index 27ed2c91..d05fd738 100644 --- a/src/kiri/client.js +++ b/src/kiri/client.js @@ -248,7 +248,7 @@ KIRI.work = { } send("parse", args, function(reply) { if (reply.progress) { - progress(reply); + progress(reply.progress); } if (reply.parsed) { done(KIRI.codec.decode(reply.parsed), reply.maxSpeed); From 11afb0be2b2ce6285c9539104fa8df9fdb4042d8 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 26 Feb 2021 09:48:34 -0500 Subject: [PATCH 169/255] expose loadCode function as api.function.parse --- src/kiri/main.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/kiri/main.js b/src/kiri/main.js index c7aeaef0..a3d6ec0c 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -286,7 +286,8 @@ animate: noop, export: prepareExport, cancel: cancelWorker, - clear: KIRI.client.clear + clear: KIRI.client.clear, + parse: loadCode }, hide: { alert: function(rec) { alert2cancel(rec) }, From 0d1e16166dc9e2000c199fb4762581a2f204171c Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 26 Feb 2021 12:27:01 -0500 Subject: [PATCH 170/255] french lang updates --- web/kiri/lang/fr.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/web/kiri/lang/fr.js b/web/kiri/lang/fr.js index d2f019e5..fa71d9b7 100644 --- a/web/kiri/lang/fr.js +++ b/web/kiri/lang/fr.js @@ -63,18 +63,18 @@ kiri.lang['fr-fr'] = { dm_appp: "Préférences d'Application", // CAM Tool Dialog - td_tyem: "end", // end mill - td_tybm: "ball", // ball mill - td_tytm: "taper", // taper mill - td_tonm: "tool #", - td_shft: "shaft", // endmill shaft specs - td_flut: "flute", // endmill flute specs - td_tapr: "taper", // endmill taper specs + td_tyem: "plat", // end mill + td_tybm: "boule", // ball mill + td_tytm: "v forme", // taper mill + td_tonm: "outil #", + td_shft: "tige", // endmill shaft specs + td_flut: "flûte", // endmill flute specs + td_tapr: "cône", // endmill taper specs // DEVICE dialog groups - dv_gr_dev: "device", - dv_gr_ext: "extruder", - dv_gr_out: "output", + dv_gr_dev: "machine", + dv_gr_ext: "extrudeuse", + dv_gr_out: "sortie", dv_gr_gco: "gcode macros", // DEVICE dialog (_s = label, _l = hover help) From 1729fde18ed88ec35d5ad9b805ba9901fe75d888 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 26 Feb 2021 13:22:16 -0500 Subject: [PATCH 171/255] Update readme.md --- readme.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/readme.md b/readme.md index b4c50b56..2dd840bd 100644 --- a/readme.md +++ b/readme.md @@ -1,6 +1,6 @@ [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://paypal.me/gridspace3d?locale.x=en_US) -Contributions in all forms (code, bug reports, community engagement, cash money, etc) are warmly welcomed. They all go to the bottom line of making better apps. +Contributions in all forms (code, bug reports, community engagement, localization, etc) are warmly welcomed. [![Discord](https://img.shields.io/discord/688863523207774209)](https://discord.com/channels/688863523207774209/688863523211968535) ![GitHub](https://img.shields.io/github/license/GridSpace/grid-apps) @@ -19,6 +19,8 @@ Contributions in all forms (code, bug reports, community engagement, cash money, ![GitHub package.json version (branch)](https://img.shields.io/github/package-json/v/GridSpace/grid-apps/rel-2.2) ![GitHub package.json version (branch)](https://img.shields.io/github/package-json/v/GridSpace/grid-apps/rel-2.3) ![GitHub package.json version (branch)](https://img.shields.io/github/package-json/v/GridSpace/grid-apps/rel-2.4) +![GitHub package.json version (branch)](https://img.shields.io/github/package-json/v/GridSpace/grid-apps/rel-2.5) +![GitHub package.json version (branch)](https://img.shields.io/github/package-json/v/GridSpace/grid-apps/rel-2.6) ### Development Activity From ca6f4bf9d17d3fbf474decbf21a0257f4be05ae9 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 26 Feb 2021 14:54:20 -0500 Subject: [PATCH 172/255] remove .3w file support for davinci mini w --- src/dev/fdm/XYZ.daVinci.Mini.w | 2 -- src/mode/fdm/driver.js | 5 ----- 2 files changed, 7 deletions(-) diff --git a/src/dev/fdm/XYZ.daVinci.Mini.w b/src/dev/fdm/XYZ.daVinci.Mini.w index 4e945b50..be80197d 100644 --- a/src/dev/fdm/XYZ.daVinci.Mini.w +++ b/src/dev/fdm/XYZ.daVinci.Mini.w @@ -22,8 +22,6 @@ "cmd":{ "fan_power": "M106 S{fan_speed}" }, - "proc": "kiri_fdm_xyz_mini_w", - "file-ext": "3w", "settings":{ "origin_center": false, "extrude_abs": true, diff --git a/src/mode/fdm/driver.js b/src/mode/fdm/driver.js index 240d025d..c28582c1 100644 --- a/src/mode/fdm/driver.js +++ b/src/mode/fdm/driver.js @@ -46,11 +46,6 @@ return params; } - // customer gcode post function for XYZ daVinci Mini W - self.kiri_fdm_xyz_mini_w = function(gcode, options) { - return btoa("; filename = kirimoto.gcode\n; machine = dv1MW0A000\n" + gcode); - }; - // defer loading until KIRI.client and KIRI.worker exist KIRI.loader.push(function(API) { From abf8d291daccf584929e601c26f6a69e8ff9ddb3 Mon Sep 17 00:00:00 2001 From: Harald Wagener Date: Sat, 27 Feb 2021 11:40:29 +0100 Subject: [PATCH 173/255] Create de-help.html German translation of the help text --- web/kiri/lang/de-help.html | 187 +++++++++++++++++++++++++++++++++++++ 1 file changed, 187 insertions(+) create mode 100644 web/kiri/lang/de-help.html diff --git a/web/kiri/lang/de-help.html b/web/kiri/lang/de-help.html new file mode 100644 index 00000000..38587cb3 --- /dev/null +++ b/web/kiri/lang/de-help.html @@ -0,0 +1,187 @@ +
    + +
    + + +
    + +
    + +
    +
    Über
    +
    starting
    +
    Steuerung
    + +
    Unterstützung
    +
    Das Projekt
    +
    + +
    +
    +
    +

    + Kiri:Moto ist ein einzigartiger browser-basierter, komplett quelloffener slicer, + mit dem Du 3D-Modelle in Steuerbefehle für 3D-Drucker, CNC-Fräsen, + uns Laser Cutter umwandeln kannst. +


    + Browser-basiert bedeutet, dass alle Verarbeitung in Deinem Browser stattfindet, + und nicht in der Cloud. Deine Modelle und Daten bleiben privat auf Deinem Rechner. +


    + Das heisst, das Kiri wie eine lokale Anwendung auf Deinem Computer läuft, aber zusätzlich + so sicher ist, wie Dein Browser. +


    + Ein weiterer Vorteil von Kiri als Web-Anwendung ist, dass Du immer die aktuelle Version + verwendest. Neue Funktionen, Fehlerbehebungen, und andere Updates kommen regelmäßig und automatisch + bei Dir an. Wenn Du eine ältere, oder eine Entwicklungsversion von Kiri verwenden willst, kannst + Du diese im Nutzer-Menü oben rechts auswählen. +

    +
    +
    + Kiri leitet sich von Kiri-e ab, der Japanischen Scherenschnitt-Kunst. + Moto ist ein Kürzel für "Modeling Tool" (Modellierungs-Werkzeug) +
    + +
    + Schnell-Anleitung +
    +

    +

  • Schau Dir The Definitive Video Guide to Kiri:Moto 2.5 an (auf Englisch)
  • +
  • Im Einrichtungs-Menü wählst Du Geräte und Arbeitsmodus
  • +
  • preferences allow interface and mode-specific settings
  • +
  • Du kannst Geräte-Konfigurationen anpassen, wenn Du die Standard-Einstellungen verändern willst
  • +
  • Öffne Dateien importiere Teile auf die Arbeitsfläche
  • +
  • use the right-side profile menus to customize slicing parameters
  • +
  • Mit Slice siehst du, wie die Parameter sich auf Objekte auswirken
  • +
  • Vorschau berechnet Pfade (Maschinen-Anweisungen) aus den gesliceten Objekten
  • +
  • Export speichert diese Pfade in GCode- oder SVG-Dateien
  • + +

    +
    +
    + Arbeits-Modi +

    Jeder Modus (FDM, CAM, Laser, SLA) hat unterschiedliche Funktionen und Einstellungsmöglichkeiten. + Schau Dir die Youtube-Videos an, um mehr zu erfahren.

    +
    +
    + +
    Über 3d-Druck
    +
    Über CNC-Fräsen
    +
    Über Laser-Cutting
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Tastatur-Befehle
    TasteBefehl
    Konfiguration
    Geräte Auswahl
    Auswahl des Fräswerkzeugs
    Grid-Geräte im Netzwerk
    Voreinstellungen
    Arbeits-Profile
    Modus
    Platzieren
    Slice
    Vorschau
    Animieren
    Export
    Datei
    Importieren
    Letzte Dateien
    Ansicht
    Standard
    Oben
    Vorn
    Hinten
    Ansicht zurüksetzen
    Durch die Seitenansichten wechseln
    Fokus (Platzieren)
    Ebene (Slice/Vorschau)
    Objekte
    Duplizieren
    Spiegeln
    Rotieren (Dialog)
    Löschen
    Um 90° rotieren
    Um 5° rotieren
    5mm bewegen
    Alle Objekte auswählen
    Hilfe
    Dieses Fenster
    +
    + + + + + + + + + + + + + + + + + +
    Maus-Kontrollen
    TastenkombinationBefehl
    Ansicht
    wheelSchicht wechseln
    verschiebenAnsicht schwenken
    Ansicht schwenken
    Ansicht rotieren
    Ausschnitt verändern
    Ausschnitt verändern
    dragAnsicht schwenkden
    Objekte
    Seite aufs Bett ausrichten
    Seite aufs Bett ausrichten
    +
    +
    + +
    + Weitere Informationen + + Weitere Optionen +

    + Im button> NutzerMenü open rechts, kannst Du die Funktion + Export verwenden, um eine Kopie Deiner Geräte Profile und (optional) Deiner Arbeitsfläche + herunterzuladen. Mit dieser Datei kannst Du jederzeit Deine komplette Arbeitsumgebung bei Kiri:Moto wieder herstellen. + Du kannst sie auch mit anderen Teilen, zum Beispiel um die Entwickler oder andere Nutzer bei der Fehlersuche zu unterstützen. +

    +
    + +
    + Open Source +

    + Kiri:Moto ist komplett quelloffen. + Mehr kannst Du auf der Github-Seite zum Projekt erfahten. Es gibt verwandte Projekte, sowohl Software als auch + Hardware. Neue Entwickler und Code-Erweiterungen werden gerne entgegen genommen. Der Quellcode ist unter der + MIT-Lizenz veröffentlicht. +


    + Spenden sind natürlich auch willkommen. +

    +
    Integrationen +

    Kiri:Moto ist auch in anderen Applikationen integriert.

    +
  • Onshape im App store
  • +
  • Thingiverse als Thing Apps
  • +
  • SimplyPrint.io verwendet Kiri:Moto als primären Slicer
  • +
  • CAMLab ist eine Variante einer früheren Version von Kiri:Moto
  • +
    + +
    + +
    +
    From d67852db4ab9ade10d102a510a6124874a209063 Mon Sep 17 00:00:00 2001 From: Harald Wagener Date: Sat, 27 Feb 2021 12:38:30 +0100 Subject: [PATCH 174/255] Update de-help.html MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Arbeitsfläche -> Arbeitsbereich --- web/kiri/lang/de-help.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/kiri/lang/de-help.html b/web/kiri/lang/de-help.html index 38587cb3..a775fbcb 100644 --- a/web/kiri/lang/de-help.html +++ b/web/kiri/lang/de-help.html @@ -55,7 +55,7 @@
  • Im Einrichtungs-Menü wählst Du Geräte und Arbeitsmodus
  • preferences allow interface and mode-specific settings
  • Du kannst Geräte-Konfigurationen anpassen, wenn Du die Standard-Einstellungen verändern willst
  • -
  • Öffne Dateien importiere Teile auf die Arbeitsfläche
  • +
  • Öffne Dateien importiere Teile in den Arbeitsbereich
  • use the right-side profile menus to customize slicing parameters
  • Mit Slice siehst du, wie die Parameter sich auf Objekte auswirken
  • Vorschau berechnet Pfade (Maschinen-Anweisungen) aus den gesliceten Objekten
  • @@ -157,7 +157,7 @@ Weitere Optionen

    Im button> NutzerMenü open rechts, kannst Du die Funktion - Export verwenden, um eine Kopie Deiner Geräte Profile und (optional) Deiner Arbeitsfläche + Export verwenden, um eine Kopie Deiner Geräte Profile und (optional) Deines Arbeitsbereichs herunterzuladen. Mit dieser Datei kannst Du jederzeit Deine komplette Arbeitsumgebung bei Kiri:Moto wieder herstellen. Du kannst sie auch mit anderen Teilen, zum Beispiel um die Entwickler oder andere Nutzer bei der Fehlersuche zu unterstützen.

    From 391ebe1795d2ae5ea8cf8a7606dbebd07a371094 Mon Sep 17 00:00:00 2001 From: Harald Wagener Date: Sat, 27 Feb 2021 13:15:46 +0100 Subject: [PATCH 175/255] Create de-de.js First go at translating. FDM only. --- web/kiri/lang/de-de.js | 641 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 641 insertions(+) create mode 100644 web/kiri/lang/de-de.js diff --git a/web/kiri/lang/de-de.js b/web/kiri/lang/de-de.js new file mode 100644 index 00000000..21f079a5 --- /dev/null +++ b/web/kiri/lang/de-de.js @@ -0,0 +1,641 @@ +// english. other language maps will defer to english +// map for any missing key/value pairs +kiri.lang['de'] = +kiri.lang['de-de'] = { + // common keys and menus + animate: "Animieren", // CAM animate button + arrange: "Anordnen", // layout workspace objects + axis: "Achse", // left object scale pop menu + clear: "alles entfernen", // clear workspace (remove all objects) + copy: "Kopieren", + delete: "Löschen", + detail: "Details", + done: "Fertig", + enable: "Aktivieren", + export: "Export", + files: "Dateien", + help: "Hilfe", + ghost: "Geist", // left render pop menu (wireframe) + hide: "Verbergen", // left render pop menu (invisible) + home: "home", + import: "Import", + language: "Sprache", + machine: "Maschine", // device or machine + metric: "Metrisch", + name: "Name", + prefs: "Einstellungen", // left menu "preferences" + preview: "Vorschau", + recent: "Letzte Objekte", + render: "Rendern", // left render pop menu + reset: "Zurücksetzen", + rotate: "Rotieren", // left rotate pop menu + save: "Speichern", + scale: "Skalieren", // left object scale pop menu + setup: "Einrichtung", + settings: "Einstellungen", + size: "Größe", + solid: "Undurchsichtig", // view type pop menu + tool: "Werkzeug", + tools: "Werkzeuge", // CAM tool menu button + top: "Oben", + type: "Typ", // CAM tool type + version: "Version", + view: "Ansicht", // left view pop menu + wire: "Drahtansicht", // left render pop menu + + acct_xpo: ["make a backup of your device","and device profiles with the","option to include workspace","objects and positions"], + acct_xpo: ["Lege ein Backup Deiner Geräte","und Geräte-Profile an, mit der","Option, den Arbeitsbereich und","mit Objekten und Anordnung zu speichern"], + + // RIGHT-CLICK CONTEXT MENU + rc_clws: "Arbeitsbereich freiräumen", + rc_xpws: "Arbeitsbereich exportieren", + rc_lafl: "Auf das Bett", + rc_mirr: "Spiegeln", + rc_dupl: "Duplizieren", + rc_xstl: "Als STL exportieren", + + // DEVICE MENU and related dialogs + dm_sldt: "Wähle einen Geräte-Typ aus", + dm_stdd: "Vordefinierte Geräte", + dm_mydd: "Meine Geräte", + dm_seld: "Ausgweähltes Gerät", + dm_rcnt: "Letzte Dateien", + dm_savs: "Gespeicherte Voreinstellungen", + dm_appp: "Anwendungseinsetllungen", + + // CAM Tool Dialog + td_tyem: "end", // end mill + td_tybm: "ball", // ball mill + td_tytm: "taper", // taper mill + td_tonm: "tool #", + td_shft: "shaft", // endmill shaft specs + td_flut: "flute", // endmill flute specs + td_tapr: "taper", // endmill taper specs + + // DEVICE dialog groups + dv_gr_dev: "Gerät", + dv_gr_ext: "Extruder", + dv_gr_out: "Output", + dv_gr_gco: "GCode Macros", + + // DEVICE dialog (_s = label, _l = hover help) + dv_name_s: "Name", + dv_name_l: "Geräte-Name", + dv_fila_s: "Filament", + dv_fila_l: "Durchmesser in mm", + dv_nozl_s: "Düse", + dv_nozl_l: "Durchmesser in mm", + dv_bedw_s: "Breite", + dv_bedw_l: "Maßeinheiten des Arbeitsbereichs", + dv_bedd_s: "Tiefe", + dv_bedd_l: "Maßeinheiten der Arbeitsfläche", + dv_bedh_s: "Höhe", + dv_bedh_l: ["Maximale Objekthöhe","in Maßeinheiten der Arbeitsfläche"], + dv_spmx_s: "Spindel-Maximum", + dv_spmx_l: ["Maximale Umdrehungen pro Minute der Spindel","0 zum deaktivieren"], + dv_xtab_s: "Absolute Positionierung", + dv_xtab_l: "Filament wird mit absoluter Positionierung extrudiert", + dv_orgc_s: "Nullpunkt in der Mitte", + dv_orgc_l: "Nullpunkt des Druckbetts in der Mitte", + // dv_orgt_s: "origin top", + // dv_orgt_l: "part z origin top", + dv_bedc_s: "Rundes Druckbett", + dv_bedc_l: "Der Druckbereich des Gerätes ist rund", + dv_belt_s: "Riemen-Druckbett", + dv_belt_l: "Für bewegliche Druckbetten", + dv_fanp_s: "Lüfter-Einstellung", + dv_fanp_l: "Wie stark der Lüfter eingestellt sein soll", + dv_prog_s: "Fortschrittsanzeige", + dv_prog_l: "Wenn für jedes % der Fertigstellung eine Nachicht angezeigt werden soll", + dv_layr_s: "Ebene", + dv_layr_l: ["Ausgabe bei jeder","neuen Ebene"], + dv_tksp_s: "Befehls-Trenner", + dv_tksp_l: ["Füge ein Leerzeichen ein bei","GCode-Achsen-Befehlen","G0X0Y0X0","oder","G0 X0 Y0 Z0"], + dv_strc_s: "Kommentare entfernen", + dv_strc_l: ["Kommentare aus GCode entfernen","Kommentare beginnen mit ;"], + dv_fext_s: "Datei-Erweiterung", + dv_fext_l: "Datei-Erweiterung", + dv_dwll_s: "dwell", + dv_dwll_l: "gcode dwell script", + dv_tool_s: "Werkzeg-Wechel", + dv_tool_l: "Skript zum Werkzegwechsel", + dv_sspd_s: "Spindelgeschwindigkeit", + dv_sspd_l: "Einstellung der Spindelgeschwindigkeit", + dv_paus_s: "Pause", + dv_paus_l: "Skript zum Ausführen bei einer Pause", + dv_head_s: "Anfang", + dv_head_l: "Skript für den Anfang einer GCode-Datei", + dv_foot_s: "Ende", + dv_foot_l: "Skript für das Ende einer GCode-Datei", + dv_lzon_s: "Laser an", + dv_lzon_l: "Skript, um den Laser einzuschalten", + dv_lzof_s: "Laser aus", + dv_lzof_l: "Skript, um den Laser auszuschalten", + dv_exts_s: "Auswhälen", + dv_exts_l: "GCode, um diesen Extruder auszuwählen", + dv_dext_s: "Abwählen", + dv_dext_l: "GCode, bevor ein anderer Extruder ausgewählt wird", + dv_extd_s: "Deaktivieren", + dv_extd_l: "GCode, um diesen Extruder zu deaktivieren", + dv_exox_s: "X-Offset", + dv_exox_l: "X-Offset der Düse", + dv_exoy_s: "Y-Offset", + dv_exoy_l: "Y-Offset der Düse", + + // MODE + mo_menu: "Arbeits-Modus", + mo_fdmp: "FDM-Druck", + mo_slap: "SLA-Druck", + mo_lazr: "Laser-Cutting", + mo_cncm: "CNC-Fräsen", + + // SETUP + su_menu: "setup", + su_devi: "Geräte", + su_tool: "Werkzeuge", + su_locl: "Lokal", + su_xprt: "Export", + su_help: "Hilfe", + + // LOAD + fe_menu: "Datei", + fn_recn: "Letzte", + fn_impo: "Import", + + // FUNCTION + fn_menu: "Modus", + fn_arra: "Anordnen", + fn_slic: "Slice", + fn_prev: "Vorschau", + fn_expo: "Export", + + // VIEW + vu_menu: "Ansicht", + vu_home: "Standard", + vu_rset: "Zurücksetzen", + vu_sptp: "Oben", + vu_spfr: "Vorn", + vu_splt: "Links", + vu_sprt: "Ansicht", + + // WORKSPACE + ws_menu: "Ansicht", + ws_save: "Speichern", + ws_cler: "Leeren", + + // OPTIONS + op_menu: "interface", + op_disp: "Anzeige", + op_xprt_s: "Fortgeschritten", + op_xprt_l: "weitere Einstellungen", + op_decl_s: "decals", + op_decl_l: "show device decals and logos", + op_dang_s: "Experimentell", + op_dang_l: "Zeige experimentelle Parameter", + op_hopo_s: "hover pop", + op_hopo_l: ["enable menu hover","to activate"], + op_dark_s: "Dunkler Modus", + op_dark_l: "Dunkles Interface", + op_comp_s: "Kompakt", + op_comp_l: ["Kompakte Ansicht","Besser für kleine Bildschirme","und Tablets"], + op_shor_s: "Nullpunkt anzeigen", + op_shor_l: "Zeige den Nullpunkt des Gerätes oder des Prozesses", + op_shru_s: "Lineal einblenden", + op_shru_l: ["Zeige Lineale mit Maßen","auf den Hauptachsen"], + op_sped_s: "Geschwindigkeiten einblenden", + op_sped_l: ["Zeige Legende für Farben und Geschwindigkeiten","in der Vorschau"], + op_auto_s: "Automatische Anordnung", + op_auto_l: ["Ordne automatisch an","wenn neue Objekte hinzugefügt werden"], + op_free_s: "Freie Anordnung", + op_free_l: ["Erlaube Freie Anordnung von Objekten","Keine Auswirkung im Laser-Cutting Arbeitsmodus"], + op_spcr_s: "Abstand", + op_spcr_l: ["Abstand zwischen Objekten","bei automatischer Anordnung","in Maßeinheiten der Arbeitsfläche"], + op_invr_s: "Zoom Umkehren", + op_invr_l: ["Kehre die Richtung beim Mausrad-","Zoomen um"], + op_save_s: "Automatisch speichern", + op_save_l: ["Behalte Objekte im Arbeitsbereich","wenn die Anwendung neu geladen wird"], + op_line_s: "Darstellungs-Typ", + op_line_l: ["Wie Linien bei der Darstellung der Pfade gezeichnet werden","Beeinflußt 3D-Performance","Pfad: 3D (beste)","Flach: 2d (gut)","Linie = 1d (schnell)"], + op_unit_s: "Maßeinheiten", + op_unit_l: ["die Maßeinheit des Arbeitsbereich wirkt sich auf die Darstellung von ","Geschwindigkeiten und Entfernungen aus"], + op_anim_s: "Animieren", + op_anim_l: ["Dichte des Netzgitters beim Animieren","Je höher, desto dichter","benötigt mehr Speicher","und ist langsamer"], + + lo_menu: "Anordnung", + + pt_menu: "Objekte", + pt_deci_s: "Deizimierung", + pt_deci_l: ["Punktdezimierung","während des Imports. Für schnelleres Slicen","und weniger Speicherverbrauch"], + pt_qual_s: "Qualität", + pt_qual_l: ["Detailstufe beim","Slicen","geringer ist schneller"], + pt_heal_s: "Mesh reparieren", + pt_heal_l: ["Versuche","defekte Meshes zu reparieren","wirkt sich auf die Verarbeitungszeit us"], + + xp_menu: "Export", + + // SETTINGS + se_menu: "Profil", + se_load: "Laden", + se_save: "Speichern", + + // FDM SLICING + sl_menu: "Schichten", + sl_lahi_s: "Höhe", + sl_lahi_l: ["Höhe jeder Schicht","Schichthöhe in mm"], + ad_minl_s: "Mindesthöhe", + ad_minl_l: ["Mindesthöhe für adaptive Schichthöhe","in mm","Darf nicht null sein"], + sl_ltop_s: "top layers", + sl_ltop_l: ["number of solid layers","to enforce at the","top of the print"], + sl_lsld_s: "solid layers", + sl_lsld_l: ["solid fill areas computed","from layer deltas. see","layer pop menu"], + sl_lbot_s: "base layers", + sl_lbot_l: ["Anzahl der soliden Schichten","um die Unterseite des","Drucks zu verstärken"], + ad_adap_s: "Adaptive Höhe", + ad_adap_l: ["Verwende adaptive Schichthöhe","mit 'Maximale Höhe' als Maximum","und 'Mindesthöhe' als Minimum"], + + // FDM SHELLS + sl_shel_s: "Anzahl Außenwände", + sl_shel_l: ["Anzahl der äußeren","Wände, die erzeugt werden sollen"], + sl_ordr_s: "Druckreihenfolge der Wände", + sl_ordr_l: ["In welcher Reihenfolge die Wände gedruckt werden","innen nach aussen","oder aussen nach innen","wirkt sich auf die Oberflächenqualität aus"], + sl_strt_s: "Start der Ebene", + sl_strt_l: ["Startpunkt der Ebene","Letzte = Ende der letzten Ebene ","Mitte = Zur Mitte des Objekts","Nullpunkt = Zum Nullpunkt des Gerätes"], + ad_thin_s: "Dünne Wände", + ad_thin_l: ["Finde und fülle schmale Lücken","zwischen Außenwänden"], + + // FDM FILL + fi_menu: "Füllmaterial", + fi_type: "Typ", + fi_pcnt_s: "Füll-Dichte", + fi_pcnt_l: ["Füll-Dichte ","0.0 - 1.0"], + fi_angl_s: "Startwinkel für volle Füllung", + fi_angl_l: ["Startwinkel in Grad","90 Grad werden ","bei jeder folgender Schicht dazugerechnet","Wirkt sich nur auf vollgefüllte Schichten aus."], + fi_over_s: "Schicht-Überlappung", + fi_over_l: ["Überlappung von Schichten und Füllung","als Anteil des Düsen-Durchmessers","0.0 - 1.0"], + // fi_rate_s: "print speed", + fi_rate_l: ["Druckgeschwindigkeit für Füllmaterial","Auf 0 setzen, um die Standard-","Druckgeschwindigkeit zu verwenden"], + + // FDM FIRST LAYER + fl_menu: "Erste Schicht", + fl_lahi_s: "Schichthöhe", + fl_lahi_l: ["Höhe der ersten Schicht","in in mm","sollte >= der Standard-Schichthöhe sein"], + fl_rate_s: "Wand-Geschwindigkeit", + fl_rate_l: ["Maximalgeschwindigkeit beim Drucken von Wänden","in mm / min"], + fl_frat_s: "Füll-Geschwindikeit", + fl_frat_l: ["Maximalgeschwindikeit beim Drucken von Füllung","in mm / min"], + fl_mult_s: "Extrusions-Faktor", + fl_mult_l: ["Exktrusions-Faktor","0.0 - 2.0"], + fl_sfac_s: "Breiten-Faktor", + fl_sfac_l: ["Multipliziert mit dem Düsenfaktor","beeinflußt die Breite der Drucklinien"], + fl_skrt_s: "Anzahl der Skirt-Linien", + fl_skrt_l: ["Wieviele Linien um die erste Schicht","herum generiert werden sollen"], + fl_skro_s: "Skirt-Abstand", + fl_skro_l: ["Abstand des Skirts vom Objekt","in mm"], + fl_nozl_s: "Drucktemperatur", + fl_nozl_l: ["in Grad Celsius","Standard-Einstellung wird verwendet","wenn auf 0 gestellt"], + fl_bedd_s: "Betttemperatur", + fl_bedd_l: ["in Grad Celsius","Standard-Einstellung wird verwendet","when auf 0 gestellt"], + fr_spac_s: "Raft Abstand", + fr_spac_l: ["Zusätzlicher Abstand","zwischen erster Schicht und Raft","in mm"], + fr_nabl_s: "Raft verwenden", + fr_nabl_l: ["Erzeuge ein Raft unter dem","Objekt für bessere Betthaftung","verwendet Skirt-Abstand und","Deaktiviert die Erzeugung eines Skirt"], + + // FDM BELT ONLY + fl_zoff_s: "belt offset", + fl_zoff_l: ["height offset from belt","of lowest extrusion","in millimeters"], + fl_brim_s: "Größe des Brim", + fl_brim_l: ["Brim am Fuß des Objekts erzeugen","Größe in mm","0 um zu deaktivieren"], + fl_brmn_s: "Brim-Auslöser", + fl_brmn_l: ["Erzeuge nur Brim, wenn die Fläche","auf dem Gurt kürzer ist als dieser Wert","Angegeben in mm","0 = Immer"], + fl_bled_s: "Objekt verankern", + fl_bled_l: ["Objekt mit dem Gurt verankern","zu Beginn des Drucks","in mm"], + + // FDM SUPPORT + sp_menu: "Stützstrukturen", + sp_detect: "Analysieren", + sp_dens_s: "Dichte", + sp_dens_l: ["Anteil 0.0 - 1.0","empfohlen 0.15","0 zum deaktivieren"], + sp_size_s: "Breite der Säule", + sp_size_l: ["Breite der Säule","in mm"], + sp_offs_s: "Abstand", + sp_offs_l: ["Abstand vom Objekt","in mm"], + sp_gaps_s: "Schicht-Abstand", + sp_gaps_l: ["Anzahl der Schichten","zwischen Stützstruktur und Objekt"], + sp_span_s: "Maximale Spannbreite", + sp_span_l: ["Für Spannen über dieser Breite","werden Stützstrukturen erzeugt","in mm"], + sp_angl_s: "Maximaler Winkel", + sp_angl_l: ["Für Überhänge über diesem Winkel","werden Stützstrukturen erzeugt"], + sp_area_s: "Mindestfläche", + sp_area_l: ["Mindestfläche für","Eine Stützsäule","in mm"], + sp_xpnd_s: "Ausdehung", + sp_xpnd_l: ["Dehne die Stützstruktur","über die Objekt-Grenzen aus","in mm"], + sp_nozl_s: "Extruder", + sp_nozl_l: ["In Geräten mit mehreren Extrudern","welcher Extruder wird für","Stützmaterial verwendet"], + sp_auto_s: "Automatisch", + sp_auto_l: ["Erzeuge Stützstrukturen automatisch","beim Slicen","Stützstruktuen werden erst","Nach dem Slicen angezeigt"], + + // LASER SLICING + ls_offs_s: "Abstand", + ls_offs_l: ["Anpassung for Strahlbreite","in millimeters"], + ls_lahi_s: "Höhe", + ls_lahi_l: ["Schichthöhe","in mm","0 = auto/erkennen"], + ls_lahm_s: "min", + ls_lahm_l: ["Minimale Schichthöhe","Autoslices unter dieser Höhe","werden zusammengeführt","in millimeters"], + ls_sngl_s: "Einfach", + ls_sngl_l: ["Nur einen Slice bei","angegebener Schichthöhe ausführen"], + + // CNC COMMON terms + cc_tool: "Werkzeug", + cc_offs_s: "offset", + cc_offs_l: ["offset tool center","from chosen path"], + cc_spnd_s: "spindle rpm", + cc_spnd_l: ["spindle speed in","revolutions / minute"], + cc_sovr_s: "step over", + cc_sovr_l: ["as a fraction of","tool diameter"], + cc_sdwn_s: "step down", + cc_sdwn_l: ["step down depth","for each pass","in workspace units","0 to disable"], + cc_feed_s: "feed rate", + cc_feed_l: ["max cutting speed in","workspace units / minute"], + cc_plng_s: "plunge rate", + cc_plng_l: ["max z axis speed in","workspace units / minute"], + cc_sngl_s: "select lines only", + cc_sngl_l: ["select only single edges","instead of connected polylines"], + + // CNC COMMON + cc_menu: "limits", + cc_flip: "flip", + cc_rapd_s: "xy feed", + cc_rapd_l: ["max xy moves feedrate","in workspace units / minute"], + cc_rzpd_s: "z feed", + cc_rzpd_l: ["max z moves feedrate","in workspace units / minute"], + + cc_loff_s: "offset", + cc_loff_l: ["distance from stock face","for leveling pass","in workspace units"], + + // CNC ROUGHING + cr_menu: "rough", + cr_lsto_s: "leave stock", + cr_lsto_l: ["horizontal offset from vertical faces","stock to leave for finishing pass","in workspace units"], + cr_ease_s: "ease down", + cr_ease_l: ["plunge cuts will","spiral down or ease","along a linear path"], + cr_clrt_s: "clear top", + cr_clrt_l: ["run a clearing pass over","the bounding area of the part","at z = 0"], + cr_clrp_s: "clear voids", + cr_clrp_l: ["mill out through pockets","instead of just the outline"], + cr_clrf_s: "clear faces", + cr_clrf_l: ["interpolate step down to","clear any detected flat areas"], + cr_olin_s: "inside only", + cr_olin_l: ["limit cutting to","inside part boundaries"], + + // CNC OUTLINE + co_menu: "outline", + co_dogb_s: "dogbones", + co_dogb_l: ["insert dogbone cuts","into inside corners"], + co_wide_s: "wide cutout", + co_wide_l: ["widen outside cutout paths","for deep cuts in hard material"], + co_olin_s: "inside only", + co_olin_l: ["limit cutting to","inside part boundaries"], + co_olot_s: "outside only", + co_olot_l: ["limit cutting to","exterior part boundaries","which can be thought of","as the shadow outline"], + co_omit_s: "omit through", + co_omit_l: "eliminate thru holes", + co_olen_s: "enable", + co_olen_l: "enabled outline cutting", + + // CNC CONTOUR + cn_menu: "contour", + cf_angl_s: "max angle", + cf_angl_l: ["angles greater than this","are considered vertical"], + cf_curv_s: "curves only", + cf_curv_l: ["limit linear cleanup","to curved surfaces"], + cf_olin_s: "inside only", + cf_olin_l: ["limit cutting to","inside part boundaries"], + cf_linx_s: "enable y pass", + cf_linx_l: "linear y-axis finishing", + cf_liny_s: "enable x pass", + cf_liny_l: "linear x-axis finishing", + + // CNC TRACE + cu_menu: "trace", + cu_type_s: "type", + cu_type_l: ["follow = tool tip follows line","right or left = tool tip","follows line offset by tool radius"], + + // CNC DRILLING + cd_menu: "drill", + cd_axis: "axis", + cd_points: "points", + cd_plpr_s: "plunge per", + cd_plpr_l: ["max plunge between","dwell periods","in workspace units","0 to disable"], + cd_dwll_s: "dwell time", + cd_dwll_l: ["dwell time","between plunges in","in milliseconds"], + cd_lift_s: "drill lift", + cd_lift_l: ["lift between plunges","after dwell period","in workspace units","0 to disable"], + cd_regi_s: "register", + cd_regi_l: ["drill registration holes","for double-sided parts","independent of enable","drilling but uses same","tool and settings"], + + // CNC CUTOUT TABS + ct_menu: "tabs", + ct_angl_s: "angle", + ct_angl_l: ["starting angle for tab spacing","in degrees (0-360)"], + ct_numb_s: "count", + ct_numb_l: ["number of tabs to use","will be spaced evenly","around the part"], + ct_wdth_s: "width", + ct_wdth_l: "width in workspace units", + ct_hght_s: "height", + ct_hght_l: "height in workspace units", + ct_dpth_s: "depth", + ct_dpth_l: ["distance in workspace units","that the tab projects from","the part surface"], + ct_midl_s: "midline", + ct_midl_l: ["use midline of tab","instead of z bottom","for double-sided work"], + ct_nabl_s: "auto", + ct_nabl_l: ["auto generate radial tabs","projected from part center","using count and angle offset"], + + // OUTPUT + ou_menu: "output", + + // LASER KNIFE + dk_menu: "knife", + dk_dpth_s: "cut depth", + dk_dpth_l: ["final cut depth","in millimeters"], + dk_pass_s: "cut passes", + dk_pass_l: ["number of passes","down to cut depth"], + dk_offs_s: "tip offset", + dk_offs_l: ["distance from blade tip","to center of tool","in millimeters"], + + // OUTPUT LASER + ou_spac_s: "spacing", + ou_spac_l: ["distance between layer output","in millimeters"], + ou_scal_s: "scaling", + ou_scal_l: "multiplier (0.1 to 100)", + ou_powr_s: "power", + ou_powr_l: ["0 - 100","represents %"], + ou_sped_s: "speed", + ou_sped_l: "millimeters / minute", + ou_mrgd_s: "merged", + ou_mrgd_l: ["merge all layers using","color coding to denote","stacking depth"], + ou_grpd_s: "grouped", + ou_grpd_l: ["retain each layer as","a unified grouping","instead of separated","polygons"], + ou_layr_s: "layer order", + ou_layr_l: ["output layer order","from top right to","bottom left"], + ou_layo_s: "layer color", + ou_layo_l: ["output layer colors","for each z index","overridden by merged"], + ou_drkn_s: "drag knife", + ou_drkn_l: ["enable drag knife","output in gcode","cut radii are added","to corners with","cut down passes"], + + // OUTPUT FDM + ou_nozl_s: "Drucktemperatur", + ou_nozl_l: "In Grad Celsius", + ou_bedd_s: "Betttemperatur", + ou_bedd_l: "In Grad Celsius", + ou_feed_s: "Druckgewschwindigkeit", + ou_feed_l: ["Maximale Druckgeschwindigkeit","mm / min"], + ou_fini_s: "Außengeschwindigkeit", + ou_fini_l: ["Geschwindigkeit für Außenwände","mm / min"], + ou_move_s: "Bewegungsgeschwnidgkeit", + ou_move_l: ["Geschwndigkeit, wenn nicht gedruckt wird ","mm / min","0 = aktiviere G0 Befehle"], + ou_shml_s: "Wand-Faktor", + ou_flml_s: "Voll-Füll-Faktor", + ou_spml_s: "Füll-Material-Faktor", + ou_exml_l: ["Extrusions-Multiplikator","0.0 - 2.0"], + ou_fans_s: "Geschwindigkeit der Bauteilkühlung", + ou_fans_l: "0 - 255", + + // OUTPUT CAM + ou_toll_s: "tolerance", + ou_toll_l: ["surface precision","in workspace units","lower is slower and","uses more memory","0 = automatic based","on animate preference"], + ou_zanc_s: "z anchor", + ou_zanc_l: ["controls the position of the part","when stock Z exceeds part Z"], + ou_ztof_s: "z offset", + ou_ztof_l: ["offset z anchor","in workspace units","has no effect when","anchor is middle"], + ou_zbot_s: "z bottom", + ou_zbot_l: ["offset from part bottom","to limit cutting depth","in workspace units"], + ou_zclr_s: "z clearance", + ou_zclr_l: ["safe travel offset","from top of part","in workspace units"], + ou_ztru_s: "z thru", + ou_ztru_l: ["extend cutout pass down","in workspace units"], + ou_conv_s: "conventional", + ou_conv_l: ["milling direction","uncheck for 'climb'"], + ou_depf_s: "depth first", + ou_depf_l: ["optimize pocket cuts","with depth priority"], + + // CAM STOCK + cs_menu: "stock", + cs_wdth_s: "width", + cs_wdth_l: ["width (x) in workspace units","0 defaults to part size"], + cs_dpth_s: "depth", + cs_dpth_l: ["depth (y) in workspace units","0 defaults to part size"], + cs_hght_s: "height", + cs_hght_l: ["height (z) in workspace units","0 defaults to part size"], + cs_offs_s: "offset", + cs_offs_l: ["use width, depth, height","as offsets from max","part size on platform"], + cs_clip_s: "clip to", + cs_clip_l: ["rough and outline","clip cutting paths","to defined stock"], + cs_offe_s: "enable", + cs_offe_l: "enable milling stock", + + // ORIGIN (CAM & LASER) + or_bnds_s: "origin bounds", + or_bnds_l: ["origin is relative to","boundary of all objects"], + or_cntr_s: "origin center", + or_cntr_l: "origin is referenced from the center", + or_topp_s: "origin top", + or_topp_l: "origin is references from the top of objects", + + // FDM ADVANCED + ad_menu: "Fortgeschritten", + ad_rdst_s: "Einzugslänge, + ad_rdst_l: ["Wie weit das Filament eingezogen werden soll","bei langen Bewegungen (in mm)"], + ad_rrat_s: "Einzugsgeschwindigkeit, + ad_rrat_l: ["Geschwindigkeit des Filamenteinzugs","in mm/s"], + ad_rdwl_s: "Vorschub-Pause", + ad_wpln_s: "Einzugs-Bewegung", + ad_wpln_l: ["Bewegung ohne Druck","nach Einzug","in millimeters"], + ad_rdwl_l: ["Zeitabstand zwischen","Bewegung und Vorschub nach Einzug ","in msec"], + ad_scst_s: "Außenwand-Coasting", + ad_scst_l: ["Welche Strecke am Ende einer","Außenwand nicht extrudiert wird","in mm"], + ad_msol_s: "Mindestfläche für vollständige Füllung", + ad_msol_l: ["Mindestfläche in mm^2 ","für vollständige Füllung","muß > 0.1 sein"], + ad_mins_s: "Mindestgeschwindigkeit", + ad_mins_l: ["Mindestgeschwindigkeit","für kurze Segmente"], + ad_spol_s: "Kurze Segmente", + ad_spol_l: ["Segmente die kürzer sind","werden mit","Mindestgeschwindigkeit gedruckt","in mm"], + ad_arct_s: "arc tolerance", + ad_arct_l: ["convert faceted lines to arcs","center point drift tolerance","when matching arc points","consider values around 0.15","in millimeters","0 to disable"], + ad_zhop_s: "Z Hop", + ad_zhop_l: ["Hebe Düse bei Einzug an","in mm","0 zum deaaktivieren"], + ad_abkl_s: "anti-backlash", + ad_abkl_l: ["Für schöneres Aussehen Flacher Oberflächen","verwende Micro-Bewegungen","um Backlash auszugleichen","in mm","0 zum deaktivieren","Wenn Deine Firmware M425 unterstützt","verwende das im Start-GCode und setze hier auf 0"], + ad_lret_s: "Einzug bei Ebenenwechsel", + ad_lret_l: ["Erzwinge Einzug","bei Ebenen wechseln"], + ad_play_s: "Ebenen glätten", + ad_play_l: ["glätte bis zu","dieser Anzahl Ebenen"], + ad_pspd_s: "Glätt-Geschwindigkeit", + ad_pspd_l: ["Glätt-Geschwindigkeit","in mm / min"], + + // CAM EXPERT + cx_fast_s: "skip shadow", + cx_fast_l: ["disable overhang detection","can be faster and use less","memory with complex models","but fails with overhangs","try enabling if slicing","hangs during shadowing"], + + // FDM GCODE + ag_menu: "GCode", + ag_nozl_s: "Düse", + ag_nozl_l: "Wählt Düse oder Druckkopf aus", + ag_paws_s: "Pause bei Ebenen", + ag_paws_l: ["Liste von Ebenen (kommasepariert","vor denen pausiert werden soll"], + ag_loop_s: "Schichten wiederholen", + ag_loop_l: ["Schichten die wiederholt werden sollen, im Format ","erste-letzte-anzahl,erste-letzte-anzahl,...","omitted count = 1"], + + // SLA MENU + sa_menu: "Slicen", + sa_lahe_s: "Schichthöhe", + sa_lahe_l: ["Schichthöhe","in mm"], + sa_shel_s: "Aushöhlen", + sa_shel_l: ["Wanddick mm","verwene Mehrfaches der Schichthöhe","setze 0 zum deaktivieren"], + sa_otop_s: "oben offen", + sa_otop_l: ["Wenn Aushöhlen aktiviert ist","bleibt das Objekt oben offen"], + sa_obas_s: "unten offen", + sa_obas_l: ["Wenn Aushöhlen aktiviert ist","bleibt das Objekt unten offen","deaktiviert, wenn Stützstrukturen verwendet werden"], + + sa_layr_m: "layers", + sa_lton_s: "light on time", + sa_lton_l: ["layer light on","time in seconds"], + sa_ltof_s: "light off time", + sa_ltof_l: ["layer light off","time in seconds"], + sa_pldi_s: "peel distance", + sa_pldi_l: ["peel distance","in millimeters"], + sa_pllr_s: "peel lift rate", + sa_pllr_l: ["peel lift speed","in mm/sec"], + sa_pldr_s: "peel drop rate", + sa_pldr_l: ["peel drop speed","in mm/sec"], + + sa_base_m: "base", + sa_balc_s: "layer count", + sa_balc_l: ["number of","base layers"], + sa_bltn_l: ["base layer light on","time in seconds"], + sa_bltf_l: ["base layer light off","time in seconds"], + + sa_infl_m: "Füllstrukturen", + sa_ifdn_s: "Dichte", + sa_ifdn_l: ["percent infill","requires shell","0 = disabled","valid 0.0 - 1.0"], + sa_iflw_s: "line width", + sa_iflw_l: ["hatch line width","in millimeters"], + + sa_supp_m: "support", + sa_slyr_s: "base layers", + sa_slyr_l: ["base support layers","value range 0-10"], + sa_slgp_s: "gap layers", + sa_slgp_l: ["number of layers between","raft and bottom of object"], + sa_sldn_s: "density", + sa_sldn_l: ["used to compute the","number of support pillars","0.0-1.0 (0 = disable)"], + sa_slsz_s: "size", + sa_slsz_l: ["max size of a","support pillar","in millimeters"], + sa_slpt_s: "points", + sa_slpt_l: ["number of points in","each support pillar","in millimeters"], + sl_slen_l: "enable supports", + + sa_outp_m: "output", + sa_opzo_s: "z offset", + sa_opzo_l: ["z layer offset","almost always 0.0","0.0-1.0 in millimeters"], + sa_opaa_s: "anti alias", + sa_opaa_l: ["enable anti-aliasing","produces larger files","can blur details"] +}; From 40eb2546ce78f9788574a108e7fff62d3e05e89d Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 27 Feb 2021 11:27:46 -0500 Subject: [PATCH 176/255] update french. add german. update css to allow for longer strings --- src/kiri/init.js | 15 +- web/kiri/index.css | 6 +- web/kiri/index.html | 4 +- web/kiri/lang/de-de-help.html | 1 + web/kiri/lang/de-de.js | 32 +-- web/kiri/lang/de.js | 1 + web/kiri/lang/fr-fr-help.html | 2 +- web/kiri/lang/fr-fr.js | 1 + web/kiri/lang/fr-help.html | 187 ++++++++++++- web/kiri/lang/fr.js | 494 +++++++++++++++++----------------- 10 files changed, 472 insertions(+), 271 deletions(-) create mode 120000 web/kiri/lang/de-de-help.html create mode 120000 web/kiri/lang/de.js create mode 120000 web/kiri/lang/fr-fr.js mode change 120000 => 100644 web/kiri/lang/fr-help.html diff --git a/src/kiri/init.js b/src/kiri/init.js index 7cce2dfc..a89aa3c8 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -2044,6 +2044,14 @@ SDB.setItem('kiri-lang', 'da-dk'); API.space.reload(); }; + $('lset-de').onclick = function() { + SDB.setItem('kiri-lang', 'de-de'); + API.space.reload(); + }; + $('lset-fr').onclick = function() { + SDB.setItem('kiri-lang', 'fr-fr'); + API.space.reload(); + }; SPACE.addEventHandlers(self, [ 'keyup', keyUpHandler, @@ -2207,8 +2215,11 @@ // block standard browser context menu DOC.oncontextmenu = (event) => { - event.preventDefault(); - event.stopPropagation(); + if (event.target.tagName === 'CANVAS') { + event.preventDefault(); + event.stopPropagation(); + return false; + } }; SPACE.mouse.up((event, int) => { diff --git a/web/kiri/index.css b/web/kiri/index.css index 7dba4262..3c8c3fd7 100644 --- a/web/kiri/index.css +++ b/web/kiri/index.css @@ -441,7 +441,7 @@ th, tr, td, label { background-color: rgba(255,255,255,0.85); border: 1px solid rgba(0,0,0,0.1); border-radius: 3px; - width: 60px; + min-width: 60px; color: var(--fg-gray); } .pop-lcol > div:hover { @@ -527,7 +527,7 @@ th, tr, td, label { .txt-sel button, .btn-sel { background-color: #ccc; } -#pop-rotate .value, #pop-scale .value { +#pop-rotate input.value, #pop-scale input.value { width: 90%; } #pop-rotate label { @@ -997,7 +997,7 @@ th, tr, td, label { border-right: 0; } #help-tabs { - width: 550px; + width: 600px; height: 450px; transform: translateX(-1px); } diff --git a/web/kiri/index.html b/web/kiri/index.html index 0c144829..6f5d8e00 100644 --- a/web/kiri/index.html +++ b/web/kiri/index.html @@ -47,8 +47,10 @@
    -
    english
    danish
    +
    english
    +
    french
    +
    german
    diff --git a/web/kiri/lang/de-de-help.html b/web/kiri/lang/de-de-help.html new file mode 120000 index 00000000..8692fdc3 --- /dev/null +++ b/web/kiri/lang/de-de-help.html @@ -0,0 +1 @@ +de-help.html \ No newline at end of file diff --git a/web/kiri/lang/de-de.js b/web/kiri/lang/de-de.js index 21f079a5..0ae8022d 100644 --- a/web/kiri/lang/de-de.js +++ b/web/kiri/lang/de-de.js @@ -3,10 +3,10 @@ kiri.lang['de'] = kiri.lang['de-de'] = { // common keys and menus - animate: "Animieren", // CAM animate button - arrange: "Anordnen", // layout workspace objects - axis: "Achse", // left object scale pop menu - clear: "alles entfernen", // clear workspace (remove all objects) + animate: "Animieren", // CAM animate button + arrange: "Anordnen", // layout workspace objects + axis: "Achse", // left object scale pop menu + clear: "alles entfernen", // clear workspace (remove all objects) copy: "Kopieren", delete: "Löschen", detail: "Details", @@ -15,33 +15,33 @@ kiri.lang['de-de'] = { export: "Export", files: "Dateien", help: "Hilfe", - ghost: "Geist", // left render pop menu (wireframe) - hide: "Verbergen", // left render pop menu (invisible) + ghost: "Geist", // left render pop menu (wireframe) + hide: "Verbergen", // left render pop menu (invisible) home: "home", import: "Import", language: "Sprache", - machine: "Maschine", // device or machine + machine: "Maschine", // device or machine metric: "Metrisch", name: "Name", - prefs: "Einstellungen", // left menu "preferences" + prefs: "Einstellungen", // left menu "preferences" preview: "Vorschau", recent: "Letzte Objekte", - render: "Rendern", // left render pop menu + render: "Rendern", // left render pop menu reset: "Zurücksetzen", - rotate: "Rotieren", // left rotate pop menu + rotate: "Rotieren", // left rotate pop menu save: "Speichern", scale: "Skalieren", // left object scale pop menu setup: "Einrichtung", settings: "Einstellungen", size: "Größe", - solid: "Undurchsichtig", // view type pop menu + solid: "Undurchsichtig", // view type pop menu tool: "Werkzeug", tools: "Werkzeuge", // CAM tool menu button top: "Oben", - type: "Typ", // CAM tool type + type: "Typ", // CAM tool type version: "Version", - view: "Ansicht", // left view pop menu - wire: "Drahtansicht", // left render pop menu + view: "Ansicht", // left view pop menu + wire: "Drahtansicht", // left render pop menu acct_xpo: ["make a backup of your device","and device profiles with the","option to include workspace","objects and positions"], acct_xpo: ["Lege ein Backup Deiner Geräte","und Geräte-Profile an, mit der","Option, den Arbeitsbereich und","mit Objekten und Anordnung zu speichern"], @@ -543,9 +543,9 @@ kiri.lang['de-de'] = { // FDM ADVANCED ad_menu: "Fortgeschritten", - ad_rdst_s: "Einzugslänge, + ad_rdst_s: "Einzugslänge", ad_rdst_l: ["Wie weit das Filament eingezogen werden soll","bei langen Bewegungen (in mm)"], - ad_rrat_s: "Einzugsgeschwindigkeit, + ad_rrat_s: "Einzugsgeschwindigkeit", ad_rrat_l: ["Geschwindigkeit des Filamenteinzugs","in mm/s"], ad_rdwl_s: "Vorschub-Pause", ad_wpln_s: "Einzugs-Bewegung", diff --git a/web/kiri/lang/de.js b/web/kiri/lang/de.js new file mode 120000 index 00000000..bccb4c51 --- /dev/null +++ b/web/kiri/lang/de.js @@ -0,0 +1 @@ +de-de.js \ No newline at end of file diff --git a/web/kiri/lang/fr-fr-help.html b/web/kiri/lang/fr-fr-help.html index 881705c6..1cabd5c2 120000 --- a/web/kiri/lang/fr-fr-help.html +++ b/web/kiri/lang/fr-fr-help.html @@ -1 +1 @@ -en-help.html \ No newline at end of file +fr-help.html \ No newline at end of file diff --git a/web/kiri/lang/fr-fr.js b/web/kiri/lang/fr-fr.js new file mode 120000 index 00000000..b0fd9cf9 --- /dev/null +++ b/web/kiri/lang/fr-fr.js @@ -0,0 +1 @@ +fr.js \ No newline at end of file diff --git a/web/kiri/lang/fr-help.html b/web/kiri/lang/fr-help.html deleted file mode 120000 index 881705c6..00000000 --- a/web/kiri/lang/fr-help.html +++ /dev/null @@ -1 +0,0 @@ -en-help.html \ No newline at end of file diff --git a/web/kiri/lang/fr-help.html b/web/kiri/lang/fr-help.html new file mode 100644 index 00000000..1ba0c196 --- /dev/null +++ b/web/kiri/lang/fr-help.html @@ -0,0 +1,186 @@ +
    + +
    + + +
    + +
    + +
    +
    A propos
    +
    débuter
    +
    contrôles
    + +
    support
    +
    projet
    +
    + +
    +
    +
    +

    + Kiri:Moto est un logiciel de découpe unique, fonctionnant dans un navigateur, entièrement open source, qui + transforme les modèles 3d en instructions de machine pour des imprimantes 3D, des CNC, + et des graveurs laser. +


    + Le fait d'être basé sur un navigateur signifie que tout le processus de découpe a lieu dans le navigateur local, + et non dans le nuage. Vos données et modèles restent totalement privés. +


    + Cela signifie que Kiri se comporte comme une application native de votre ordinateur avec en plus + la sécurité de l'exécution dans le bac à sable de sécurité du navigateur. +


    + L'autre avantage de fonctionner à partir du web est que Kiri est toujours à jour. Les nouvelles + fonctionnalités, les corrections de bogues et les mises à jour sont fréquemment mises en place. Si vous souhaitez exécuter une ancienne + ou une version de développement de Kiri, sélectionnez cette version dans le menu utilisateur en haut à droite. +

    +
    +
    + Kiri vient de Kiri-e qui est l'art Japonais du découpage de papiers + Moto est un raccourci pour "Modeling Tool" (Outil de modélisation) +
    + +
    + Guide de démarrage rapide +
    +

    +

  • visionner The Definitive Video Guide to Kiri:Moto 2.5
  • +
  • le menu setup sélectionne le type de matériel et un appareil
  • +
  • les préférences permettent de régler l'interface et les caractéristiques de l'appareil
  • +
  • personnaliser un appareil si vous souhaitez modifier les paramètres par défaut
  • +
  • ouvre un fichier ou importe des pièces dans l'espace de travail
  • +
  • utiliser les menus de droite pour personnaliser les paramètres de découpage
  • +
  • découper les objets pour voir l'effet des paramètres
  • +
  • la prévisualisation calcule les données de cheminement des objets tranchés
  • +
  • l'exportation convertit les chemins d'accès aux fichiers GCode et SVG
  • +

    +
    +
    + Modes de fonctionnement +

    Chaque mode (FDM, CAM, Laser, SLA) a des caractéristiques et des paramètres différents. + Explorez les vidéos Youtube pour en savoir plus.

    +
    +
    + +
    about 3d printing
    +
    about cnc milling
    +
    about laser cutting
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Contrôles via le clavier
    ToucheAction
    Configuration
    Sélection de l'appareil
    CAM Sélection des outils
    Grid Local Devices
    Panneau des préférence
    Profils de travail
    Mode
    Organiser
    Découper
    Prévisualiser
    Animer
    Exporter
    Fichier
    Importer
    Récent
    Voir
    Home
    Top
    Avant
    Arrière
    Réinitialiser la vue
    Alterner les vues de côtés
    Focus (organiser)
    Couche (découper/prévisualiser)
    Objets
    Dupliquer
    Miroir
    Pivoter/tourner
    Supprimer
    Tounrer de 90°
    Tourner de 5°
    Déplacer de 5mm
    Tout sélectionner
    Aide
    Cette fenêtre
    +
    + + + + + + + + + + + + + + + + + +
    Contrôles via la souris
    ComboAction
    View
    moletteChanger de couche
    déplacerPan
    Pan
    Tourner
    Zoom
    Zoom
    déplacerPan
    Objets
    Aligner la face sur le plateau
    Aligner la face sur le plateau
    +
    +
    + +
    + Ressources + + Options complémentaires +

    + Dans le menu utilsateur en haut à droite, + utiliser l'option export pour créer unecopie téléchargeable des + profils du matériel et (optionellement) de l'espace de travail. Ce fichier pourra ensuite + être utilisé pour contrôler et rétablir un instantané de votre installation à tout moment. + Il peut également être partagé afin que les développeurs et autres utilisateurs puissent + reproduire votre environnement pour aider au débogage. +

    +
    + +
    + Open Source +

    + Kiri:Moto est totalement open-source. + Consultez la page du projet Github. Il existe des projets complémentaires, tant sur le plan matériel que logiciel. + Les nouveaux développeurs et les contributions au code sont les bienvenus à tout moment. La licence du code est celle du MIT. +


    + Toute donation est également bienvenue. +

    +
    Intégrations +

    Kiri:Moto est également intégré dans plusieurs autres applications web

    +
  • Onshape via son magasin d'Applications
  • +
  • Thingiverse en tant que native Thing Apps
  • +
  • SimplyPrint.io as the primary slicer under the covers
  • +
  • CAMLab est une branche d'une version antérieure de Kiri:Moto
  • +
    + +
    + +
    +
    diff --git a/web/kiri/lang/fr.js b/web/kiri/lang/fr.js index fa71d9b7..6deb82cb 100644 --- a/web/kiri/lang/fr.js +++ b/web/kiri/lang/fr.js @@ -4,9 +4,9 @@ kiri.lang['fr'] = kiri.lang['fr-fr'] = { // common keys and menus animate: "animer", // CAM animate button - arrange: "arranger", // layout workspace objects + arrange: "organiser", // layout workspace objects axis: "axe", // left object scale pop menu - clear: "débarrasser", // clear workspace (remove all objects) + clear: "effacer", // clear workspace (remove all objects) copy: "copier", delete: "supprimer", detail: "détail", @@ -43,10 +43,10 @@ kiri.lang['fr-fr'] = { view: "vue", // left view pop menu wire: "filaire", // left render pop menu - acct_xpo: ["faites un sauvegarde de votre machine","et des profils des machines avec","l'option d'inclure les","objets et positions d'environnement"], + acct_xpo: ["faites une sauvegarde de votre machine","et des profils des machines avec","l'option d'inclure les","objets et positions d'environnement"], // RIGHT-CLICK CONTEXT MENU - rc_clws: "débarrasser l'environnement", + rc_clws: "effacer l'environnement", rc_xpws: "exporter l'environnement", rc_lafl: "poser à plat", rc_mirr: "refléter", @@ -55,11 +55,11 @@ kiri.lang['fr-fr'] = { // DEVICE MENU and related dialogs dm_sldt: "sélectionner un genre de machine", - dm_stdd: "machines standard", + dm_stdd: "machines standards", dm_mydd: "mes machines", dm_seld: "machine sélectionnée", dm_rcnt: "fichiers récents", - dm_savs: "paramètres sauvegardé", + dm_savs: "paramètres sauvegardés", dm_appp: "Préférences d'Application", // CAM Tool Dialog @@ -78,264 +78,264 @@ kiri.lang['fr-fr'] = { dv_gr_gco: "gcode macros", // DEVICE dialog (_s = label, _l = hover help) - dv_name_s: "name", - dv_name_l: "device name", + dv_name_s: "nom", + dv_name_l: "nom du matériel", dv_fila_s: "filament", - dv_fila_l: "diameter in millimeters", - dv_nozl_s: "nozzle", - dv_nozl_l: "diameter in millimeters", - dv_bedw_s: "width", - dv_bedw_l: "workspace units", - dv_bedd_s: "depth", - dv_bedd_l: "workspace units", - dv_bedh_s: "height", - dv_bedh_l: ["max build height","in workspace units"], + dv_fila_l: "diamètre en millimètres", + dv_nozl_s: "buse", + dv_nozl_l: "diamètre en millimètres", + dv_bedw_s: "largeur", + dv_bedw_l: "unités de l'espace de travail", + dv_bedd_s: "profondeur", + dv_bedd_l: "unités de l'espace de travail", + dv_bedh_s: "hauteur", + dv_bedh_l: ["hauteur de construction maximale","en unités de l'espace de travail"], dv_spmx_s: "max spindle", dv_spmx_l: ["max spindle rpm speed","0 to disable"], - dv_xtab_s: "absolute positioning", - dv_xtab_l: "extrusion moves absolute", - dv_orgc_s: "origin center", - dv_orgc_l: "bed origin center", + dv_xtab_s: "positionnement absolu", + dv_xtab_l: "déplacements extrusion absolu", + dv_orgc_s: "origine au centre", + dv_orgc_l: "origin du plateau au centre", // dv_orgt_s: "origin top", // dv_orgt_l: "part z origin top", - dv_bedc_s: "circular bed", - dv_bedc_l: "device bed is circular", - dv_belt_s: "belt bed", - dv_belt_l: "continuous printing bed", - dv_fanp_s: "fan power", - dv_fanp_l: "set cooling fan power", - dv_prog_s: "progress", - dv_prog_l: "output on each % progress", - dv_layr_s: "layer", - dv_layr_l: ["output at each","layer change"], - dv_tksp_s: "token spacer", - dv_tksp_l: ["add a space between","gcode axis parameters","G0X0Y0X0","vs","G0 X0 Y0 Z0"], - dv_strc_s: "strip comments", - dv_strc_l: ["strip gcode comments","comments begin with ;"], - dv_fext_s: "file extension", - dv_fext_l: "file name extension", + dv_bedc_s: "plateau circulaire", + dv_bedc_l: "le plateau du matériel est circulaire", + dv_belt_s: "plateau tapis-roulant", + dv_belt_l: "plateau à impression continue", + dv_fanp_s: "refroidissement", + dv_fanp_l: "régler la puissance du ventilateur de refroidissement", + dv_prog_s: "progression", + dv_prog_l: "résultats de chaque % de progression", + dv_layr_s: "couche", + dv_layr_l: ["résultats de chaque","changement de couche"], + dv_tksp_s: "délimiteur d'instruction", + dv_tksp_l: ["ajouter un espace","entre les paramètres des axes","G0X0Y0X0","vs","G0 X0 Y0 Z0"], + dv_strc_s: "éliminer les commentaires", + dv_strc_l: ["éliminer les commentaires du gcode","commentaires débutent par ;"], + dv_fext_s: "extension de fichier", + dv_fext_l: "extension du nom de fichier", dv_dwll_s: "dwell", - dv_dwll_l: "gcode dwell script", - dv_tool_s: "tool change", - dv_tool_l: "tool change script", + dv_dwll_l: "script gcode dwell", + dv_tool_s: "changement d'outil", + dv_tool_l: "script de changement d'outil", dv_sspd_s: "spindle speed", dv_sspd_l: "set spindle speed", dv_paus_s: "pause", - dv_paus_l: "gcode pause script", + dv_paus_l: "script gcode de pause", dv_head_s: "header", - dv_head_l: "gcode header script", + dv_head_l: "script gcode de démarrage", dv_foot_s: "footer", - dv_foot_l: "gcode footer script", + dv_foot_l: "script gcode de fin", dv_lzon_s: "laser on", dv_lzon_l: "gcode laser on script", dv_lzof_s: "laser off", dv_lzof_l: "gcode laser off script", - dv_exts_s: "select", - dv_exts_l: "gcode run to enable this extruder", - dv_dext_s: "deselect", - dv_dext_l: "gcode run before enabling another extruder", - dv_extd_s: "deselect", - dv_extd_l: "gcode to deselect this extruder", - dv_exox_s: "offset x", - dv_exox_l: "nozzle offset x", - dv_exoy_s: "offset y", - dv_exoy_l: "nozzle offset y", + dv_exts_s: "sélectionner", + dv_exts_l: "gcode pour activer cet extrudeur", + dv_dext_s: "désélectionner", + dv_dext_l: "gcode à lancer avant d'activer un autre extrudeur", + dv_extd_s: "désélectionner", + dv_extd_l: "gcode pour désactiver cet extrudeur", + dv_exox_s: "décalage x", + dv_exox_l: "décalage de buse en x", + dv_exoy_s: "décalage y", + dv_exoy_l: "décalage de buse en y", // MODE mo_menu: "mode", - mo_fdmp: "FDM Print", - mo_slap: "SLA Print", - mo_lazr: "Laser Cut", - mo_cncm: "CNC Mill", + mo_fdmp: "Impression FDM", + mo_slap: "Impression SLA", + mo_lazr: "Découpe / gravure Laser", + mo_cncm: "Routeur CNC", // SETUP - su_menu: "setup", - su_devi: "Devices", - su_tool: "Tools", + su_menu: "installation", + su_devi: "Matériels", + su_tool: "Outils", su_locl: "Local", - su_xprt: "Export", - su_help: "Help", + su_xprt: "Exporter", + su_help: "Aide", // LOAD - fe_menu: "file", - fn_recn: "Recent", - fn_impo: "Import", + fe_menu: "fichier", + fn_recn: "Récent", + fn_impo: "Importer", // FUNCTION fn_menu: "action", - fn_arra: "Arrange", - fn_slic: "Slice", - fn_prev: "Preview", - fn_expo: "Export", + fn_arra: "Organiser", + fn_slic: "Découper", + fn_prev: "Prévisualiser", + fn_expo: "Exporter", // VIEW - vu_menu: "view", - vu_home: "Home", - vu_rset: "Reset", - vu_sptp: "Top", - vu_spfr: "Front", - vu_splt: "Left", - vu_sprt: "Right", + vu_menu: "vue", + vu_home: "Origine", + vu_rset: "RAZ", + vu_sptp: "Haut", + vu_spfr: "Avant", + vu_splt: "Gauche", + vu_sprt: "Droite", // WORKSPACE - ws_menu: "view", - ws_save: "Save", - ws_cler: "Clear", + ws_menu: "vue", + ws_save: "Sauvegarder", + ws_cler: "Effacer", // OPTIONS op_menu: "interface", - op_disp: "display", + op_disp: "affichage", op_xprt_s: "expert", - op_xprt_l: "show more settings options", - op_decl_s: "decals", - op_decl_l: "show device decals and logos", - op_dang_s: "experimental", - op_dang_l: "show experimental parameters", - op_hopo_s: "hover pop", - op_hopo_l: ["enable menu hover","to activate"], - op_dark_s: "dark mode", - op_dark_l: "dark mode interface", - op_comp_s: "compact ui", - op_comp_l: ["compact user interface","better for small screens","and tablets"], - op_shor_s: "show origin", - op_shor_l: "show device or process origin", - op_shru_s: "show rulers", - op_shru_l: ["show axes rulers","on major gridlines"], - op_sped_s: "show speeds", - op_sped_l: ["show speed to color bar","in preview mode"], - op_auto_s: "auto layout", - op_auto_l: ["automatically layout platform","when new items added"], - op_free_s: "free layout", - op_free_l: ["permit dragable layout","no effect in laser mode"], - op_spcr_s: "spacing", - op_spcr_l: ["spacing between objects","during auto layout","in workspace units"], - op_invr_s: "invert zoom", - op_invr_l: ["invert mouse wheel","scroll zoom"], - op_save_s: "auto save", - op_save_l: ["preserve objects in workspace","between application reloads"], - op_line_s: "line type", - op_line_l: ["line style for path rendering","impacts 3d performance","path: 3d best","flat: 2d good","line = 1d fast"], - op_unit_s: "units", - op_unit_l: ["workspace units affects","speeds and distances"], - op_anim_s: "animate", - op_anim_l: ["animation mesh density","higher is more dense","takes more memory","and is slower"], + op_xprt_l: "afficher plus d'options de paramétrage", + op_decl_s: "logos", + op_decl_l: "montrer les logos des appareils", + op_dang_s: "expérimental", + op_dang_l: "montrer les paramètres expérimentaux", + op_hopo_s: "survol du menu", + op_hopo_l: ["activer le survol du menu", "pour activer"], + op_dark_s: "mode sombre", + op_dark_l: "interface en mode sombre", + op_comp_s: "ui compacte", + op_comp_l: ["interface utilisateur compacte", "meilleure pour les petits écrans", "et tablettes"], + op_shor_s: "montrer l'origine", + op_shor_l: "indiquer l'origine du dispositif ou du processus", + op_shru_s: "afficher les règles", + op_shru_l: ["montrer les règles des axes", "sur le quadrillage"], + op_sped_s: "afficher les vitesses", + op_sped_l: ["afficher la vitesse en barre de couleur","en mode prévisualisation"], + op_auto_s: "disposition automatique", + op_auto_l: ["disposition automatique sur le plateau", "lorsque de nouveaux éléments sont ajoutés"], + op_free_s: "disposition libre", + op_free_l: ["autoriser la disposition déplaçable","sans effet en mode laser"], + op_spcr_s: "espacement", + op_spcr_l: ["espacement entre les objets", "avec la disposition automatique", "en unités d'espace de travail"], + op_invr_s: "inverser zoom", + op_invr_l: ["inverser la molette de la souris", "faire défiler le zoom"], + op_save_s: "auto enregt", + op_save_l: ["préserve les objets dans l'espace de travail","entre rechargement de l'application"], + op_line_s: "type de ligne", + op_line_l: ["style de ligne pour le rendu","impacte les performances 3d","chemin: 3d meilleur","plat: 2d bon","ligne = 1d rapide"], + op_unit_s: "unités", + op_unit_l: ["les unités d'espace de travail affectent","vitesses et distances"], + op_anim_s: "animer", + op_anim_l: ["densité du maillage de l'animation","plus haut est plus dense","nécessite plus de mémoire","et est plus lent"], - lo_menu: "layout", + lo_menu: "disposition", - pt_menu: "parts", + pt_menu: "pièces", pt_deci_s: "decimate", pt_deci_l: ["enable or disable point decimation","during port import. for faster slicing","and lower memory usage"], - pt_qual_s: "quality", - pt_qual_l: ["level of detail to retain","during slicing operations","lower is faster"], - pt_heal_s: "heal mesh", - pt_heal_l: ["attempt to heal","non-manifold meshes","adds to slicing time"], + pt_qual_s: "qualité", + pt_qual_l: ["niveau de détail à retenir", "lors des opérations de tranchage", "plus bas, est plus rapide"], + pt_heal_s: "correction de maillage", + pt_heal_l: ["tentative de correction", "des mailles non-fermées", "accroit le temps de tranchage"], xp_menu: "exports", // SETTINGS - se_menu: "profile", - se_load: "load", - se_save: "save", + se_menu: "profil", + se_load: "charger", + se_save: "sauvegarder", // FDM SLICING - sl_menu: "layers", - sl_lahi_s: "height", - sl_lahi_l: ["height of each slice","layer in millimeters"], - ad_minl_s: "height min", - ad_minl_l: ["adaptive min layer height","in millimeters","must be non-zero"], - sl_ltop_s: "top layers", - sl_ltop_l: ["number of solid layers","to enforce at the","top of the print"], - sl_lsld_s: "solid layers", - sl_lsld_l: ["solid fill areas computed","from layer deltas. see","layer pop menu"], - sl_lbot_s: "base layers", - sl_lbot_l: ["number of solid layers","to enforce at the","bottom of the print"], + sl_menu: "couches", + sl_lahi_s: "hauteur", + sl_lahi_l: ["hauteur de chaque couche", "couche en millimètres"], + ad_minl_s: "hauteur min", + ad_minl_l: ["hauteur de couche minimale adaptative", "en millimètres", "doit être non nulle"], + sl_ltop_s: "couches du haut", + sl_ltop_l: ["nombre de couches solides", "à appliquer en", "haut de l'impression"], + sl_lsld_s: "couches solides", + sl_lsld_l: ["zones de remplissage solide calculées", "à partir des deltas de couches. voir", "menu surgissant des couches"], + sl_lbot_s: "couches de base", + sl_lbot_l: ["nombre de couches solides", "à appliquer en", "bas de l'impression"], ad_adap_s: "adaptive", - ad_adap_l: ["use adaptive layer heights","with 'layer height' as max","and 'layer min' as the min"], + ad_adap_l: ["utiliser des hauteurs de couche adaptatives", "avec 'hauteur de couche' en maximum", "et 'hauteur min' en minimum"], // FDM SHELLS - sl_shel_s: "shell count", - sl_shel_l: ["number of perimeter","walls to generate"], - sl_ordr_s: "shell order", - sl_ordr_l: ["output shell order","inside to outside","or outside to inside","affects surface quality"], - sl_strt_s: "layer start", - sl_strt_l: ["layer starting point","last = last layer end","center = part center","origin = device origin"], - ad_thin_s: "thin walls", - ad_thin_l: ["detect and fill gaps","between shell walls"], + sl_shel_s: "parois", + sl_shel_l: ["nombre de périmètre", "murs à générer"], + sl_ordr_s: "ordre des parois", + sl_ordr_l: ["ordre d'impression des parois","de l'intérieur vers l'extérieur", "ou de l'extérieur vers l'intérieur","affecte la qualité de surface"], + sl_strt_s: "début de couche", + sl_strt_l: ["point de départ de la couche", "dernier = fin de la couche", "centre = centre de la pièce", "origine = origine du dispositif"], + ad_thin_s: "parois fines", + ad_thin_l: ["détecte et comble les vides", "entre les parois de la coque"], // FDM FILL - fi_menu: "infill", + fi_menu: "remplissage", fi_type: "type", - fi_pcnt_s: "fill fraction", - fi_pcnt_l: ["fill density values","0.0 - 1.0"], - fi_angl_s: "solid start", - fi_angl_l: ["starting angle in degrees","90 degrees added to ","each following layer","applies only to solid layers"], - fi_over_s: "overlap", - fi_over_l: ["overlap with shell and other fill","as fraction of nozzle diameter","0.0 - 1.0"], - // fi_rate_s: "print speed", - fi_rate_l: ["extrusion speed for infill","set to 0 to use default","output print speeds"], + fi_pcnt_s: "fraction de remplissage", + fi_pcnt_l: ["valeurs de densité de remplissage","0.0 - 1.0"], + fi_angl_s: "départ solide", + fi_angl_l: ["angle de départ en degrés", "90 degrés ajoutés à ", "chaque couche suivante", "s'applique uniquement aux couches solides"], + fi_over_s: "chevauchement", + fi_over_l: ["chevauchement de l'enveloppe et du remplissage", "en tant que fraction du diamètre de la buse", "0,0 - 1,0"], + // fi_rate_s: "vitesse d'impression", + fi_rate_l: ["vitesse d'extrusion du remplissage", "régler à 0 pour utiliser par défaut", "la vitesse d'impression"], // FDM FIRST LAYER fl_menu: "base", - fl_lahi_s: "layer height", - fl_lahi_l: ["height of each slice","in millimeters","should be >= slice height"], - fl_rate_s: "shell speed", - fl_rate_l: ["shell printing max speed","in millimeters / minute"], - fl_frat_s: "fill speed", - fl_frat_l: ["fill printing max speed","in millimeters / minute"], - fl_mult_s: "flow factor", - fl_mult_l: ["extrusion multiplier","0.0 - 2.0"], - fl_sfac_s: "width factor", - fl_sfac_l: ["multiplier on nozzle size","changes line spacing"], - fl_skrt_s: "skirt count", - fl_skrt_l: ["number of first-layer offset","brims to generate"], - fl_skro_s: "skirt offset", - fl_skro_l: ["skirt offset from part","in millimeters"], - fl_nozl_s: "nozzle temp", - fl_nozl_l: ["degrees in celsius","output setting used","when this is zero"], - fl_bedd_s: "bed temp", - fl_bedd_l: ["degrees in celsius","output setting used","when this is zero"], - fr_spac_s: "raft gap", - fr_spac_l: ["additional layer spacing","between 1st layer and raft","in millimeters"], - fr_nabl_s: "raft enable", - fr_nabl_l: ["create a raft under the","model for better adhesion","uses skirt offset and","disables skirt output"], + fl_lahi_s: "hauteur de couche", + fl_lahi_l: ["hauteur de chaque couche", "en millimètres", "devrait être >= hauteur de la couche"], + fl_rate_s: "vitesse périmètres", + fl_rate_l: ["vitesse maximale d'impression des coques", "en millimètres / minute"], + fl_frat_s: "vitesse remplissage", + fl_frat_l: ["vitesse maximale d'impression du remplissage", "en millimètres / minute"], + fl_mult_s: "débit", + fl_mult_l: ["multiplicateur d'extrusion","0.0 - 2.0"], + fl_sfac_s: "largeur", + fl_sfac_l: ["multiplicateur de la taille de la buse", "modifie l'espacement des lignes"], + fl_skrt_s: "jupe nb", + fl_skrt_l: ["nombre de lignes de la jupe", "à générer pour la première couche"], + fl_skro_s: "décalage bordure", + fl_skro_l: ["jupe décalée de la partie", "en millimètres"], + fl_nozl_s: "buse", + fl_nozl_l: ["degrés en Celsius", "réglage de sortie utilisé", "lorsque celui-ci est égal à zéro"], + fl_bedd_s: "température plateau", + fl_bedd_l: ["degrés en Celsius", "réglage de sortie utilisé", "lorsque celui-ci est égal à zéro"], + fr_spac_s: "écart radeau", + fr_spac_l: ["espacement des couches supplémentaires", "entre la 1ère couche et le radeau", "en millimètres"], + fr_nabl_s: "activer un radeau", + fr_nabl_l: ["créer un radeau sous le ", "modèle pour une meilleure adhérence", "utilise le décalage des jupes et", "désactive la sortie des jupes"], // FDM BELT ONLY - fl_zoff_s: "belt offset", - fl_zoff_l: ["height offset from belt","of lowest extrusion","in millimeters"], - fl_brim_s: "brim size", + fl_zoff_s: "décalage bande", + fl_zoff_l: ["décalage de hauteur par rapport à la bande", "de l'extrusion la plus basse", "en millimètres"], + fl_brim_s: "taille de bordure", fl_brim_l: ["add brim to part bottom","size is width in millimeters","0 to disable"], - fl_brmn_s: "brim trigger", - fl_brmn_l: ["add brims only when segment","facing belt is shorter than this","value in millimeters","0 = Infinity"], - fl_bled_s: "part anchor", - fl_bled_l: ["belt part anchor","at start of print","in millimeters"], + fl_brmn_s: "seuil de bordure", + fl_brmn_l: ["ajout de bordures uniquement quand le segment", "face à la bande est plus court que cela", "valeur en millimètres", "0 = infini"], + fl_bled_s: "ancrage de pièce", + fl_bled_l: ["ancrage de la pièce sur la bande", "au début de l'impression", "en millimètres"], // FDM SUPPORT sp_menu: "support", - sp_detect: "detect", - sp_dens_s: "density", - sp_dens_l: ["fraction 0.0 - 1.0","recommended 0.15","0 to disable"], - sp_size_s: "pillar size", - sp_size_l: ["pillar width","in millimeters"], - sp_offs_s: "part offset", - sp_offs_l: ["offset from part","in millimeters"], + sp_detect: "détecter", + sp_dens_s: "densité", + sp_dens_l: ["fraction 0.0 - 1.0","recommendé 0.15","0 désactive"], + sp_size_s: "taille pilier", + sp_size_l: ["largeur du pilier","en millimètres"], + sp_offs_s: "décalage du pilier", + sp_offs_l: ["décalage par rapport à la pièce","en millimètres"], sp_gaps_s: "gap layers", - sp_gaps_l: ["number of layers","offset from part"], - sp_span_s: "max span", - sp_span_l: ["unsupported span that causes","a new support to be generated","in millimeters"], - sp_angl_s: "max angle", - sp_angl_l: ["max overhang angle before","supporting pillar is generated"], - sp_area_s: "min area", - sp_area_l: ["minimum area for","a support column","in millimeters"], - sp_xpnd_s: "expand", - sp_xpnd_l: ["expand support area","beyond part boundary","in millimeters"], - sp_nozl_s: "extruder", - sp_nozl_l: ["in multi-extruder systems","the extruder to use for","support material"], - sp_auto_s: "automatic", - sp_auto_l: ["enable generated supports","using at-slice-time geometry","supports will only appear","after slicing completes"], + sp_gaps_l: ["nombre de couches","de décalage de la pièce"], + sp_span_s: "portée maximale", + sp_span_l: ["portée non soutenue nécessitant", "un nouveau soutien à générer","en millimètres"], + sp_angl_s: "angle max", + sp_angl_l: ["angle de surplomb maximum avant", "de générer un pilier de soutien"], + sp_area_s: "surface min", + sp_area_l: ["surface minimum de","la colonne support","en millimètres"], + sp_xpnd_s: "étendre", + sp_xpnd_l: ["étendre la zone de soutien", "au-delà des limites d'une pièce","en millimètres"], + sp_nozl_s: "extrudeur", + sp_nozl_l: ["dans les systèmes multi-extrudeurs", "l'extrudeur à utiliser pour", "le matériau de support"], + sp_auto_s: "automatique", + sp_auto_l: ["activer les supports générés", "utiliser la géométrie at-slice-time", "les supports n'apparaîtront", "qu'une fois le tranchage terminé"], // LASER SLICING ls_offs_s: "offset", - ls_offs_l: ["adjust for beam width","in millimeters"], + ls_offs_l: ["adjust for beam width","en millimètres"], ls_lahi_s: "height", ls_lahi_l: ["layer height","in millimeters","0 = auto/detect"], ls_lahm_s: "min", @@ -482,21 +482,21 @@ kiri.lang['fr-fr'] = { ou_drkn_l: ["enable drag knife","output in gcode","cut radii are added","to corners with","cut down passes"], // OUTPUT FDM - ou_nozl_s: "nozzle temp", - ou_nozl_l: "degrees in celsius", - ou_bedd_s: "bed temp", - ou_bedd_l: "degrees in celsius", - ou_feed_s: "print speed", - ou_feed_l: ["max print speed","millimeters / minute"], - ou_fini_s: "finish speed", - ou_fini_l: ["outermost shell speed","millimeters / minute"], - ou_move_s: "move speed", - ou_move_l: ["non-print move speed","millimeters / minute","0 = enable G0 moves"], - ou_shml_s: "shell factor", - ou_flml_s: "solid factor", - ou_spml_s: "infill factor", - ou_exml_l: ["extrusion multiplier","0.0 - 2.0"], - ou_fans_s: "fan speed", + ou_nozl_s: "température buse", + ou_nozl_l: "degrés en celsius", + ou_bedd_s: "température plateau", + ou_bedd_l: "degrés en celsius", + ou_feed_s: "vitesse impression", + ou_feed_l: ["vitesse d'impression maximale","millimètres / minute"], + ou_fini_s: "vitesse coque", + ou_fini_l: ["vitesse de la coque extérieure","millimètres / minute"], + ou_move_s: "vitesse déplacement", + ou_move_l: ["vitesse de déplacement sans impression","millimètres / minute","0 = active déplacements G0"], + ou_shml_s: "facteur de coque", + ou_flml_s: "facteur de solidité", + ou_spml_s: "facteur de remplissage", + ou_exml_l: ["multiplicateur d'extrusion","0.0 - 2.0"], + ou_fans_s: "vitesse ventilateur", ou_fans_l: "0 - 255", // OUTPUT CAM @@ -542,34 +542,34 @@ kiri.lang['fr-fr'] = { // FDM ADVANCED ad_menu: "expert", - ad_rdst_s: "retract dist", - ad_rdst_l: ["amount to retract filament","for long moves. in millimeters"], - ad_rrat_s: "retract rate", - ad_rrat_l: ["speed of filament","retraction in mm/s"], - ad_rdwl_s: "engage dwell", - ad_wpln_s: "retract wipe", - ad_wpln_l: ["non-printing move","after retraction","in millimeters"], - ad_rdwl_l: ["time between re-engaging","filament and movement","in milliseconds"], + ad_rdst_s: "dist retraction", + ad_rdst_l: ["montant pour rétracter le filament", "pour les longs mouvements. en millimètres"], + ad_rrat_s: "vit rétraction", + ad_rrat_l: ["vitesse de rétraction","du filament en mm/s"], + ad_rdwl_s: "réenclencher", + ad_wpln_s: "essuyage rétractation", + ad_wpln_l: ["mouvement sans impression", "après rétractation", "en millimètres"], + ad_rdwl_l: ["durée de réenclenchement", "filament et mouvement", "en millisecondes"], ad_scst_s: "shell coast", - ad_scst_l: ["non-printing end","of perimeter shells","in millimeters"], - ad_msol_s: "min solid", - ad_msol_l: ["minimum area (mm^2)","required to keep solid","must be > 0.1"], - ad_mins_s: "min speed", - ad_mins_l: ["minimum speed","for short segments"], + ad_scst_l: ["extrémité non imprimée", "des coques du périmètre", "en millimètres"], + ad_msol_s: "min solide", + ad_msol_l: ["aire minimale (mm^2)","requise pour rester solide","doit être > 0.1"], + ad_mins_s: "vitesse min", + ad_mins_l: ["vitesse minimale","des segments courts"], ad_spol_s: "short path", - ad_spol_l: ["polygons shorter than this","will have their print speed","scaled down to min speed","in millimeters"], - ad_arct_s: "arc tolerance", - ad_arct_l: ["convert faceted lines to arcs","center point drift tolerance","when matching arc points","consider values around 0.15","in millimeters","0 to disable"], - ad_zhop_s: "z hop dist", - ad_zhop_l: ["amount to raise z","on retraction moves","in millimeters","0 to disable"], + ad_spol_l: ["les polygones plus courts", "auront la vitesse réduite et", "seront ramenés à la vitesse minimale", "en millimètres"], + ad_arct_s: "tolérance arc", + ad_arct_l: ["convertir les lignes à facettes en arcs", "tolérance de dérive du point central", "lors de la correspondance des points d'arc", "considérer les valeurs autour de 0,15", "en millimètres", "0 pour désactiver"], + ad_zhop_s: "dist levée Z", + ad_zhop_l: ["levée du z","sur les mouvements de rétraction", "en millimètres", "0 pour désactiver"], ad_abkl_s: "anti-backlash", - ad_abkl_l: ["for better flat surface finish","use micro-movements to cancel","backlash in solid layer output","in millimeters","0 to disable","if your firmware has M425","put that in the gcode header","and leave this as 0"], - ad_lret_s: "layer retract", - ad_lret_l: ["force filament retraction","between layers"], - ad_play_s: "polish layers", - ad_play_l: ["polish up to specified","# of layers at a time"], - ad_pspd_s: "polish speed", - ad_pspd_l: ["polishing speed","in millimeters / minute"], + ad_abkl_l: ["pour une meilleure finition de la surface plane", "utiliser des micro-mouvements pour annuler", "le jeu dans la sortie de la couche solide", "en millimètres", "0 pour désactiver", "si le firmware reconnait le M425", "l'utiliser dans l'en-tête du gcode", "et mettre à 0"], + ad_lret_s: "rétr chngt couche", + ad_lret_l: ["forcer la rétraction du filament", "entre les couches"], + ad_play_s: "couches de polissage", + ad_play_l: ["polir jusqu'au nombre spécifié", "# de couches à la fois"], + ad_pspd_s: "vitesse de polissage", + ad_pspd_l: ["vitesse de polissage", "en millimètres / minute"], // CAM EXPERT cx_fast_s: "skip shadow", @@ -577,12 +577,12 @@ kiri.lang['fr-fr'] = { // FDM GCODE ag_menu: "gcode", - ag_nozl_s: "nozzle", - ag_nozl_l: "select output nozzle or head", - ag_paws_s: "pause layers", - ag_paws_l: ["comma-separated list of layers","to inject pause commands before"], - ag_loop_s: "loop layers", - ag_loop_l: ["layer ranges to repeat in the format","first-last-count,first-last-count,...","omitted count = 1"], + ag_nozl_s: "buse", + ag_nozl_l: "sélectionner la buse ou la tête d'impression", + ag_paws_s: "couches de pause", + ag_paws_l: ["liste de couches séparées par des virgules", "pour injecter des commandes de pause avant"], + ag_loop_s: "couches de répétitions", + ag_loop_l: ["des plages de couches à répéter dans le format ", "premier-compte dernier,premier-compte dernier,...", "compte omis = 1"], // SLA MENU sa_menu: "slicing", From 0bfe30727e276468e00f9eeb324fa1ef93f830f7 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 27 Feb 2021 12:25:37 -0500 Subject: [PATCH 177/255] replacement --- web/kiri/lang/fr2-help.html | 186 ++++++++++++++++++++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 web/kiri/lang/fr2-help.html diff --git a/web/kiri/lang/fr2-help.html b/web/kiri/lang/fr2-help.html new file mode 100644 index 00000000..1ba0c196 --- /dev/null +++ b/web/kiri/lang/fr2-help.html @@ -0,0 +1,186 @@ +
    + +
    + + +
    + +
    + +
    +
    A propos
    +
    débuter
    +
    contrôles
    + +
    support
    +
    projet
    +
    + +
    +
    +
    +

    + Kiri:Moto est un logiciel de découpe unique, fonctionnant dans un navigateur, entièrement open source, qui + transforme les modèles 3d en instructions de machine pour des imprimantes 3D, des CNC, + et des graveurs laser. +


    + Le fait d'être basé sur un navigateur signifie que tout le processus de découpe a lieu dans le navigateur local, + et non dans le nuage. Vos données et modèles restent totalement privés. +


    + Cela signifie que Kiri se comporte comme une application native de votre ordinateur avec en plus + la sécurité de l'exécution dans le bac à sable de sécurité du navigateur. +


    + L'autre avantage de fonctionner à partir du web est que Kiri est toujours à jour. Les nouvelles + fonctionnalités, les corrections de bogues et les mises à jour sont fréquemment mises en place. Si vous souhaitez exécuter une ancienne + ou une version de développement de Kiri, sélectionnez cette version dans le menu utilisateur en haut à droite. +

    +
    +
    + Kiri vient de Kiri-e qui est l'art Japonais du découpage de papiers + Moto est un raccourci pour "Modeling Tool" (Outil de modélisation) +
    + +
    + Guide de démarrage rapide +
    +

    +

  • visionner The Definitive Video Guide to Kiri:Moto 2.5
  • +
  • le menu setup sélectionne le type de matériel et un appareil
  • +
  • les préférences permettent de régler l'interface et les caractéristiques de l'appareil
  • +
  • personnaliser un appareil si vous souhaitez modifier les paramètres par défaut
  • +
  • ouvre un fichier ou importe des pièces dans l'espace de travail
  • +
  • utiliser les menus de droite pour personnaliser les paramètres de découpage
  • +
  • découper les objets pour voir l'effet des paramètres
  • +
  • la prévisualisation calcule les données de cheminement des objets tranchés
  • +
  • l'exportation convertit les chemins d'accès aux fichiers GCode et SVG
  • +

    +
    +
    + Modes de fonctionnement +

    Chaque mode (FDM, CAM, Laser, SLA) a des caractéristiques et des paramètres différents. + Explorez les vidéos Youtube pour en savoir plus.

    +
    +
    + +
    about 3d printing
    +
    about cnc milling
    +
    about laser cutting
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Contrôles via le clavier
    ToucheAction
    Configuration
    Sélection de l'appareil
    CAM Sélection des outils
    Grid Local Devices
    Panneau des préférence
    Profils de travail
    Mode
    Organiser
    Découper
    Prévisualiser
    Animer
    Exporter
    Fichier
    Importer
    Récent
    Voir
    Home
    Top
    Avant
    Arrière
    Réinitialiser la vue
    Alterner les vues de côtés
    Focus (organiser)
    Couche (découper/prévisualiser)
    Objets
    Dupliquer
    Miroir
    Pivoter/tourner
    Supprimer
    Tounrer de 90°
    Tourner de 5°
    Déplacer de 5mm
    Tout sélectionner
    Aide
    Cette fenêtre
    +
    + + + + + + + + + + + + + + + + + +
    Contrôles via la souris
    ComboAction
    View
    moletteChanger de couche
    déplacerPan
    Pan
    Tourner
    Zoom
    Zoom
    déplacerPan
    Objets
    Aligner la face sur le plateau
    Aligner la face sur le plateau
    +
    +
    + +
    + Ressources + + Options complémentaires +

    + Dans le menu utilsateur en haut à droite, + utiliser l'option export pour créer unecopie téléchargeable des + profils du matériel et (optionellement) de l'espace de travail. Ce fichier pourra ensuite + être utilisé pour contrôler et rétablir un instantané de votre installation à tout moment. + Il peut également être partagé afin que les développeurs et autres utilisateurs puissent + reproduire votre environnement pour aider au débogage. +

    +
    + +
    + Open Source +

    + Kiri:Moto est totalement open-source. + Consultez la page du projet Github. Il existe des projets complémentaires, tant sur le plan matériel que logiciel. + Les nouveaux développeurs et les contributions au code sont les bienvenus à tout moment. La licence du code est celle du MIT. +


    + Toute donation est également bienvenue. +

    +
    Intégrations +

    Kiri:Moto est également intégré dans plusieurs autres applications web

    +
  • Onshape via son magasin d'Applications
  • +
  • Thingiverse en tant que native Thing Apps
  • +
  • SimplyPrint.io as the primary slicer under the covers
  • +
  • CAMLab est une branche d'une version antérieure de Kiri:Moto
  • +
    + +
    + +
    +
    From e2986ae8df34b1721f3793990250fec774e178ed Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 27 Feb 2021 12:25:37 -0500 Subject: [PATCH 178/255] undo --- web/kiri/lang/fr2-help.html | 186 ------------------------------------ 1 file changed, 186 deletions(-) delete mode 100644 web/kiri/lang/fr2-help.html diff --git a/web/kiri/lang/fr2-help.html b/web/kiri/lang/fr2-help.html deleted file mode 100644 index 1ba0c196..00000000 --- a/web/kiri/lang/fr2-help.html +++ /dev/null @@ -1,186 +0,0 @@ -
    - -
    - - -
    - -
    - -
    -
    A propos
    -
    débuter
    -
    contrôles
    - -
    support
    -
    projet
    -
    - -
    -
    -
    -

    - Kiri:Moto est un logiciel de découpe unique, fonctionnant dans un navigateur, entièrement open source, qui - transforme les modèles 3d en instructions de machine pour des imprimantes 3D, des CNC, - et des graveurs laser. -


    - Le fait d'être basé sur un navigateur signifie que tout le processus de découpe a lieu dans le navigateur local, - et non dans le nuage. Vos données et modèles restent totalement privés. -


    - Cela signifie que Kiri se comporte comme une application native de votre ordinateur avec en plus - la sécurité de l'exécution dans le bac à sable de sécurité du navigateur. -


    - L'autre avantage de fonctionner à partir du web est que Kiri est toujours à jour. Les nouvelles - fonctionnalités, les corrections de bogues et les mises à jour sont fréquemment mises en place. Si vous souhaitez exécuter une ancienne - ou une version de développement de Kiri, sélectionnez cette version dans le menu utilisateur en haut à droite. -

    -
    -
    - Kiri vient de Kiri-e qui est l'art Japonais du découpage de papiers - Moto est un raccourci pour "Modeling Tool" (Outil de modélisation) -
    - -
    - Guide de démarrage rapide -
    -

    -

  • visionner The Definitive Video Guide to Kiri:Moto 2.5
  • -
  • le menu setup sélectionne le type de matériel et un appareil
  • -
  • les préférences permettent de régler l'interface et les caractéristiques de l'appareil
  • -
  • personnaliser un appareil si vous souhaitez modifier les paramètres par défaut
  • -
  • ouvre un fichier ou importe des pièces dans l'espace de travail
  • -
  • utiliser les menus de droite pour personnaliser les paramètres de découpage
  • -
  • découper les objets pour voir l'effet des paramètres
  • -
  • la prévisualisation calcule les données de cheminement des objets tranchés
  • -
  • l'exportation convertit les chemins d'accès aux fichiers GCode et SVG
  • -

    -
    -
    - Modes de fonctionnement -

    Chaque mode (FDM, CAM, Laser, SLA) a des caractéristiques et des paramètres différents. - Explorez les vidéos Youtube pour en savoir plus.

    -
    -
    - -
    about 3d printing
    -
    about cnc milling
    -
    about laser cutting
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Contrôles via le clavier
    ToucheAction
    Configuration
    Sélection de l'appareil
    CAM Sélection des outils
    Grid Local Devices
    Panneau des préférence
    Profils de travail
    Mode
    Organiser
    Découper
    Prévisualiser
    Animer
    Exporter
    Fichier
    Importer
    Récent
    Voir
    Home
    Top
    Avant
    Arrière
    Réinitialiser la vue
    Alterner les vues de côtés
    Focus (organiser)
    Couche (découper/prévisualiser)
    Objets
    Dupliquer
    Miroir
    Pivoter/tourner
    Supprimer
    Tounrer de 90°
    Tourner de 5°
    Déplacer de 5mm
    Tout sélectionner
    Aide
    Cette fenêtre
    -
    - - - - - - - - - - - - - - - - - -
    Contrôles via la souris
    ComboAction
    View
    moletteChanger de couche
    déplacerPan
    Pan
    Tourner
    Zoom
    Zoom
    déplacerPan
    Objets
    Aligner la face sur le plateau
    Aligner la face sur le plateau
    -
    -
    - -
    - Ressources - - Options complémentaires -

    - Dans le menu utilsateur en haut à droite, - utiliser l'option export pour créer unecopie téléchargeable des - profils du matériel et (optionellement) de l'espace de travail. Ce fichier pourra ensuite - être utilisé pour contrôler et rétablir un instantané de votre installation à tout moment. - Il peut également être partagé afin que les développeurs et autres utilisateurs puissent - reproduire votre environnement pour aider au débogage. -

    -
    - -
    - Open Source -

    - Kiri:Moto est totalement open-source. - Consultez la page du projet Github. Il existe des projets complémentaires, tant sur le plan matériel que logiciel. - Les nouveaux développeurs et les contributions au code sont les bienvenus à tout moment. La licence du code est celle du MIT. -


    - Toute donation est également bienvenue. -

    -
    Intégrations -

    Kiri:Moto est également intégré dans plusieurs autres applications web

    -
  • Onshape via son magasin d'Applications
  • -
  • Thingiverse en tant que native Thing Apps
  • -
  • SimplyPrint.io as the primary slicer under the covers
  • -
  • CAMLab est une branche d'une version antérieure de Kiri:Moto
  • -
    - -
    - -
    -
    From 5d601cf1fe8f222e187adabdcd0b443a2c909748 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 27 Feb 2021 13:02:53 -0500 Subject: [PATCH 179/255] reflow control help. add hanging indent in help bullets --- web/kiri/index.css | 6 ++++-- web/kiri/lang/da-help.html | 3 +-- web/kiri/lang/de-help.html | 14 ++------------ web/kiri/lang/en-help.html | 12 +----------- web/kiri/lang/fr-help.html | 14 ++------------ 5 files changed, 10 insertions(+), 39 deletions(-) diff --git a/web/kiri/index.css b/web/kiri/index.css index 3c8c3fd7..2e077c8f 100644 --- a/web/kiri/index.css +++ b/web/kiri/index.css @@ -965,6 +965,8 @@ th, tr, td, label { } #help .content li { line-height: 1.75em; + padding-left: 22px ; + text-indent: -22px ; } #help .footer { font-family: monospace; @@ -997,7 +999,7 @@ th, tr, td, label { border-right: 0; } #help-tabs { - width: 600px; + width: 550px; height: 450px; transform: translateX(-1px); } @@ -1542,4 +1544,4 @@ th, tr, td, label { } .range-detail span { flex-grow: 1; -} \ No newline at end of file +} diff --git a/web/kiri/lang/da-help.html b/web/kiri/lang/da-help.html index b2a2b1a1..0bd54eb4 100644 --- a/web/kiri/lang/da-help.html +++ b/web/kiri/lang/da-help.html @@ -67,8 +67,7 @@ mouse-wheelZoom middle-dragZoom 2-touch-pinchZoom - - + diff --git a/web/kiri/lang/de-help.html b/web/kiri/lang/de-help.html index a775fbcb..4cf21fe2 100644 --- a/web/kiri/lang/de-help.html +++ b/web/kiri/lang/de-help.html @@ -11,13 +11,6 @@
    Über
    starting
    Steuerung
    -
    Unterstützung
    Das Projekt
    @@ -60,7 +53,7 @@
  • Mit Slice siehst du, wie die Parameter sich auf Objekte auswirken
  • Vorschau berechnet Pfade (Maschinen-Anweisungen) aus den gesliceten Objekten
  • Export speichert diese Pfade in GCode- oder SVG-Dateien
  • - +

    @@ -120,10 +113,7 @@
    - -


    Konfiguration
    Dette Hjælpe Vindue
    Enhed Udvælger
    Hilfe
    Dieses Fenster
    -
    - + diff --git a/web/kiri/lang/en-help.html b/web/kiri/lang/en-help.html index 0b7bcef1..acd45712 100644 --- a/web/kiri/lang/en-help.html +++ b/web/kiri/lang/en-help.html @@ -11,13 +11,6 @@
    about
    starting
    controls
    -
    support
    project
    @@ -118,10 +111,7 @@ - -


    Maus-Kontrollen
    TastenkombinationBefehl
    Help
    This Window
    -
    - + diff --git a/web/kiri/lang/fr-help.html b/web/kiri/lang/fr-help.html index 1ba0c196..60351e17 100644 --- a/web/kiri/lang/fr-help.html +++ b/web/kiri/lang/fr-help.html @@ -11,13 +11,6 @@
    A propos
    débuter
    contrôles
    -
    support
    projet
    @@ -118,10 +111,7 @@ - -


    Mouse Controls
    ComboAction
    Aide
    Cette fenêtre
    -
    - + @@ -157,7 +147,7 @@ Dans le menu utilsateur en haut à droite, utiliser l'option export pour créer unecopie téléchargeable des profils du matériel et (optionellement) de l'espace de travail. Ce fichier pourra ensuite - être utilisé pour contrôler et rétablir un instantané de votre installation à tout moment. + être utilisé pour contrôler et rétablir un instantané de votre installation à tout moment. Il peut également être partagé afin que les développeurs et autres utilisateurs puissent reproduire votre environnement pour aider au débogage.

    From d3331c9b88feadc4d6cafbda1e9f2b51c3747f2b Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 27 Feb 2021 15:15:43 -0500 Subject: [PATCH 180/255] add 'print-time' as alias for 'time' in gcode macros. fixes #118 --- src/mode/fdm/export.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mode/fdm/export.js b/src/mode/fdm/export.js index 25f52f9b..987bfa31 100644 --- a/src/mode/fdm/export.js +++ b/src/mode/fdm/export.js @@ -593,8 +593,9 @@ append(`M808`); } - subst.time = UTIL.round(time,2); subst.material = UTIL.round(emitted,2); + subst.time = UTIL.round(time,2); + subst['print-time'] = subst.time; append("; --- shutdown ---"); appendAllSub(device.gcodePost); From 08820ff98f0fbc17c3e92722759a3b1d4b157b46 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 27 Feb 2021 17:26:24 -0500 Subject: [PATCH 181/255] add preset event --- src/kiri/main.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/kiri/main.js b/src/kiri/main.js index a3d6ec0c..334ff7ac 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -230,6 +230,7 @@ dec: () => { kiri.api.event.emit("busy", --busy) } }, conf: { + dbo: () => { return ls2o('ws-settings') }, get: getSettings, put: putSettings, load: loadSettings, @@ -2929,4 +2930,6 @@ // new module loading kiri.loader.forEach(mod => { mod(kiri.api)} ); + // upon restore, seed presets + API.event.emit('preset', API.conf.dbo()); })(); From 7ca351fd496963863a10845854430f4389717ea5 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 27 Feb 2021 17:30:59 -0500 Subject: [PATCH 182/255] bump rev 2.7.D14 --- package.json | 2 +- src/kiri.js | 2 +- src/license.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index ce6775e6..e4e5dc92 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grid-apps", - "version": "2.7.13D", + "version": "2.7.14D", "description": "grid.space 3d slice & modeling tools", "author": "Stewart Allen ", "license": "MIT", diff --git a/src/kiri.js b/src/kiri.js index 5a488ab4..d1296f64 100644 --- a/src/kiri.js +++ b/src/kiri.js @@ -6,7 +6,7 @@ if (!self.kiri) { self.kiri = { - beta: 2713, + beta: 2714, driver: {}, // driver modules loader: [] // module loading: array of functions }; diff --git a/src/license.js b/src/license.js index 919dcfcb..8ac464f4 100644 --- a/src/license.js +++ b/src/license.js @@ -3,7 +3,7 @@ let terms = { COPYRIGHT: "Copyright (C) Stewart Allen - All Rights Reserved", LICENSE: "See the license.md file included with the source distribution", - VERSION: "2.7.D13" + VERSION: "2.7.D14" }; if (typeof(module) === 'object') { From d44c26ca2efb4cdc58336257f320e6039e7eb76f Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 27 Feb 2021 23:02:59 -0500 Subject: [PATCH 183/255] default to correct language base --- src/kiri/init.js | 5 +++-- src/kiri/lang.js | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/kiri/init.js b/src/kiri/init.js index a89aa3c8..c45ae116 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -2552,13 +2552,14 @@ // inject language script if not english if (lang && lang !== 'en' && lang !== 'en-us') { lang_set = lang; + let map = KIRI.lang.map(lang); let scr = DOC.createElement('script'); // scr.setAttribute('defer',true); - scr.setAttribute('src',`/kiri/lang/${lang}.js`); + scr.setAttribute('src',`/kiri/lang/${map}.js`); (DOC.body || DOC.head).appendChild(scr); STATS.set('ll',lang); scr.onload = function() { - KIRI.lang.set(lang); + KIRI.lang.set(map); UI.lang(); init_one(); }; diff --git a/src/kiri/lang.js b/src/kiri/lang.js index f82ad861..9f464938 100644 --- a/src/kiri/lang.js +++ b/src/kiri/lang.js @@ -7,9 +7,28 @@ if (self.kiri.lang) return; const KIRI = self.kiri, LANG = self.kiri.lang = { current: {} }; + const KDFL = 'en-us'; let lset = navigator.language.toLocaleLowerCase(); + LANG.map = function(key) { + if (!key) { + return KDFL; + } + let tok = key.split('-'); + switch (tok[0]) { + case 'en': + return 'en-us'; + case 'da': + return 'da-dk'; + case 'de': + return 'de-de'; + case 'fr': + return 'fr-fr'; + } + return KDFL; + }; + LANG.get = function() { return lset; }; From 11ea46c0c099af961ea4bf7f8d32dd7f10cc0f9d Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 27 Feb 2021 23:07:01 -0500 Subject: [PATCH 184/255] danish update --- web/kiri/lang/da.js | 1109 +++++++++++++++++++++++-------------------- 1 file changed, 602 insertions(+), 507 deletions(-) diff --git a/web/kiri/lang/da.js b/web/kiri/lang/da.js index c45c63b0..73af3fd1 100644 --- a/web/kiri/lang/da.js +++ b/web/kiri/lang/da.js @@ -1,552 +1,647 @@ kiri.lang['da'] = - kiri.lang['da-dk'] = { - version: "version", - enable: "enable", - settings: "indstillinger", +kiri.lang['da-dk'] = { + version: "version", + enable: "enable", + settings: "indstillinger", + // common keys and menus + animate: "animer", // CAM animate button + arrange: "arranger", // layout workspace objects + axis: "ake", // left object scale pop menu + clear: "ryd", // clear workspace (remove all objects) + copy: "kopier", + delete: "slet", + detail: "detaljer", + done: "færdig", + enable: "aktiver", + export: "eksporter", + files: "filer", + help: "hjælp", + ghost: "spøgelse", // left render pop menu (wireframe) + hide: "skjul", // left render pop menu (invisible) + home: "hjem", + import: "importer", + language: "sprog", + machine: "maskine", // device or machine + metric: "måleenhed", + name: "navn", + prefs: "præferencer", // left menu "preferences" + preview: "forhåndsvisning", + recent: "nylig", + render: "render", // left render pop menu + reset: "Nulstil", + rotate: "roter", // left rotate pop menu + save: "gem", + scale: "skala", // left object scale pop menu + setup: "setup", + settings: "indstillinger", + size: "størrelse", + solid: "solid", // view type pop menu + tool: "værktøj", + tools: "værktøjer", // CAM tool menu button + top: "top", + type: "type", // CAM tool type + version: "version", + view: "vis", // left view pop menu + wire: "tråd", // left render pop menu - acct_xpo: "lav en sikkerhedskopi af din enhed\nog enhedsprofiler med mulighed for at\nmedtage arbejdsområdeobjekter og positioner", + acct_xpo: ["lav en sikkerhedskopi af din enhed","og enhedsprofiler med mulighed for at","medtage arbejdsområdeobjekter og positioner"], - // DEVICE dialog groups - dv_gr_dev: "enhed", - dv_gr_ext: "ekstruder", - dv_gr_out: "output", - dv_gr_gco: "gcode makroer", + // RIGHT-CLICK CONTEXT MENU + rc_clws: "ryd arbejdsområde", + rc_xpws: "eksporter arbejdsområde", + rc_lafl: "læg flat", + rc_mirr: "spejlvend", + rc_dupl: "dupliker", + rc_xstl: "eksporter som STL", - // DEVICE dialog (_s = label, _l = hover help) - dv_name_s: "navn", - dv_name_l: "enhedens navn", - dv_fila_s: "filament", - dv_fila_l: "diameter i millimeter", - dv_nozl_s: "dyse", - dv_nozl_l: "diameter i millimeter", - dv_bedw_s: "bredde", - dv_bedw_l: "arbejdsområde enheder", - dv_bedd_s: "dybde", - dv_bedd_l: "arbejdsområde enheder", - dv_bedh_s: "højde", - dv_bedh_l: "max bygge højde\narbejdsområde enheder", - dv_spmx_s: "maks. spindel", - dv_spmx_l: "maks. spindel rpm\n0 for at deaktivere", - dv_xtab_s: "absolut positionering", - dv_xtab_l: "ekstruder bevægelser absolutte", - dv_orgc_s: "udgangspunkt i center", - dv_orgc_l: "plade har udgangspunkt i center", - dv_orgt_s: "udgangspunkt i toppen", - dv_orgt_l: "part z origin top", - dv_bedc_s: "rund plade", - dv_bedc_l: "enhedens plade er rund", - dv_belt_s: "bælte plade", - dv_belt_l: "kontinuerlig printplade", - dv_fanp_s: "blæser styrke", - dv_fanp_l: "bestem køle blæser styrke", - dv_prog_s: "fremgang", - dv_prog_l: "output for hver % fremgang", - dv_layr_s: "lag", - dv_layr_l: "output fra hver\nlag skifte", - dv_tksp_s: "token mellemrum", - dv_tksp_l: "tilføj et mellemrum mellem\ngkode akseparametre\nG0X0Y0X0\nvs\nG0 X0 Y0 Z0", - dv_strc_s: "strip comments", - dv_strc_l: "fjern gkode kommentarer\nsom begynder med ;", - dv_fext_s: "filtypenavn", - dv_fext_l: "file name extension", - dv_dwll_s: "dwell", - dv_dwll_l: "gkode dvale kode", - dv_tool_s: "værktøj skift", - dv_tool_l: "værktøj skift kode", - dv_sspd_s: "spindel hastighed", - dv_sspd_l: "sæt spindel hastighed", - dv_paus_s: "pause", - dv_paus_l: "gkode pause kode", - dv_head_s: "sidehovede", - dv_head_l: "sidehovede gkode", - dv_foot_s: "sidefod", - dv_foot_l: "sidefod gkode", - dv_lzon_s: "tænd laser", - dv_lzon_l: "tænd laser gkode", - dv_lzof_s: "sluk laser", - dv_lzof_l: "sluk laser gkode", - dv_exts_s: "vælg", - dv_exts_l: "gkode for at vælge denne ekstruder", - dv_extd_s: "fravalgt", - dv_extd_l: "gkode for at fravælge denne ekstruder", - dv_exox_s: "forskydning x", - dv_exox_l: "dyse forskydning x", - dv_exoy_s: "forskydning y", - dv_exoy_l: "dyse forskydning y", + // DEVICE MENU and related dialogs + dm_sldt: "vælg en enhedstype", + dm_stdd: "standard enhed", + dm_mydd: "mine enheder", + dm_seld: "valgte enheder", + dm_rcnt: "nylige filer", + dm_savs: "gemte indstillinger", + dm_appp: "Programindstillinger", - // MODE - mo_menu: "tilstand", - mo_fdmp: "FDM Print", - mo_slap: "SLA Print", - mo_lazr: "Laser skær", - mo_cncm: "CNC fræs", + // CAM Tool Dialog + td_tyem: "ende", // end mill + td_tybm: "kugle", // ball mill + td_tytm: "konisk", // taper mill + td_tonm: "værktøj #", + td_shft: "skaft", // endmill shaft specs + td_flut: "spiral", // endmill flute specs + td_tapr: "konisk", // endmill taper specs - // SETUP - su_menu: "setup", - su_devi: "Enheder", - su_tool: "Værktøjer", - su_locl: "Lokal", - su_xprt: "Eksport", - su_help: "Hjælp", + // DEVICE dialog groups + dv_gr_dev: "enhed", + dv_gr_ext: "ekstruder", + dv_gr_out: "output", + dv_gr_gco: "gcode makroer", - // LOAD - fe_menu: "fil", - fn_recn: "Nylig", - fn_impo: "Importér", + // DEVICE dialog (_s = label, _l = hover help) + dv_name_s: "navn", + dv_name_l: "enhedens navn", + dv_fila_s: "filament", + dv_fila_l: "diameter i millimeter", + dv_nozl_s: "dyse", + dv_nozl_l: "diameter i millimeter", + dv_bedw_s: "bredde", + dv_bedw_l: "arbejdsområde enheder", + dv_bedd_s: "dybde", + dv_bedd_l: "arbejdsområde enheder", + dv_bedh_s: "højde", + dv_bedh_l: ["max bygge højde","arbejdsområde enheder"], + dv_spmx_s: "maks. spindel", + dv_spmx_l: ["maks. spindel rpm","0 for at deaktivere"], + dv_xtab_s: "absolut positionering", + dv_xtab_l: "ekstruder bevægelser absolutte", + dv_orgc_s: "udgangspunkt i center", + dv_orgc_l: "plade har udgangspunkt i center", + // dv_orgt_s: "udgangspunkt i toppen", + // dv_orgt_l: "part z origin top", + dv_bedc_s: "rund plade", + dv_bedc_l: "enhedens plade er rund", + dv_belt_s: "bælte plade", + dv_belt_l: "kontinuerlig printplade", + dv_fanp_s: "blæser styrke", + dv_fanp_l: "bestem køle blæser styrke", + dv_prog_s: "fremgang", + dv_prog_l: "output for hver % fremgang", + dv_layr_s: "lag", + dv_layr_l: ["output fra hver","lag skifte"], + dv_tksp_s: "token mellemrum", + dv_tksp_l: ["tilføj et mellemrum mellem","gkode akseparametre","G0X0Y0X0","vs","G0 X0 Y0 Z0"], + dv_strc_s: "strip comments", + dv_strc_l: ["fjern gkode kommentarer","som begynder med ;"], + dv_fext_s: "filtypenavn", + dv_fext_l: "file name extension", + dv_dwll_s: "dwell", + dv_dwll_l: "gkode dvale kode", + dv_tool_s: "værktøj skift", + dv_tool_l: "værktøj skift kode", + dv_sspd_s: "spindel hastighed", + dv_sspd_l: "sæt spindel hastighed", + dv_paus_s: "pause", + dv_paus_l: "gkode pause kode", + dv_head_s: "sidehovede", + dv_head_l: "sidehovede gkode", + dv_foot_s: "sidefod", + dv_foot_l: "sidefod gkode", + dv_lzon_s: "tænd laser", + dv_lzon_l: "tænd laser gkode", + dv_lzof_s: "sluk laser", + dv_lzof_l: "sluk laser gkode", + dv_exts_s: "vælg", + dv_exts_l: "gkode for at aktivere denne ekstruder", + dv_dext_s: "fravalgt", + dv_dext_l: "gcode køres, før en anden ekstruder aktiveres", + dv_extd_s: "fravalgt", + dv_extd_l: "gkode for at fravælge denne ekstruder", + dv_exox_s: "forskydning x", + dv_exox_l: "dyse forskydning x", + dv_exoy_s: "forskydning y", + dv_exoy_l: "dyse forskydning y", - // FUNCTION - fn_menu: "handling", - fn_arra: "Arranger", - fn_slic: "Slice", - fn_prev: "Eksempel", - fn_expo: "Eksport", + // MODE + mo_menu: "tilstand", + mo_fdmp: "FDM Print", + mo_slap: "SLA Print", + mo_lazr: "Laser skær", + mo_cncm: "CNC fræs", - // VIEW - vu_menu: "vis", - vu_home: "hjem", - vu_rset: "Nulstil", - vu_sptp: "Top", - vu_spfr: "Front", - vu_splt: "Venstre", - vu_sprt: "Højre", + // SETUP + su_menu: "setup", + su_devi: "Enheder", + su_tool: "Værktøjer", + su_locl: "Lokal", + su_xprt: "Eksport", + su_help: "Hjælp", - // WORKSPACE - ws_menu: "vis", - ws_save: "Gem", - ws_cler: "Ryd", + // LOAD + fe_menu: "fil", + fn_recn: "Nylig", + fn_impo: "Importér", - // OPTIONS - op_menu: "brugerflade", - op_disp: "Skærm", - op_xprt_s: "ekspert", - op_xprt_l: "vis flere indstillinger", - op_decl_s: "mærkater", - op_decl_l: "vis enhedsmærkater og logoer", - op_hopo_s: "hold over pop op", - op_hopo_l: "aktiver menu ved at\nholde over den", - op_dark_s: "mørkt tema", - op_dark_l: "mørkt tema brugerflade", - op_comp_s: "kompakt brugerflade", - op_comp_l: "kompakt brugerflade\nbedre til små skærme\nog tablets", - op_shor_s: "vis udgangspunkt", - op_shor_l: "vis enhedens eller proccens udgangspunkt", - op_shru_s: "vis linealer", - op_shru_l: "vis akse linealer på større\ngitterlinjer", - op_sped_s: "vis hastigheder", - op_sped_l: "vis hastighed til farve bar\ni forhåndsvisning", - op_auto_s: "auto fordel", - op_auto_l: "automatisk layoutplatform,\nnår nye dele tilføjes", - op_free_s: "free layout", - op_free_l: "permit dragable layout\nno effect in laser mode", - op_invr_s: "vend zoom om", - op_invr_l: "vender zoom på musens\nhjul om", - op_save_s: "auto gem", - op_save_l: "beholder objekter i arbejdsområdet\nmellem genindlæsninger", - op_line_s: "linje type", - op_line_l: "linjestil til gengivelse\naf linjer i 3d\sti: 3d bedst\nflad: 2d god\nlinje 1d hurtig", - op_unit_s: "enheder", - op_unit_l: "arbejdsområde enheder har effekt\npå hatigheder og distancer", - op_anim_s: "animer", - op_anim_l: "animation mesh tæthed\nhøjere er mere tæt\nkræver mere hukommelse\nog er langsommere", - lo_menu: "fordeling", + // FUNCTION + fn_menu: "handling", + fn_arra: "Arranger", + fn_slic: "Slice", + fn_prev: "Eksempel", + fn_expo: "Eksport", - pt_menu: "dele", - pt_deci_s: "decimer", - pt_deci_l: "aktivere eller deaktivere punktdecimering\nunder portimport. for hurtigere hebandling\nog lavere hukommelsesforbrug", - pt_qual_s: "kvalitet", - pt_qual_l: "detaljeringsniveau, der\nskal bevares under behandling\n lavere er hurtigere", + // VIEW + vu_menu: "vis", + vu_home: "hjem", + vu_rset: "Nulstil", + vu_sptp: "Top", + vu_spfr: "Front", + vu_splt: "Venstre", + vu_sprt: "Højre", - xp_menu: "eksporteringer", + // WORKSPACE + ws_menu: "vis", + ws_save: "Gem", + ws_cler: "Ryd", - // SETTINGS - se_menu: "profil", - se_load: "indlæs", - se_save: "gem", + // OPTIONS + op_menu: "brugerflade", + op_disp: "Skærm", + op_xprt_s: "ekspert", + op_xprt_l: "vis flere indstillinger", + op_decl_s: "mærkater", + op_decl_l: "vis enhedsmærkater og logoer", + op_dang_s: "eksperimentel", + op_dang_l: "Vis eksperimentelle parametre", + op_hopo_s: "hold over pop op", + op_hopo_l: ["aktiver menu ved at","holde over den"], + op_dark_s: "mørkt tema", + op_dark_l: "mørkt tema brugerflade", + op_comp_s: "kompakt brugerflade", + op_comp_l: ["kompakt brugerflade","bedre til små skærme","og tablets"], + op_shor_s: "vis udgangspunkt", + op_shor_l: "vis enhedens eller proccens udgangspunkt", + op_shru_s: "vis linealer", + op_shru_l: ["vis akse linealer på større","gitterlinjer"], + op_sped_s: "vis hastigheder", + op_sped_l: ["vis hastighed til farve bar","i forhåndsvisning"], + op_auto_s: "auto fordel", + op_auto_l: ["automatisk layoutplatform,","når nye dele tilføjes"], + op_free_s: "frit layout", + op_free_l: ["tillad trækbart layout","ingen effekt i laser-tilstand"], + op_spcr_s: "afstand", + op_spcr_l: ["afstand mellem objekter","under automatisk layout","i arbejdsrumsenheder"], + op_invr_s: "vend zoom om", + op_invr_l: ["vender zoom på musens","hjul om"], + op_save_s: "auto gem", + op_save_l: ["beholder objekter i arbejdsområdet","mellem genindlæsninger"], + op_line_s: "linje type", + op_line_l: ["linjestil til gengivelse","af linjer i 3d\sti: 3d bedst","flad: 2d god","linje 1d hurtig"], + op_unit_s: "enheder", + op_unit_l: ["arbejdsområde enheder har effekt","på hatigheder og distancer"], + op_anim_s: "animer", + op_anim_l: ["animation mesh tæthed","højere er mere tæt","kræver mere hukommelse","og er langsommere"], - // FDM SLICING - sl_menu: "lag", - sl_lahi_s: "højde", - sl_lahi_l: "højden af hver\nlag i milimeter", - ad_minl_s: "højde min", - ad_minl_l: "adaptiv min laghøjde\ni millimeter\nskal være ikke-nul", - sl_ltop_s: "top lag", - sl_ltop_l: "antallet af faste lag\nder skal lægges på\ntoppen af en print", - sl_lsld_s: "faste lag", - sl_lsld_l: "faste udfyldnigner beregnet\nud fra lag deltaen. se\nlag pop op menuen", - sl_lbot_s: "bund lag", - sl_lbot_l: "antallet af faste lag\nder skal lægges i\nbunden af en print", - ad_adap_s: "fleksibel", - ad_adap_l: "brug adaptive laghøjder\nmed 'laghøjde' som maks\nog 'lag min' som minimum", + lo_menu: "fordeling", - // FDM SHELLS - sl_shel_s: "antal skaller", - sl_shel_l: "antal omkredse\nvægge, der skal genereres", - sl_ordr_s: "skal rækkefølge", - sl_ordr_l: "output shell rækkefølge\nindvendigt til udvendigt\neller udvendigt til indvendigt\npåvirker overfladekvaliteten", - sl_strt_s: "lag start", - sl_strt_l: "lagets startpunkt\nsidste = sidste lag slut\ncenter = del center\nudgangspunkt = delens udgangspunkt", - ad_thin_s: "tynde vægge", - ad_thin_l: "opdage og udfylde huller\nmellem vægge", + pt_menu: "dele", + pt_deci_s: "decimer", + pt_deci_l: ["aktivere eller deaktivere punktdecimering","under portimport. for hurtigere hebandling","og lavere hukommelsesforbrug"], + pt_qual_s: "kvalitet", + pt_qual_l: ["detaljeringsniveau, der","skal bevares under behandling"," lavere er hurtigere"], + pt_heal_s: "reparer medeller", + pt_heal_l: ["forsøg på at reparere","ikke-manifold modeller","forøger slice tid"], - // FDM FILL - fi_menu: "fylde", - fi_type: "type", - fi_pcnt_s: "brøkdel", - fi_pcnt_l: "fylde densitet værdier\n0.0 - 1.0", - fi_angl_s: "startvinkel", - fi_angl_l: "bund vinkel i grader", - fi_over_s: "overlap", - fi_over_l: "overlap as fyldet og skallen\nsom % af dysen bredde\nhøjere binder bedre\n0.0 - 1.0", + xp_menu: "eksporteringer", - // FDM FIRST LAYER - fl_menu: "bund", - fl_lahi_s: "laghøjde", - fl_lahi_l: "højde af hver lag\ni millimeter\nskulle være >= laghøjde", - fl_rate_s: "skal hastighed", - fl_rate_l: "max hastighed på skaller\ni millimeter / minuttet", - fl_frat_s: "fylde hastighed", - fl_frat_l: "fylde max print hastighed\ni millimeter / minuttet", - fl_mult_s: "print factor", - fl_mult_l: "ekstrudering multiplikator\n0.0 - 2.0", - fl_sfac_s: "width factor", - fl_sfac_l: "dyse strørrelse multiplikator\nændre linjeafstanden", - fl_zoff_s: "lag forskydning", - fl_zoff_l: "højde forskydning fra bælte\naf laveste ekstrudering\ni millimeter", - fl_brim_s: "skygge størrelse", - fl_brim_l: "tilføj skygge til delens bund\nstørrelsen er bredden i millimeter\n0 for at deaktivere", - fl_skrt_s: "antal skørter", - fl_skrt_l: "antal første lag udvidelser\nskørter at generere", - fl_skro_s: "skirt offset", - fl_skro_l: "skirt offset from part\nin millimeters", - fl_nozl_s: "dyse temp", - fl_nozl_l: "grader i celsius\noutput indstillingen bruges\nhvis denne er nul", - fl_bedd_s: "plade temp", - fl_bedd_l: "grader i celsius\noutput indstillingen bruges\nhvis denne er nul", - fr_spac_s: "flåde mellemrum", - fr_spac_l: "ekstra afstand\nmellem første lag og flåden\ni millimeter", - fr_nabl_s: "slå flåde til", - fr_nabl_l: "lav en flåde under\nmodellen for bedre vedhæftning\nbruger skørte afstand og\nslår skørte fra", + // SETTINGS + se_menu: "profil", + se_load: "indlæs", + se_save: "gem", - // FDM SUPPORT - sp_menu: "støtte", - sp_detect: "registrer", - sp_dens_s: "densitet", - sp_dens_l: "brøkdel 0.0 - 1.0\anbefaledeet 0.15\n0 for at deaktivere", - sp_size_s: "søjle størrelse", - sp_size_l: "søjle bredde\ni millimeter", - sp_offs_s: "del afstand", - sp_offs_l: "afstand til del\ni millimeter", - sp_gaps_s: "mellemrum", - sp_gaps_l: "antal lag\nmellem støtte og del", - sp_span_s: "max bro", - sp_span_l: "maximum ikke-understøttet afstand\n der generere støtte\ni millimeter", - sp_angl_s: "max vinkel", - sp_angl_l: "max overhæng vinkel før\nstøtte søjler genereres", - sp_area_s: "min område", - sp_area_l: "minimum område for\nen støtte søjle\ni millimeter", - sp_xpnd_s: "udvid", - sp_xpnd_l: "udvid støtte område\nudover delen beyond part grænse\ni millimeter", - sp_nozl_s: "ekstruder", - sp_nozl_l: "til multi-ekstruder systemer\nhvor én ekstruder bruges\ntil støtte materiale", - sp_auto_s: "automatisk", - sp_auto_l: "aktiver genereret støtte\ved brug af 'at-slice-time' geometri\nstøtte vil først laves\nefter slicing er færdig", + // FDM SLICING + sl_menu: "lag", + sl_lahi_s: "højde", + sl_lahi_l: ["højden af hver","lag i milimeter"], + ad_minl_s: "højde min", + ad_minl_l: ["adaptiv min laghøjde","i millimeter","skal være ikke-nul"], + sl_ltop_s: "top lag", + sl_ltop_l: ["antallet af faste lag","der skal lægges på","toppen af en print"], + sl_lsld_s: "faste lag", + sl_lsld_l: ["faste udfyldnigner beregnet","ud fra lag deltaen. se","lag pop op menuen"], + sl_lbot_s: "bund lag", + sl_lbot_l: ["antallet af faste lag","der skal lægges i","bunden af en print"], + ad_adap_s: "fleksibel", + ad_adap_l: ["brug adaptive laghøjder","med 'laghøjde' som maks","og 'lag min' som minimum"], - // LASER SLICING - ls_offs_s: "forskydning", - ls_offs_l: "juster stråle bredden \ni millimeter", - ls_lahi_s: "højde", - ls_lahi_l: "laghøjde\ni millimeter\n0 = auto/opdag", - ls_lahm_s: "min", - ls_lahm_l: "layer height minimum\nwill merge auto slices\nunder this thickness\nin millimeters", - ls_sngl_s: "enkelt", - ls_sngl_l: "lav kun én omgang\nved den specificerede laghøjde", + // FDM SHELLS + sl_shel_s: "antal skaller", + sl_shel_l: ["antal omkredse","vægge, der skal genereres"], + sl_ordr_s: "skal rækkefølge", + sl_ordr_l: ["output shell rækkefølge","indvendigt til udvendigt","eller udvendigt til indvendigt","påvirker overfladekvaliteten"], + sl_strt_s: "lag start", + sl_strt_l: ["lagets startpunkt","sidste = sidste lag slut","center = del center","udgangspunkt = delens udgangspunkt"], + ad_thin_s: "tynde vægge", + ad_thin_l: ["opdage og udfylde huller","mellem vægge"], - // CNC COMMON terms - cc_tool: "Værktøj", - cc_offs_s: "forskydning", - cc_offs_l: "forskyd værktøj center\n fra valgt sti", - cc_spnd_s: "spindel rpm", - cc_spnd_l: "spindel hastighed i\nrevolutioner / minuttet", - cc_sovr_s: "step over", - cc_sovr_l: "as a brøkdel af\nværktøjsdiameteren", - cc_sdwn_s: "step ned", - cc_sdwn_l: "step ned dybde\nfor hver omgang\ni arbejdsområdets enheder\n0 for at deaktivere", - cc_feed_s: "hastighed", - cc_feed_l: "max skærehastighed i\n arbejdsområdets enheder / minuttet", - cc_plng_s: "dyk hastighed", - cc_plng_l: "max z ake hastighed i\narbejdsområdets enheder / minuttet", + // FDM FILL + fi_menu: "fylde", + fi_type: "type", + fi_pcnt_s: "fylde brøkdel", + fi_pcnt_l: ["fylde densitet værdier","0.0 - 1.0"], + fi_angl_s: "startvinkel", + fi_angl_l: "bund vinkel i grader", + fi_over_s: "overlap", + fi_over_l: ["overlap as fyldet og skallen","som % af dysen bredde","højere binder bedre","0.0 - 1.0"], + // fi_rate_s: "print hastighed", + fi_rate_l: ["ekstruderingshastighed til fylde","indstillet til 0 for at bruge standard","output-printhastigheder"], - // CNC COMMON - cc_menu: "begrændsninger", - cc_flip: "flip", - cc_rapd_s: "xy hastighed", - cc_rapd_l: "max xy rejse hastighed\ni arbejdsområdets enheder / minuttet", - cc_rzpd_s: "z hastighed", - cc_rzpd_l: "max z rejse hastighed \ni arbejdsområdets enheder / minuttet", + // FDM FIRST LAYER + fl_menu: "bund", + fl_lahi_s: "laghøjde", + fl_lahi_l: ["højde af hver lag","i millimeter","skulle være >= laghøjde"], + fl_rate_s: "skal hastighed", + fl_rate_l: ["max hastighed på skaller","i millimeter / minuttet"], + fl_frat_s: "fylde hastighed", + fl_frat_l: ["fylde max print hastighed","i millimeter / minuttet"], + fl_mult_s: "print factor", + fl_mult_l: ["ekstrudering multiplikator","0.0 - 2.0"], + fl_sfac_s: "width factor", + fl_sfac_l: ["dyse strørrelse multiplikator","ændre linjeafstanden"], + fl_zoff_s: "lag forskydning", + fl_zoff_l: ["højde forskydning fra bælte","af laveste ekstrudering","i millimeter"], + fl_brim_s: "skygge størrelse", + fl_brim_l: ["tilføj skygge til delens bund","størrelsen er bredden i millimeter","0 for at deaktivere"], + fl_skrt_s: "antal skørter", + fl_skrt_l: ["antal første lag udvidelser","skørter at generere"], + fl_skro_s: "skirt offset", + fl_skro_l: ["skirt offset from part","in millimeters"], + fl_nozl_s: "dyse temp", + fl_nozl_l: ["grader i celsius","output indstillingen bruges","hvis denne er nul"], + fl_bedd_s: "plade temp", + fl_bedd_l: ["grader i celsius","output indstillingen bruges","hvis denne er nul"], + fr_spac_s: "flåde mellemrum", + fr_spac_l: ["ekstra afstand","mellem første lag og flåden","i millimeter"], + fr_nabl_s: "slå flåde til", + fr_nabl_l: ["lav en flåde under","modellen for bedre vedhæftning","bruger skørte afstand og","slår skørte fra"], - cc_loff_s: "forskydning", - cc_loff_l: "distance fra materialets flade\nfor planing\ni arbejdsområdets enheder", + // FDM BELT ONLY + fl_zoff_s: "bælte forskydning", + fl_zoff_l: ["højde forskudt fra bælte","af laveste ekstrudering","i millimeter"], + fl_brim_s: "skygge størrelse", + fl_brim_l: ["tilføj skygge til delens bund","størrelse er bredde i millimeter","0 for at deaktivere"], + fl_brmn_s: "skygge udløser", + fl_brmn_l: ["kun tilføje bremser, når segmentet","vendt mod bælet er kortere end dette","værdi i millimeter","0 = Uendelig"], + fl_bled_s: "model anker", + fl_bled_l: ["bælte model anker","ved start af print","i millimeter"], - // CNC ROUGHING - cr_menu: "groft", - cr_lsto_s: "efterlad materiale", - cr_lsto_l: "horizontal forskydning fra vertikal flade\nmateriale efterlades til efterbehandling\ni arbejdsområdets enheder", - cr_ease_s: "let ned", - cr_ease_l: "dyk skæring vil\nfølge en spiralform ned eller\nkøre langsomt langs en linært sti", - cr_clrt_s: "ryd top", - cr_clrt_l: "kør en rydning over\ngrændseområdet af delen\nved z = 0", - cr_clrp_s: "ryd hulrum", - cr_clrp_l: "fræs ud gennem lommer\ni stedet for kun omridset", - cr_clrf_s: "ryd flader", - cr_clrf_l: "interpolere trin ned for at\nrydde eventuelle opdagede flade områder", - cr_olin_s: "kun indersider", - cr_olin_l: "begræns skæring til\nindvendige delgrænser", + // FDM SUPPORT + sp_menu: "støtte", + sp_detect: "registrer", + sp_dens_s: "densitet", + sp_dens_l: ["brøkdel 0.0 - 1.0\anbefaledeet 0.15","0 for at deaktivere"], + sp_size_s: "søjle størrelse", + sp_size_l: ["søjle bredde","i millimeter"], + sp_offs_s: "del afstand", + sp_offs_l: ["afstand til del","i millimeter"], + sp_gaps_s: "mellemrum", + sp_gaps_l: ["antal lag","mellem støtte og del"], + sp_span_s: "max bro", + sp_span_l: ["maximum ikke-understøttet afstand"," der generere støtte","i millimeter"], + sp_angl_s: "max vinkel", + sp_angl_l: ["max overhæng vinkel før","støtte søjler genereres"], + sp_area_s: "min område", + sp_area_l: ["minimum område for","en støtte søjle","i millimeter"], + sp_xpnd_s: "udvid", + sp_xpnd_l: ["udvid støtte område","udover delen beyond part grænse","i millimeter"], + sp_nozl_s: "ekstruder", + sp_nozl_l: ["til multi-ekstruder systemer","hvor én ekstruder bruges","til støtte materiale"], + sp_auto_s: "automatisk", + sp_auto_l: ["aktiver genereret støtte\ved brug af 'at-slice-time' geometri","støtte vil først laves","efter slicing er færdig"], - // CNC OUTLINE - co_menu: "omrids", - co_dogb_s: "dogbones", - co_dogb_l: "indsæt dogbone skræinger\nind i indersidens hjørner", - co_wide_s: "bred udskæring", - co_wide_l: "udvide udskæringsstier\nfor deep cuts in hard material", - co_olin_s: "kun indersider", - co_olin_l: "begræns skæring til\nindvendige delgrænser", - co_olot_s: "kun ydersider", - co_olot_l: "begrænse skæring til\nudvendige delgrænser\nsom kan betragtes som skyggeomrids", - co_omit_s: "udelade igennem", - co_omit_l: "eliminer gennemhulninger", - co_olen_s: "aktiver", - co_olen_l: "aktiver omrids skæring", + // LASER SLICING + ls_offs_s: "forskydning", + ls_offs_l: ["juster stråle bredden ","i millimeter"], + ls_lahi_s: "højde", + ls_lahi_l: ["laghøjde","i millimeter","0 = auto/opdag"], + ls_lahm_s: "min", + ls_lahm_l: ["layer height minimum","will merge auto slices","under this thickness","in millimeters"], + ls_sngl_s: "enkelt", + ls_sngl_l: ["lav kun én omgang","ved den specificerede laghøjde"], - // CNC CONTOUR - cn_menu: "kontur", - cf_angl_s: "max vinkel", - cf_angl_l: "vinkler større end dette\nbetragtes som lodrette", - cf_curv_s: "kun kurver", - cf_curv_l: "begrænse lineær oprydning\ntil buede overflader", - cf_olin_s: "kun indersider", - cf_olin_l: "begræns skæring til\nindvendige delgrænser", - cf_linx_s: "aktiver y passering", - cf_linx_l: "lineær y-akse efterbehandling", - cf_liny_s: "aktiver x passering", - cf_liny_l: "lineær x-akse efterbehandling", + // CNC COMMON terms + cc_tool: "Værktøj", + cc_offs_s: "forskydning", + cc_offs_l: ["forskyd værktøj center"," fra valgt sti"], + cc_spnd_s: "spindel rpm", + cc_spnd_l: ["spindel hastighed i","revolutioner / minuttet"], + cc_sovr_s: "step over", + cc_sovr_l: ["as a brøkdel af","værktøjsdiameteren"], + cc_sdwn_s: "step ned", + cc_sdwn_l: ["step ned dybde","for hver omgang","i arbejdsområdets enheder","0 for at deaktivere"], + cc_feed_s: "hastighed", + cc_feed_l: ["max skærehastighed i"," arbejdsområdets enheder / minuttet"], + cc_plng_s: "dyk hastighed", + cc_plng_l: ["max z ake hastighed i","arbejdsområdets enheder / minuttet"], + cc_sngl_s: "vælg kun linjer", + cc_sngl_l: ["vælg kun enkelte kanter","i stedet for forbundede polyliner"], - // CNC TRACE - cu_menu: "spor", - cu_type_s: "type", - cu_type_l: "følg = værktøjsspids følger linje\ntil højre eller venstre = værktøjsspids\nfølger linje forskudt efter værktøjsradius", + // CNC COMMON + cc_menu: "begrændsninger", + cc_flip: "flip", + cc_rapd_s: "xy hastighed", + cc_rapd_l: ["max xy rejse hastighed","i arbejdsområdets enheder / minuttet"], + cc_rzpd_s: "z hastighed", + cc_rzpd_l: ["max z rejse hastighed ","i arbejdsområdets enheder / minuttet"], - // CNC DRILLING - cd_menu: "bore", - cd_axis: "akse", - cd_points: "punkter", - cd_plpr_s: "dyk per", - cd_plpr_l: "max dyk mellem\ndvale perioden\ni arbejdsområdets enheder\n0 for at deaktivere", - cd_dwll_s: "dvale tid", - cd_dwll_l: "dvale tid\nmellem dyk\ni millisekunder", - cd_lift_s: "løft bor", - cd_lift_l: "løft mellem dyk\nefter opholdsperiode\ni arbejdsområdets enheder\n0 for at deaktivere", - cd_regi_s: "registrer", - cd_regi_l: "bore registreringshuller\ntil dobbeltsidede dele\nuafhængigt af aktivering af\nboring, men bruger samme værktøj og indstillinger", + cc_loff_s: "forskydning", + cc_loff_l: ["distance fra materialets flade","for planing","i arbejdsområdets enheder"], - // CNC CUTOUT TABS - ct_menu: "tapper", - ct_angl_s: "vinkel", - ct_angl_l: "startvinkel for tapmellemrum\ni grader (0-360)", - ct_numb_s: "antal", - ct_numb_l: "antal tapper der skal bruges\nbliver fordelt jævnt\nomkring delen", - ct_wdth_s: "bredde", - ct_wdth_l: "bredde i arbejdsområdets enheder", - ct_hght_s: "højde", - ct_hght_l: "højde i arbejdsområdets enheder", - ct_dpth_s: "dybde", - ct_dpth_l: "distance arbejdsområdets enheder\nsom tappen projekteres fra\ndelens flade", - ct_midl_s: "midtlinje", - ct_midl_l: "brug midterlinjen på tappen\ni stedet for z-bunden\ntil dobbeltsidet arbejde", - ct_nabl_s: "auto", - ct_nabl_l: "generer automatisk radiale tapper\nprojekteret fra delens center\nved hjælp af optælling og vinkelforskydning", + // CNC ROUGHING + cr_menu: "groft", + cr_lsto_s: "efterlad materiale", + cr_lsto_l: ["horizontal forskydning fra vertikal flade","materiale efterlades til efterbehandling","i arbejdsområdets enheder"], + cr_ease_s: "let ned", + cr_ease_l: ["dyk skæring vil","følge en spiralform ned eller","køre langsomt langs en linært sti"], + cr_clrt_s: "ryd top", + cr_clrt_l: ["kør en rydning over","grændseområdet af delen","ved z = 0"], + cr_clrp_s: "ryd hulrum", + cr_clrp_l: ["fræs ud gennem lommer","i stedet for kun omridset"], + cr_clrf_s: "ryd flader", + cr_clrf_l: ["interpolere trin ned for at","rydde eventuelle opdagede flade områder"], + cr_olin_s: "kun indersider", + cr_olin_l: ["begræns skæring til","indvendige delgrænser"], - // OUTPUT - ou_menu: "output", + // CNC OUTLINE + co_menu: "omrids", + co_dogb_s: "dogbones", + co_dogb_l: ["indsæt dogbone skræinger","ind i indersidens hjørner"], + co_wide_s: "bred udskæring", + co_wide_l: ["udvide udskæringsstier","for deep cuts in hard material"], + co_olin_s: "kun indersider", + co_olin_l: ["begræns skæring til","indvendige delgrænser"], + co_olot_s: "kun ydersider", + co_olot_l: ["begrænse skæring til","udvendige delgrænser","som kan betragtes som skyggeomrids"], + co_omit_s: "udelade igennem", + co_omit_l: "eliminer gennemhulninger", + co_olen_s: "aktiver", + co_olen_l: "aktiver omrids skæring", - // LASER KNIFE - dk_menu: "kniv", - dk_dpth_s: "skæredybde", - dk_dpth_l: "endelig skæredybde\ni millimeter", - dk_pass_s: "skærepasseringer", - dk_pass_l: "antal passeringer\nned for at skære dybde", - dk_offs_s: "spids forskydning", - dk_offs_l: "afstand fra knivspids\ntil midten af værktøjet\ni millimeter", + // CNC CONTOUR + cn_menu: "kontur", + cf_angl_s: "max vinkel", + cf_angl_l: ["vinkler større end dette","betragtes som lodrette"], + cf_curv_s: "kun kurver", + cf_curv_l: ["begrænse lineær oprydning","til buede overflader"], + cf_olin_s: "kun indersider", + cf_olin_l: ["begræns skæring til","indvendige delgrænser"], + cf_linx_s: "aktiver y passering", + cf_linx_l: "lineær y-akse efterbehandling", + cf_liny_s: "aktiver x passering", + cf_liny_l: "lineær x-akse efterbehandling", - // OUTPUT LASER - ou_spac_s: "mellemrum", - ou_spac_l: "afstand mellem lagoutput\ni millimeter", - ou_scal_s: "skalering", - ou_scal_l: "multiplikator (0.1 to 100)", - ou_powr_s: "kraft", - ou_powr_l: "0 - 100\nrepræsenterer %", - ou_sped_s: "hastighed", - ou_sped_l: "millimeter / minuttet", - ou_mrgd_s: "sammensæt", - ou_mrgd_l: "flet alle lag ved hjælp af\nfarvekodning for at betegne\nstabeldybde", - ou_grpd_s: "grupperet", - ou_grpd_l: "bevarer hvert lag som\nen samlet gruppering\ni stedet for adskilt\npolygoner", - ou_layr_s: "lagrækkefølge", - ou_layr_l: "outputlagsrækkefølge\nfra øverst til højre til\nnederst til venstre", - ou_layo_s: "lagfarve", - ou_layo_l: "outputlagsfarver\nfor hvert z-indeks\noverskrævet af sammensætning", - ou_drkn_s: "træk kniv", - ou_drkn_l: "aktiver trækkniv\noutput i gcode\nskårne radier tilføjes\ntil hjørner med\nnedskæringspasseringer", + // CNC TRACE + cu_menu: "spor", + cu_type_s: "type", + cu_type_l: ["følg = værktøjsspids følger linje","til højre eller venstre = værktøjsspids","følger linje forskudt efter værktøjsradius"], - // OUTPUT FDM - ou_nozl_s: "dyse temp", - ou_nozl_l: "grader i celsius", - ou_bedd_s: "plade temp", - ou_bedd_l: "grader i celsius", - ou_feed_s: "print hastighed", - ou_feed_l: "max print hastighed\nmillimeter / minuttet", - ou_fini_s: "afslutningshastighed", - ou_fini_l: "yderste skalhastighed\nmillimeter / minuttet", - ou_move_s: "print hastighed", - ou_move_l: "rejsehastighed\nmillimeter / minuttet\n0 = aktiver G0 bevægelser", - ou_shml_s: "skal faktor", - ou_flml_s: "solid faktor", - ou_spml_s: "fylde faktor", - ou_exml_l: "ekstruderingsmultiplikator\n0.0 - 2.0", - ou_fanl_s: "blæser lag", - ou_fanl_l: "laget hvor blæseren aktiveres", + // CNC DRILLING + cd_menu: "bore", + cd_axis: "akse", + cd_points: "punkter", + cd_plpr_s: "dyk per", + cd_plpr_l: ["max dyk mellem","dvale perioden","i arbejdsområdets enheder","0 for at deaktivere"], + cd_dwll_s: "dvale tid", + cd_dwll_l: ["dvale tid","mellem dyk","i millisekunder"], + cd_lift_s: "løft bor", + cd_lift_l: ["løft mellem dyk","efter opholdsperiode","i arbejdsområdets enheder","0 for at deaktivere"], + cd_regi_s: "registrer", + cd_regi_l: ["bore registreringshuller","til dobbeltsidede dele","uafhængigt af aktivering af","boring, men bruger samme værktøj og indstillinger"], - // OUTPUT CAM - ou_toll_s: "tolerance", - ou_toll_l: "overfladepræcision\ni arbejdsområdets enheder\nlavere er langsommere og\nbruger mere hukommelse\n0 = automatisk baseret\npå animation præference", - ou_zanc_s: "z anker", - ou_zanc_l: "styrer delens position\nnår lager Z overstiger del Z", - ou_ztof_s: "z forskydning", - ou_ztof_l: "forskyd z anker\ni arbejdsområdets enheder\nhar ingen effekt når\nanker er i midten", - ou_zbot_s: "z bottom", - ou_zbot_l: "afstand fra delens bund\n til begrænset skære dybde\ni arbejdsområdets enheder", - ou_zclr_s: "z frihøjde", - ou_zclr_l: "sikker rejse forskydning\nfra toppen af delen\ni arbejdsområdets enheder", - ou_ztru_s: "z gennem", - ou_ztru_l: "forlæng udskæringen nedad\ni arbejdsområdets enheder", - ou_conv_s: "konventionel", - ou_conv_l: "fræsningsretning\nfjern markeringen for 'stigning'", - ou_depf_s: "dybde først", - ou_depf_l: "optimer lommee skæringer\n med dybde prioritet", + // CNC CUTOUT TABS + ct_menu: "tapper", + ct_angl_s: "vinkel", + ct_angl_l: ["startvinkel for tapmellemrum","i grader (0-360)"], + ct_numb_s: "antal", + ct_numb_l: ["antal tapper der skal bruges","bliver fordelt jævnt","omkring delen"], + ct_wdth_s: "bredde", + ct_wdth_l: "bredde i arbejdsområdets enheder", + ct_hght_s: "højde", + ct_hght_l: "højde i arbejdsområdets enheder", + ct_dpth_s: "dybde", + ct_dpth_l: ["distance arbejdsområdets enheder","som tappen projekteres fra","delens flade"], + ct_midl_s: "midtlinje", + ct_midl_l: ["brug midterlinjen på tappen","i stedet for z-bunden","til dobbeltsidet arbejde"], + ct_nabl_s: "auto", + ct_nabl_l: ["generer automatisk radiale tapper","projekteret fra delens center","ved hjælp af optælling og vinkelforskydning"], - // CAM STOCK - cs_menu: "materiale", - cs_wdth_s: "bredde", - cs_wdth_l: "bredde (x) i arbejdsområdets enheder\n0 er standard sat til delens størrelse", - cs_dpth_s: "dybde", - cs_dpth_l: "dybde (y) i arbejdsområdets enheder\n0 er standard sat til delens størrelse", - cs_hght_s: "højde", - cs_hght_l: "højde (z) i arbejdsområdets enheder\n0 er standard sat til delens størrelse", - cs_offs_s: "forskydning", - cs_offs_l: "brug bredde, dybde, højde\n som astand fra max\ndelstørrelse på platformen", - cs_clip_s: "fastgør til", - cs_clip_l: "groft og omrids\nfastgør skærestier\ntil defineret materiale", - cs_offe_s: "aktiver", - cs_offe_l: "aktiver fræsemateriale", + // OUTPUT + ou_menu: "output", - // ORIGIN (CAM & LASER) - or_bnds_s: "udgangspunkt grænser", - or_bnds_l: "udgangspunkt er relativt til\ngrænserne af alle objekter", - or_cntr_s: "udgangspunkt center", - or_cntr_l: "udgangspunkt er refereret til fra centrum", - or_topp_s: "udgangspunkt top", - or_topp_l: "udgangspunkt er refereretfra toppen af objektet", + // LASER KNIFE + dk_menu: "kniv", + dk_dpth_s: "skæredybde", + dk_dpth_l: ["endelig skæredybde","i millimeter"], + dk_pass_s: "skærepasseringer", + dk_pass_l: ["antal passeringer","ned for at skære dybde"], + dk_offs_s: "spids forskydning", + dk_offs_l: ["afstand fra knivspids","til midten af værktøjet","i millimeter"], - // FDM ADVANCED - ad_menu: "ekpert", - ad_rdst_s: "tilbagetræk afstand", - ad_rdst_l: "mængden af tilbagetrukket filament\nfor lange rejser. i millimeter", - ad_rrat_s: "tilbagetræk hastighed", - ad_rrat_l: "hastigheden på filamentet\ni et tilbagetræk i mm/s", - ad_rdwl_s: "påbegynd dvale", - ad_rdwl_l: "tid mellem genopstart af\nfilament og bevægelser\ni millisekunder", - ad_scst_s: "skal trykudligning", - ad_scst_l: "ikke printende ende\naf en skal omkreds\ni millimeter", - ad_msol_s: "min solid", - ad_msol_l: "minimumsareal (mm^2)\nkræves for at holde solid\nskal være > 0.1", - ad_mins_s: "min hastighed", - ad_mins_l: "minimum hastighed\nfor korte sektioner", - ad_spol_s: "langsomme polygoner", - ad_spol_l: "polygoner kortere end dette\nhar deres printhastighed\nnedskaleret til min. hastighed\ni millimeter", - ad_zhop_s: "z hop dist", - ad_zhop_l: "mængden z skal hæves\ikke tilbagetrækning bevægelser\ni millimeter\n0 for at deaktivere", - ad_abkl_s: "anti-tilbageslag", - ad_abkl_l: "brug mikrobevægelser til at annullere\ntilbageslag mens der fyldes\ni millimeter", - ad_lret_s: "lag tilbagetræk", - ad_lret_l: "tving filament tilbagetræk\nmellem lag", - ad_play_s: "polish layers", - ad_play_l: "polish up to specified\n# of layers at a time", - ad_pspd_s: "polish speed", - ad_pspd_l: "polishing speed\nin millimeters / minute", + // OUTPUT LASER + ou_spac_s: "mellemrum", + ou_spac_l: ["afstand mellem lagoutput","i millimeter"], + ou_scal_s: "skalering", + ou_scal_l: "multiplikator (0.1 to 100)", + ou_powr_s: "kraft", + ou_powr_l: ["0 - 100","repræsenterer %"], + ou_sped_s: "hastighed", + ou_sped_l: "millimeter / minuttet", + ou_mrgd_s: "sammensæt", + ou_mrgd_l: ["flet alle lag ved hjælp af","farvekodning for at betegne","stabeldybde"], + ou_grpd_s: "grupperet", + ou_grpd_l: ["bevarer hvert lag som","en samlet gruppering","i stedet for adskilt","polygoner"], + ou_layr_s: "lagrækkefølge", + ou_layr_l: ["outputlagsrækkefølge","fra øverst til højre til","nederst til venstre"], + ou_layo_s: "lagfarve", + ou_layo_l: ["outputlagsfarver","for hvert z-indeks","overskrævet af sammensætning"], + ou_drkn_s: "træk kniv", + ou_drkn_l: ["aktiver trækkniv","output i gcode","skårne radier tilføjes","til hjørner med","nedskæringspasseringer"], - // CAM EXPERT - cx_fast_s: "spring skygge over", - cx_fast_l: "deaktiver detektering af overhæng\nkan være hurtigere og bruge mindre\nhukommelse med komplekse modeller\nmen mislykkes med udhæng\nprøv at aktivere, hvis slicer\nhænger under skygge", + // OUTPUT FDM + ou_nozl_s: "dyse temp", + ou_nozl_l: "grader i celsius", + ou_bedd_s: "plade temp", + ou_bedd_l: "grader i celsius", + ou_feed_s: "print hastighed", + ou_feed_l: ["max print hastighed","millimeter / minuttet"], + ou_fini_s: "afslutningshastighed", + ou_fini_l: ["yderste skalhastighed","millimeter / minuttet"], + ou_move_s: "print hastighed", + ou_move_l: ["rejsehastighed","millimeter / minuttet","0 = aktiver G0 bevægelser"], + ou_shml_s: "skal faktor", + ou_flml_s: "solid faktor", + ou_spml_s: "fylde faktor", + ou_exml_l: ["ekstruderingsmultiplikator","0.0 - 2.0"], + // ou_fanl_s: "blæser lag", + // ou_fanl_l: "laget hvor blæseren aktiveres", + ou_fans_s: "blæser hastighed", + ou_fans_l: "0 - 255", - // FDM GCODE - ag_menu: "gkode", - ag_nozl_s: "dyse", - ag_nozl_l: "vælg output dyse eller hoved", - ag_paws_s: "pause lag", - ag_paws_l: "kommasepareret liste over lag\nder skal indsættet pause kommandoer før", - ag_loop_s: "loop lag", - ag_loop_l: "lagintervaller, der skal gentages i formatet\nførste-sidste-optælling,første-sidste-optælling,...\nudeladt antal = 1", + // OUTPUT CAM + ou_toll_s: "tolerance", + ou_toll_l: ["overfladepræcision","i arbejdsområdets enheder","lavere er langsommere og","bruger mere hukommelse","0 = automatisk baseret","på animation præference"], + ou_zanc_s: "z anker", + ou_zanc_l: ["styrer delens position","når lager Z overstiger del Z"], + ou_ztof_s: "z forskydning", + ou_ztof_l: ["forskyd z anker","i arbejdsområdets enheder","har ingen effekt når","anker er i midten"], + ou_zbot_s: "z bottom", + ou_zbot_l: ["afstand fra delens bund"," til begrænset skære dybde","i arbejdsområdets enheder"], + ou_zclr_s: "z frihøjde", + ou_zclr_l: ["sikker rejse forskydning","fra toppen af delen","i arbejdsområdets enheder"], + ou_ztru_s: "z gennem", + ou_ztru_l: ["forlæng udskæringen nedad","i arbejdsområdets enheder"], + ou_conv_s: "konventionel", + ou_conv_l: ["fræsningsretning","fjern markeringen for 'stigning'"], + ou_depf_s: "dybde først", + ou_depf_l: ["optimer lommee skæringer"," med dybde prioritet"], - // SLA MENU - sa_menu: "slicing", - sa_lahe_s: "laghøjde", - sa_lahe_l: "laghøjdet\ni millimeter", - sa_shel_s: "hul skal", - sa_shel_l: "skaltykkelse i mm\nBrug flere af lagets højde\nbrug 0 for solid (deaktiveret)", - sa_otop_s: "åben top", - sa_otop_l: "hvis skal er aktiveret\nresulterer i en åben top", - sa_obas_s: "åben bund", - sa_obas_l: "hvis skal er aktiveret\nresulterer i en åben bund\ndeaktiveret med understøtninger", + // CAM STOCK + cs_menu: "materiale", + cs_wdth_s: "bredde", + cs_wdth_l: ["bredde (x) i arbejdsområdets enheder","0 er standard sat til delens størrelse"], + cs_dpth_s: "dybde", + cs_dpth_l: ["dybde (y) i arbejdsområdets enheder","0 er standard sat til delens størrelse"], + cs_hght_s: "højde", + cs_hght_l: ["højde (z) i arbejdsområdets enheder","0 er standard sat til delens størrelse"], + cs_offs_s: "forskydning", + cs_offs_l: ["brug bredde, dybde, højde"," som astand fra max","delstørrelse på platformen"], + cs_clip_s: "fastgør til", + cs_clip_l: ["groft og omrids","fastgør skærestier","til defineret materiale"], + cs_offe_s: "aktiver", + cs_offe_l: "aktiver fræsemateriale", - sa_layr_m: "lag", - sa_lton_s: "lys tændt tid", - sa_lton_l: "lys tændt tid\ntid i sekunder", - sa_ltof_s: "lys slukket tid", - sa_ltof_l: "lys slukket tid\ntid i sekunder", - sa_pldi_s: "skræl afstand", - sa_pldi_l: "skræl afstand\ni millimeter", - sa_pllr_s: "afskalningshastighed", - sa_pllr_l: "afskalningshastighed\ni mm/sek", - sa_pldr_s: "afskalningshastighed drop", - sa_pldr_l: "afskalningshastighed drop\ni mm/sek", + // ORIGIN (CAM & LASER) + or_bnds_s: "udgangspunkt grænser", + or_bnds_l: ["udgangspunkt er relativt til","grænserne af alle objekter"], + or_cntr_s: "udgangspunkt center", + or_cntr_l: "udgangspunkt er refereret til fra centrum", + or_topp_s: "udgangspunkt top", + or_topp_l: "udgangspunkt er refereretfra toppen af objektet", - sa_base_m: "bund", - sa_balc_s: "antal lag", - sa_balc_l: "antal\nbundlag", - sa_bltn_l: "bundlag lys tændt\ntid i sekunder", - sa_bltf_l: "bundlag lys slukket\ntid i sekunder", + // FDM ADVANCED + ad_menu: "ekpert", + ad_rdst_s: "tilbagetræk afstand", + ad_rdst_l: ["mængden af tilbagetrukket filament","for lange rejser. i millimeter"], + ad_rrat_s: "tilbagetræk hastighed", + ad_rrat_l: ["hastigheden på filamentet","i et tilbagetræk i mm/s"], + ad_rdwl_s: "påbegynd dvale", + ad_wpln_s: "tilbagetræk aftørring", + ad_wpln_l: ["ikke-printbevægelse","efter tilbagetræk","i millimeter"], + ad_rdwl_l: ["tid mellem genopstart af","filament og bevægelser","i millisekunder"], + ad_scst_s: "skal trykudligning", + ad_scst_l: ["ikke-printende ende","af en skal omkreds","i millimeter"], + ad_msol_s: "min solid", + ad_msol_l: ["minimumsareal (mm^2)","kræves for at holde solid","skal være > 0.1"], + ad_mins_s: "min hastighed", + ad_mins_l: ["minimum hastighed","for korte sektioner"], + ad_spol_s: "korte polygoner", + ad_spol_l: ["polygoner kortere end dette","har deres printhastighed","nedskaleret til min. hastighed","i millimeter"], + ad_arct_s: "bue tolerance", + ad_arct_l: ["konverter facetterede linjer til buer","center point drift tolerance","når matchende buepunkter","overvej værdier omkring 0,15","i millimeter","0 for at deaktivere"], + ad_zhop_s: "z hop dist", + ad_zhop_l: ["mængden z skal hæves\ikke tilbagetrækning bevægelser","i millimeter","0 for at deaktivere"], + ad_abkl_s: "anti-tilbageslag", + ad_abkl_l: ["brug mikrobevægelser til at annullere","tilbageslag mens der fyldes","i millimeter"], + ad_lret_s: "lag tilbagetræk", + ad_lret_l: ["tving filament tilbagetræk","mellem lag"], + ad_play_s: "polish layers", + ad_play_l: ["polish up to specified","# of layers at a time"], + ad_pspd_s: "polish speed", + ad_pspd_l: ["polishing speed","in millimeters / minute"], - sa_infl_m: "fylde", - sa_ifdn_s: "densitet", - sa_ifdn_l: "procent udfyldning\nkræver skal\n0 = deaktiveret\ngyldig 0.0 - 1.0", - sa_iflw_s: "linjebredde", - sa_iflw_l: "luge linjebredde\ni millimeter", + // CAM EXPERT + cx_fast_s: "spring skygge over", + cx_fast_l: ["deaktiver detektering af overhæng","kan være hurtigere og bruge mindre","hukommelse med komplekse modeller","men mislykkes med udhæng","prøv at aktivere, hvis slicer","hænger under skygge"], - sa_supp_m: "støtte", - sa_slyr_s: "bundlag", - sa_slyr_l: "bund støtte lag\nværdiområde 0-10", - sa_slgp_s: "mellemrum", - sa_slgp_l: "antal lag mellem\nflåde og bund på objektet", - sa_sldn_s: "densitet", - sa_sldn_l: "bruges til at beregne\nantal støttesøjler\n0.0-1.0 (0 = deaktiver)", - sa_slsz_s: "størrelse", - sa_slsz_l: "maks. størrelse på en\nstøtte søjle\ni millimeter", - sa_slpt_s: "punkter", - sa_slpt_l: "antal punkter i\nhver støttesøjle\ni millimeter", - sl_slen_l: "aktiver understøtte", + // FDM GCODE + ag_menu: "gkode", + ag_nozl_s: "dyse", + ag_nozl_l: "vælg output dyse eller hoved", + ag_paws_s: "pause lag", + ag_paws_l: ["kommasepareret liste over lag","der skal indsættet pause kommandoer før"], + ag_loop_s: "loop lag", + ag_loop_l: ["lagintervaller, der skal gentages i formatet","første-sidste-optælling,første-sidste-optælling,...","udeladt antal = 1"], - sa_outp_m: "output", - sa_opzo_s: "z forskydning", - sa_opzo_l: "z lagforskydning\nalmost always 0.0\n0.0-1.0 in millimeters", - sa_opaa_s: "anti alias", - sa_opaa_l: "aktivere anti-aliasing\nproducerer større filer\nkan sløre detaljer" - }; + // SLA MENU + sa_menu: "slicing", + sa_lahe_s: "laghøjde", + sa_lahe_l: ["laghøjdet","i millimeter"], + sa_shel_s: "hul skal", + sa_shel_l: ["skaltykkelse i mm","Brug flere af lagets højde","brug 0 for solid (deaktiveret)"], + sa_otop_s: "åben top", + sa_otop_l: ["hvis skal er aktiveret","resulterer i en åben top"], + sa_obas_s: "åben bund", + sa_obas_l: ["hvis skal er aktiveret","resulterer i en åben bund","deaktiveret med understøtninger"], + + sa_layr_m: "lag", + sa_lton_s: "lys tændt tid", + sa_lton_l: ["lys tændt tid","tid i sekunder"], + sa_ltof_s: "lys slukket tid", + sa_ltof_l: ["lys slukket tid","tid i sekunder"], + sa_pldi_s: "skræl afstand", + sa_pldi_l: ["skræl afstand","i millimeter"], + sa_pllr_s: "afskalningshastighed", + sa_pllr_l: ["afskalningshastighed","i mm/sek"], + sa_pldr_s: "afskalningshastighed drop", + sa_pldr_l: ["afskalningshastighed drop","i mm/sek"], + + sa_base_m: "bund", + sa_balc_s: "antal lag", + sa_balc_l: ["antal","bundlag"], + sa_bltn_l: ["bundlag lys tændt","tid i sekunder"], + sa_bltf_l: ["bundlag lys slukket","tid i sekunder"], + + sa_infl_m: "fylde", + sa_ifdn_s: "densitet", + sa_ifdn_l: ["procent udfyldning","kræver skal","0 = deaktiveret","gyldig 0.0 - 1.0"], + sa_iflw_s: "linjebredde", + sa_iflw_l: ["luge linjebredde","i millimeter"], + + sa_supp_m: "støtte", + sa_slyr_s: "bundlag", + sa_slyr_l: ["bund støtte lag","værdiområde 0-10"], + sa_slgp_s: "mellemrum", + sa_slgp_l: ["antal lag mellem","flåde og bund på objektet"], + sa_sldn_s: "densitet", + sa_sldn_l: ["bruges til at beregne","antal støttesøjler","0.0-1.0 (0 = deaktiver)"], + sa_slsz_s: "størrelse", + sa_slsz_l: ["maks. størrelse på en","støtte søjle","i millimeter"], + sa_slpt_s: "punkter", + sa_slpt_l: ["antal punkter i","hver støttesøjle","i millimeter"], + sl_slen_l: "aktiver understøtte", + + sa_outp_m: "output", + sa_opzo_s: "z forskydning", + sa_opzo_l: ["z lagforskydning","almost always 0.0","0.0-1.0 in millimeters"], + sa_opaa_s: "anti alias", + sa_opaa_l: ["aktivere anti-aliasing","producerer større filer","kan sløre detaljer"] +}; From 552b04a27ae173540ec9facebf956e893dc27850 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 28 Feb 2021 16:35:06 -0500 Subject: [PATCH 185/255] fixes #119 vase mode base --- src/mode/fdm/slice.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index ee43ea86..f802cafc 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -279,11 +279,10 @@ forSlices(0.0, 0.2, slice => { let params = getRangeParameters(settings, slice.index); let first = slice.index === 0; - let solid = ( - slice.index < spro.sliceBottomLayers || - slice.index > slices.length - spro.sliceTopLayers-1 || - params.sliceFillSparse > 0.95 - ) && !vaseMode && !isSynth; + let isBottom = slice.index < spro.sliceBottomLayers; + let isTop = slice.index > slices.length - spro.sliceTopLayers-1; + let isDense = params.sliceFillSparse > 0.98; + let solid = (isBottom || ((isTop || isDense) && !vaseMode)) && !isSynth; let spaceMult = first ? spro.firstLayerLineMult || 1 : 1; let offset = shellOffset * spaceMult; let fillOff = fillOffset * spaceMult; From dc066d6da92f57850df91dd814fee8b3d653b255 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 28 Feb 2021 16:56:07 -0500 Subject: [PATCH 186/255] allow partial context menu in non-arrange views --- src/kiri/init.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/kiri/init.js b/src/kiri/init.js index c45ae116..850d1469 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -2223,7 +2223,11 @@ }; SPACE.mouse.up((event, int) => { - if (event.button === 2 && API.view.isArrange()) { + if (event.button === 2) { + let full = API.view.isArrange(); + for (let key of ["layflat","mirror","duplicate"]) { + $(`context-${key}`).disabled = !full; + } let style = UI.context.style; style.display = 'flex'; style.left = `${event.clientX-3}px`; From 341eed54e755a7fb53787dad927d47d21c7c53f3 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 28 Feb 2021 20:42:00 -0500 Subject: [PATCH 187/255] prevent supports from going below z=0 --- src/mode/fdm/client.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/mode/fdm/client.js b/src/mode/fdm/client.js index c7b10bb0..62942400 100644 --- a/src/mode/fdm/client.js +++ b/src/mode/fdm/client.js @@ -339,8 +339,9 @@ let ws = (wa.support = wa.support || []); let phi = iup[0].point; let plo = idn[0].point; - let mp = (phi.y + plo.y) / 2; - let dy = Math.abs(phi.y - plo.y); + let ply = Math.max(0, plo.y); + let mp = (phi.y + ply) / 2; + let dy = Math.abs(phi.y - ply); let dw = api.conf.get().process.sliceSupportSize / 2; let rec = { rz:angle, x:point.x, y:point.z, z:mp, dw, dh:dy, id }; ws.push(Object.clone(rec)); @@ -390,8 +391,10 @@ if (i2.length && i2.length % 2 === 0) { p2 = i2[0].point; iw = i2[0].object.widget || iw; - let hy = (p1.y + p2.y) / 2; - let dy = Math.abs(p1.y - p2.y); + let p1y = Math.max(0, p1.y); + let p2y = Math.max(0, p2.y); + let hy = (p1y + p2y) / 2; + let dy = Math.abs(p1y - p2y); let dw = api.conf.get().process.sliceSupportSize / 2; addbox({x:p1.x, y:hy, z:p1.z}, 0x0000dd, 'supp', { x:dw, y:dw, z:dy, rz From 36893a32aaf5ef9aac00e487f0521a792acddb3c Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 28 Feb 2021 21:18:43 -0500 Subject: [PATCH 188/255] add support for firmware retractions G10/G11 #fixes #114 --- src/kiri/conf.js | 1 + src/kiri/init.js | 3 +++ src/kiri/main.js | 1 + src/kiri/print.js | 7 +++++++ src/mode/fdm/export.js | 13 +++++++++++-- web/kiri/lang/en.js | 2 ++ 6 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/kiri/conf.js b/src/kiri/conf.js index 31223651..6e8acd7f 100644 --- a/src/kiri/conf.js +++ b/src/kiri/conf.js @@ -261,6 +261,7 @@ bedHeight: 2.5, bedRound: false, bedBelt: false, + fwRetract: false, originCenter: false, maxHeight: 150, gcodePre: [], diff --git a/src/kiri/init.js b/src/kiri/init.js index 850d1469..63b258cd 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -740,6 +740,7 @@ UI.deviceBelt.checked = dev.bedBelt; UI.deviceRound.checked = dev.bedRound; UI.deviceOrigin.checked = dev.outputOriginCenter || dev.originCenter; + UI.fwRetract.checked = dev.fwRetract; // add extruder selection buttons if (dev.extruders) { @@ -781,6 +782,7 @@ UI.deviceOrigin, UI.deviceRound, UI.deviceBelt, + UI.fwRetract, UI.gcodeFan, UI.gcodeTrack, UI.gcodeLayer, @@ -1586,6 +1588,7 @@ deviceOrigin: UC.newBoolean(LANG.dv_orgc_s, onBooleanClick, {title:LANG.dv_orgc_l, modes:FDM_LASER_SLA}), deviceRound: UC.newBoolean(LANG.dv_bedc_s, onBooleanClick, {title:LANG.dv_bedc_l, modes:FDM, trigger:true, show:isNotBelt}), deviceBelt: UC.newBoolean(LANG.dv_belt_s, onBooleanClick, {title:LANG.dv_belt_l, modes:FDM, trigger:true, show:() => !UI.deviceRound.checked}), + fwRetract: UC.newBoolean(LANG.dv_retr_s, onBooleanClick, {title:LANG.dv_retr_l, modes:FDM}), extruder: UC.newGroup(LANG.dv_gr_ext, $('device2'), {group:"dext", inline:true, modes:FDM}), extFilament: UC.newInput(LANG.dv_fila_s, {title:LANG.dv_fila_l, convert:UC.toFloat, modes:FDM}), diff --git a/src/kiri/main.js b/src/kiri/main.js index 334ff7ac..7ca2eb44 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -2224,6 +2224,7 @@ settings.device.bedBelt = UI.deviceBelt.checked; settings.device.bedRound = UI.deviceRound.checked; settings.device.originCenter = UI.deviceOrigin.checked; + settings.device.fwRetract = UI.fwRetract.checked; SDB.setItem('ws-settings', JSON.stringify(settings)); API.event.emit('settings.saved', settings); } diff --git a/src/kiri/print.js b/src/kiri/print.js index a85ea48b..4588705f 100644 --- a/src/kiri/print.js +++ b/src/kiri/print.js @@ -348,6 +348,13 @@ pos[tok.charAt(0)] = parseFloat(tok.substring(1)); }); break; + case 'G10': + console.log('retract'); + seq.last().retract = true; + break; + case 'G11': + console.log('unretract'); + break; case 'G0': G0G1(true, line); break; diff --git a/src/mode/fdm/export.js b/src/mode/fdm/export.js index 987bfa31..652b1e57 100644 --- a/src/mode/fdm/export.js +++ b/src/mode/fdm/export.js @@ -22,6 +22,7 @@ gcodeLayer = device.gcodeLayer, gcodeTrack = device.gcodeTrack, tool = 0, + fwRetract = device.fwRetract, isDanger = settings.controller.danger, isBelt = device.bedBelt, bedType = isBelt ? "belt" : "fixed", @@ -238,7 +239,11 @@ return; } retracted = retDist; - moveTo({e:-retracted}, retSpeed, `e-retract ${retDist}`); + if (fwRetract) { + append('G10'); + } else { + moveTo({e:-retracted}, retSpeed, `e-retract ${retDist}`); + } if (zhop) moveTo({z:zpos + zhop}, seekMMM, "z-hop start"); time += (retDist / retSpeed) * 60 * 2; // retraction time } @@ -440,7 +445,11 @@ // when enabled, resume previous Z if (zhop && pos.z != zpos) moveTo({z:zpos}, seekMMM, "z-hop end"); // re-engage retracted filament - moveTo({e:retracted}, retSpeed, `e-engage ${retracted}`); + if (fwRetract) { + append('G11'); + } else { + moveTo({e:retracted}, retSpeed, `e-engage ${retracted}`); + } retracted = 0; // optional dwell after re-engaging filament to allow pressure to build if (retDwell) dwell(retDwell); diff --git a/web/kiri/lang/en.js b/web/kiri/lang/en.js index 68714f46..5ccefaa0 100644 --- a/web/kiri/lang/en.js +++ b/web/kiri/lang/en.js @@ -102,6 +102,8 @@ kiri.lang['en-us'] = { dv_bedc_l: "device bed is circular", dv_belt_s: "belt bed", dv_belt_l: "continuous printing bed", + dv_retr_s: "firmware retract", + dv_retr_l: ["device fimware supports G10/G11"], dv_fanp_s: "fan power", dv_fanp_l: "set cooling fan power", dv_prog_s: "progress", From 3816f7b51a35d8fc91e394892a117d48053000e4 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 28 Feb 2021 21:19:45 -0500 Subject: [PATCH 189/255] remove comments --- src/kiri/print.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/kiri/print.js b/src/kiri/print.js index 4588705f..e134298f 100644 --- a/src/kiri/print.js +++ b/src/kiri/print.js @@ -349,11 +349,9 @@ }); break; case 'G10': - console.log('retract'); seq.last().retract = true; break; case 'G11': - console.log('unretract'); break; case 'G0': G0G1(true, line); From 520f3ac35ec6e9d9b9f892a87e6d7255e0e1822e Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 28 Feb 2021 22:24:57 -0500 Subject: [PATCH 190/255] fix clear workspace when not in arrange mode --- src/kiri/init.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/kiri/init.js b/src/kiri/init.js index 63b258cd..1afbc298 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -2518,7 +2518,11 @@ // context menu $('context-export-stl').onclick = () => { objectsExport() }; $('context-export-workspace').onclick = () => { profileExport(true) }; - $('context-clear-workspace').onclick = () => { API.platform.clear(); UI.context.onmouseleave() }; + $('context-clear-workspace').onclick = () => { + API.view.set(VIEWS.ARRANGE); + API.platform.clear(); + UI.context.onmouseleave(); + }; $('context-duplicate').onclick = duplicateSelection; $('context-mirror').onclick = mirrorSelection; $('context-layflat').onclick = layFlat; From 3f5ccf5158f84a7d0ea3c399d78ceb62307c74a2 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 1 Mar 2021 00:22:07 -0500 Subject: [PATCH 191/255] checkpoint widget group/ungroup --- src/add/array.js | 4 ++++ src/kiri/init.js | 10 +++++++--- src/kiri/main.js | 46 ++++++++++++++++++++++++++++++++++++---------- src/kiri/widget.js | 25 +++++++++++++++++++++++++ 4 files changed, 72 insertions(+), 13 deletions(-) diff --git a/src/add/array.js b/src/add/array.js index 2c48e292..43e887b1 100644 --- a/src/add/array.js +++ b/src/add/array.js @@ -162,6 +162,10 @@ }) }; + AP.uniq = function() { + return this.slice().sort().filter((x, i, a) => !i || x != a[i-1]); + }; + /** ****************************************************************** * String prototype helpers ******************************************************************* */ diff --git a/src/kiri/init.js b/src/kiri/init.js index 1afbc298..968bd516 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -331,6 +331,12 @@ if (API.feature.on_key) { if (API.feature.on_key({key:evt})) return; } + if (evt.ctrlKey) { + switch (evt.key) { + case 'g': return API.group.merge(); + case 'u': return API.group.split(); + } + } switch (evt.charCode) { case cca('`'): API.show.slices(0); break; case cca('0'): API.show.slices(API.var.layer_max); break; @@ -468,11 +474,9 @@ function duplicateSelection() { API.selection.for_widgets(function(widget) { let mesh = widget.mesh; - mesh.geometry = mesh.geometry.clone(); - mesh.material = mesh.material.clone(); let bb = mesh.getBoundingBox(); let ow = widget; - let nw = API.widgets.new().loadGeometry(mesh.geometry); + let nw = API.widgets.new().loadGeometry(mesh.geometry.clone()); nw.meta.file = ow.meta.file; nw.meta.vertices = ow.meta.vertices; nw.move(bb.max.x - bb.min.x + 1, 0, 0); diff --git a/src/kiri/main.js b/src/kiri/main.js index 7ca2eb44..f0277998 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -80,7 +80,10 @@ scale: scaleSelection, rotate: rotateSelection, meshes: function() { return selectedMeshes.slice() }, - widgets: function() { return selectedMeshes.slice().map(m => m.widget) }, + widgets: function(orall) { + let sel = selectedMeshes.slice().map(m => m.widget); + return sel.length ? sel : orall ? WIDGETS.slice() : [] + }, for_groups: forSelectedGroups, for_meshes: forSelectedMeshes, for_widgets: forSelectedWidgets, @@ -290,6 +293,10 @@ clear: KIRI.client.clear, parse: loadCode }, + group: { + merge: groupMerge, + split: groupSplit, + }, hide: { alert: function(rec) { alert2cancel(rec) }, import: function() { }, @@ -831,13 +838,10 @@ } function forSelectedGroups(f) { - let m = selectedMeshes; - if (m.length === 0 && WIDGETS.length === 1) m = [ WIDGETS[0].mesh ]; - let v = []; - m.slice().forEach(function (mesh) { - if (v.indexOf(mesh.widget.group) < 0) f(mesh.widget); - v.push(mesh.widget.group); - }); + let groups = API.selection.widgets(true).map(w => w.group).uniq(); + for (let group of groups) { + f(group[0]); + } } function forSelectedWidgets(f,noauto) { @@ -1334,6 +1338,14 @@ * Selection Functions ******************************************************************* */ + function groupMerge() { + Widget.Groups.merge(API.selection.widgets(true)); + } + + function groupSplit() { + Widget.Groups.split(API.selection.widgets(false)); + } + function updateSelectedInfo() { let bounds = new THREE.Box3(), track; forSelectedMeshes(mesh => { @@ -1657,10 +1669,17 @@ return settings.bounds = bounds; } - function platformSelect(widget, shift) { + function platformSelect(widget, shift, recurse = true) { if (viewMode !== VIEWS.ARRANGE) { return; } + // apply deselect to entire group + if (recurse && widget && widget.group.length > 1) { + for (let w of widget.group) { + platformSelect(w, true, false); + } + return; + } let mesh = widget.mesh, sel = (selectedMeshes.indexOf(mesh) >= 0); if (sel) { @@ -1735,12 +1754,19 @@ } } - function platformDeselect(widget) { + function platformDeselect(widget, recurse = true) { if (viewMode !== VIEWS.ARRANGE) { // don't de-select and re-color widgets in, // for example, sliced or preview modes return; } + // apply deselect to entire group + if (recurse && widget && widget.group.length > 1) { + for (let w of widget.group) { + platformDeselect(w, false); + } + return; + } if (!widget) { forAllWidgets(function(widget) { platform.deselect(widget); diff --git a/src/kiri/widget.js b/src/kiri/widget.js index 622f2e27..b99137e4 100644 --- a/src/kiri/widget.js +++ b/src/kiri/widget.js @@ -36,6 +36,31 @@ return groups.slice() }, + merge: (widgets) => { + let grps = widgets.map(w => w.group).uniq(); + if (grps.length > 1) { + let root = grps.shift(); + for (let grp of grps) { + for (let w of grp) { + w.group = root; + root.push(w); + } + groups.splice(groups.indexOf(grp),1); + } + } + }, + + split: (widgets) => { + for (let group of widgets.map(w => w.group).uniq()) { + groups.splice(groups.indexOf(group),1); + for (let widget of group) { + let nugroup = Group.forid(widget.id); + nugroup.push(widget); + widget.group = nugroup; + } + } + }, + forid: function(id) { for (let i=0; i Date: Mon, 1 Mar 2021 10:34:15 -0500 Subject: [PATCH 192/255] annotate language with kiri version to prevent cache corruption --- src/kiri/init.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/kiri/init.js b/src/kiri/init.js index 968bd516..2dce901b 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -2561,6 +2561,7 @@ // if a language needs to load, the script is injected and loaded // first. once this loads, or doesn't, the initialization begins + let lang_load = false; let lang_set = undefined; let lang = SETUP.ln ? SETUP.ln[0] : SDB.getItem('kiri-lang') || KIRI.lang.get(); @@ -2570,10 +2571,11 @@ let map = KIRI.lang.map(lang); let scr = DOC.createElement('script'); // scr.setAttribute('defer',true); - scr.setAttribute('src',`/kiri/lang/${map}.js`); + scr.setAttribute('src',`/kiri/lang/${map}.js?${KIRI.version}`); (DOC.body || DOC.head).appendChild(scr); STATS.set('ll',lang); scr.onload = function() { + lang_load = true; KIRI.lang.set(map); UI.lang(); init_one(); @@ -2586,8 +2588,10 @@ // set to browser default which will be overridden // by any future script loads (above) - KIRI.lang.set(); - UI.lang(); + if (!lang_load) { + KIRI.lang.set(); + UI.lang(); + } // schedule init_one to run after all page content is loaded // unless a languge script is loading first, in which case it From 8cb7e67f01e747038b706909ff1a4bf85c9956ab Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 1 Mar 2021 11:06:36 -0500 Subject: [PATCH 193/255] french updates --- web/kiri/lang/fr.js | 76 +++++++++++++++++++++++---------------------- 1 file changed, 39 insertions(+), 37 deletions(-) diff --git a/web/kiri/lang/fr.js b/web/kiri/lang/fr.js index 6deb82cb..9dfc207a 100644 --- a/web/kiri/lang/fr.js +++ b/web/kiri/lang/fr.js @@ -23,10 +23,10 @@ kiri.lang['fr-fr'] = { machine: "machine", // device or machine metric: "métrique", name: "nom", - prefs: "prefs", // left menu "preferences" + prefs: "préfs", // left menu "preferences" preview: "prévisualiser", recent: "récent", - render: "rendre", // left render pop menu + render: "rendu", // left render pop menu reset: "remettre", rotate: "tourner", // left rotate pop menu save: "sauvegarder", @@ -72,10 +72,10 @@ kiri.lang['fr-fr'] = { td_tapr: "cône", // endmill taper specs // DEVICE dialog groups - dv_gr_dev: "machine", - dv_gr_ext: "extrudeuse", + dv_gr_dev: "périphérique", + dv_gr_ext: "extrudeur", dv_gr_out: "sortie", - dv_gr_gco: "gcode macros", + dv_gr_gco: "macros gcode", // DEVICE dialog (_s = label, _l = hover help) dv_name_s: "nom", @@ -102,6 +102,8 @@ kiri.lang['fr-fr'] = { dv_bedc_l: "le plateau du matériel est circulaire", dv_belt_s: "plateau tapis-roulant", dv_belt_l: "plateau à impression continue", + dv_retr_s: "rétraction firmware", + dv_retr_l: ["le firmware supporte G10/G11"], dv_fanp_s: "refroidissement", dv_fanp_l: "régler la puissance du ventilateur de refroidissement", dv_prog_s: "progression", @@ -111,8 +113,8 @@ kiri.lang['fr-fr'] = { dv_tksp_s: "délimiteur d'instruction", dv_tksp_l: ["ajouter un espace","entre les paramètres des axes","G0X0Y0X0","vs","G0 X0 Y0 Z0"], dv_strc_s: "éliminer les commentaires", - dv_strc_l: ["éliminer les commentaires du gcode","commentaires débutent par ;"], - dv_fext_s: "extension de fichier", + dv_strc_l: ["éliminer les commentaires du gcode","les commentaires débutent par ;"], + dv_fext_s: "extension du fichier", dv_fext_l: "extension du nom de fichier", dv_dwll_s: "dwell", dv_dwll_l: "script gcode dwell", @@ -158,7 +160,7 @@ kiri.lang['fr-fr'] = { // LOAD fe_menu: "fichier", - fn_recn: "Récent", + fn_recn: "Récents", fn_impo: "Importer", // FUNCTION @@ -196,7 +198,7 @@ kiri.lang['fr-fr'] = { op_dark_s: "mode sombre", op_dark_l: "interface en mode sombre", op_comp_s: "ui compacte", - op_comp_l: ["interface utilisateur compacte", "meilleure pour les petits écrans", "et tablettes"], + op_comp_l: ["interface utilisateur compacte", "plus adapté aux petits écrans", "et tablettes"], op_shor_s: "montrer l'origine", op_shor_l: "indiquer l'origine du dispositif ou du processus", op_shru_s: "afficher les règles", @@ -216,17 +218,17 @@ kiri.lang['fr-fr'] = { op_line_s: "type de ligne", op_line_l: ["style de ligne pour le rendu","impacte les performances 3d","chemin: 3d meilleur","plat: 2d bon","ligne = 1d rapide"], op_unit_s: "unités", - op_unit_l: ["les unités d'espace de travail affectent","vitesses et distances"], + op_unit_l: ["les unités d'espace de travail affectent".,"vitesses et distances"], op_anim_s: "animer", - op_anim_l: ["densité du maillage de l'animation","plus haut est plus dense","nécessite plus de mémoire","et est plus lent"], + op_anim_l: ["densité du maillage de l'animation","plus haut = plus dense","nécessite plus de mémoire","et est plus lent"], lo_menu: "disposition", pt_menu: "pièces", - pt_deci_s: "decimate", - pt_deci_l: ["enable or disable point decimation","during port import. for faster slicing","and lower memory usage"], + pt_deci_s: "compression", + pt_deci_l: ["activer / désactiver la compression","durant l'importation. Tranchage plus rapide","et usage réduit de la mémoire"], pt_qual_s: "qualité", - pt_qual_l: ["niveau de détail à retenir", "lors des opérations de tranchage", "plus bas, est plus rapide"], + pt_qual_l: ["niveau de détail à garder", "lors des opérations de tranchage", "plus bas = plus rapide"], pt_heal_s: "correction de maillage", pt_heal_l: ["tentative de correction", "des mailles non-fermées", "accroit le temps de tranchage"], @@ -303,7 +305,7 @@ kiri.lang['fr-fr'] = { fl_zoff_s: "décalage bande", fl_zoff_l: ["décalage de hauteur par rapport à la bande", "de l'extrusion la plus basse", "en millimètres"], fl_brim_s: "taille de bordure", - fl_brim_l: ["add brim to part bottom","size is width in millimeters","0 to disable"], + fl_brim_l: ["ajoute une bordure à la partie inférieure","la taille est la largeur en millimètres","0 désactive"], fl_brmn_s: "seuil de bordure", fl_brmn_l: ["ajout de bordures uniquement quand le segment", "face à la bande est plus court que cela", "valeur en millimètres", "0 = infini"], fl_bled_s: "ancrage de pièce", @@ -318,14 +320,14 @@ kiri.lang['fr-fr'] = { sp_size_l: ["largeur du pilier","en millimètres"], sp_offs_s: "décalage du pilier", sp_offs_l: ["décalage par rapport à la pièce","en millimètres"], - sp_gaps_s: "gap layers", + sp_gaps_s: "écart des couches", sp_gaps_l: ["nombre de couches","de décalage de la pièce"], sp_span_s: "portée maximale", sp_span_l: ["portée non soutenue nécessitant", "un nouveau soutien à générer","en millimètres"], sp_angl_s: "angle max", sp_angl_l: ["angle de surplomb maximum avant", "de générer un pilier de soutien"], sp_area_s: "surface min", - sp_area_l: ["surface minimum de","la colonne support","en millimètres"], + sp_area_l: ["surface minimale de","la colonne support","en millimètres"], sp_xpnd_s: "étendre", sp_xpnd_l: ["étendre la zone de soutien", "au-delà des limites d'une pièce","en millimètres"], sp_nozl_s: "extrudeur", @@ -450,7 +452,7 @@ kiri.lang['fr-fr'] = { ct_nabl_l: ["auto generate radial tabs","projected from part center","using count and angle offset"], // OUTPUT - ou_menu: "output", + ou_menu: "sortie", // LASER KNIFE dk_menu: "knife", @@ -492,9 +494,9 @@ kiri.lang['fr-fr'] = { ou_fini_l: ["vitesse de la coque extérieure","millimètres / minute"], ou_move_s: "vitesse déplacement", ou_move_l: ["vitesse de déplacement sans impression","millimètres / minute","0 = active déplacements G0"], - ou_shml_s: "facteur de coque", - ou_flml_s: "facteur de solidité", - ou_spml_s: "facteur de remplissage", + ou_shml_s: "débit de coque", + ou_flml_s: "débit de solidité", + ou_spml_s: "débit de remplissage", ou_exml_l: ["multiplicateur d'extrusion","0.0 - 2.0"], ou_fans_s: "vitesse ventilateur", ou_fans_l: "0 - 255", @@ -542,29 +544,29 @@ kiri.lang['fr-fr'] = { // FDM ADVANCED ad_menu: "expert", - ad_rdst_s: "dist retraction", - ad_rdst_l: ["montant pour rétracter le filament", "pour les longs mouvements. en millimètres"], - ad_rrat_s: "vit rétraction", + ad_rdst_s: "distance de rétraction", + ad_rdst_l: ["longueur de filament à rétracter", "pour les longs mouvements. en millimètres"], + ad_rrat_s: "vitesse de rétraction", ad_rrat_l: ["vitesse de rétraction","du filament en mm/s"], ad_rdwl_s: "réenclencher", ad_wpln_s: "essuyage rétractation", - ad_wpln_l: ["mouvement sans impression", "après rétractation", "en millimètres"], + ad_wpln_l: ["mouvement sans impression", "après rétraction", "en millimètres"], ad_rdwl_l: ["durée de réenclenchement", "filament et mouvement", "en millisecondes"], - ad_scst_s: "shell coast", + ad_scst_s: "cabotage", ad_scst_l: ["extrémité non imprimée", "des coques du périmètre", "en millimètres"], ad_msol_s: "min solide", ad_msol_l: ["aire minimale (mm^2)","requise pour rester solide","doit être > 0.1"], - ad_mins_s: "vitesse min", + ad_mins_s: "vitesse minimale", ad_mins_l: ["vitesse minimale","des segments courts"], - ad_spol_s: "short path", + ad_spol_s: "chemin court", ad_spol_l: ["les polygones plus courts", "auront la vitesse réduite et", "seront ramenés à la vitesse minimale", "en millimètres"], ad_arct_s: "tolérance arc", - ad_arct_l: ["convertir les lignes à facettes en arcs", "tolérance de dérive du point central", "lors de la correspondance des points d'arc", "considérer les valeurs autour de 0,15", "en millimètres", "0 pour désactiver"], - ad_zhop_s: "dist levée Z", - ad_zhop_l: ["levée du z","sur les mouvements de rétraction", "en millimètres", "0 pour désactiver"], + ad_arct_l: ["convertir les lignes des facettes en arcs", "tolérance de dérive du point central", "lors de la correspondance des points d'arc", "considérer les valeurs autour de 0,15", "en millimètres", "0 désactive"], + ad_zhop_s: "décalage en Z", + ad_zhop_l: ["levée du z","sur les mouvements de rétraction", "en millimètres", "0 désactive"], ad_abkl_s: "anti-backlash", - ad_abkl_l: ["pour une meilleure finition de la surface plane", "utiliser des micro-mouvements pour annuler", "le jeu dans la sortie de la couche solide", "en millimètres", "0 pour désactiver", "si le firmware reconnait le M425", "l'utiliser dans l'en-tête du gcode", "et mettre à 0"], - ad_lret_s: "rétr chngt couche", + ad_abkl_l: ["pour une meilleure finition de la surface plane", "utiliser des micro-mouvements pour annuler", "le jeu dans la sortie de la couche solide", "en millimètres", "0 désactive", "si le firmware reconnait le M425", "l'utiliser dans l'en-tête du gcode", "et mettre à 0"], + ad_lret_s: "rétraction au changement de couche", ad_lret_l: ["forcer la rétraction du filament", "entre les couches"], ad_play_s: "couches de polissage", ad_play_l: ["polir jusqu'au nombre spécifié", "# de couches à la fois"], @@ -585,9 +587,9 @@ kiri.lang['fr-fr'] = { ag_loop_l: ["des plages de couches à répéter dans le format ", "premier-compte dernier,premier-compte dernier,...", "compte omis = 1"], // SLA MENU - sa_menu: "slicing", - sa_lahe_s: "layer height", - sa_lahe_l: ["layer height","in millimeters"], + sa_menu: "tranchage", + sa_lahe_s: "hauteur de couche", + sa_lahe_l: ["hauteur de couche","en millimètres"], sa_shel_s: "hollow shell", sa_shel_l: ["shell thickness in mm","use multiple of layer height","use 0 for solid (disabled)"], sa_otop_s: "open top", @@ -637,4 +639,4 @@ kiri.lang['fr-fr'] = { sa_opzo_l: ["z layer offset","almost always 0.0","0.0-1.0 in millimeters"], sa_opaa_s: "anti alias", sa_opaa_l: ["enable anti-aliasing","produces larger files","can blur details"] -}; \ No newline at end of file +}; From 3faa4a1a81fc1ef584d0dcaa81344e3e3f9769f3 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 1 Mar 2021 11:28:56 -0500 Subject: [PATCH 194/255] fix lang slice/preview overrides. add slice and start verbs --- src/mode/cam/client.js | 9 +++++---- web/kiri/index.html | 2 +- web/kiri/lang/de-de.js | 1 - web/kiri/lang/en.js | 2 ++ 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/mode/cam/client.js b/src/mode/cam/client.js index f7f6b10e..75286ed0 100644 --- a/src/mode/cam/client.js +++ b/src/mode/cam/client.js @@ -6,6 +6,7 @@ let KIRI = self.kiri, BASE = self.base, + LANG = KIRI.lang.current, CAM = KIRI.driver.CAM, PRO = CAM.process, newPolygon = BASE.newPolygon, @@ -61,11 +62,11 @@ if (!isCamMode) { func.tabClear(); func.traceDone(); - UI.label.slice.innerText = 'slice'; - UI.label.preview.innerText = 'preview'; - UI.label.export.innerText = 'export'; + UI.label.slice.innerText = LANG.slice; + UI.label.preview.innerText = LANG.preview; + UI.label.export.innerText = LANG.export; } else { - UI.label.slice.innerText = 'start'; + UI.label.slice.innerText = LANG.start; } // do not persist traces across page reloads func.traceClear(); diff --git a/web/kiri/index.html b/web/kiri/index.html index 6f5d8e00..49de7522 100644 --- a/web/kiri/index.html +++ b/web/kiri/index.html @@ -131,7 +131,7 @@
    - +
    diff --git a/web/kiri/lang/de-de.js b/web/kiri/lang/de-de.js index 0ae8022d..d727f8bd 100644 --- a/web/kiri/lang/de-de.js +++ b/web/kiri/lang/de-de.js @@ -43,7 +43,6 @@ kiri.lang['de-de'] = { view: "Ansicht", // left view pop menu wire: "Drahtansicht", // left render pop menu - acct_xpo: ["make a backup of your device","and device profiles with the","option to include workspace","objects and positions"], acct_xpo: ["Lege ein Backup Deiner Geräte","und Geräte-Profile an, mit der","Option, den Arbeitsbereich und","mit Objekten und Anordnung zu speichern"], // RIGHT-CLICK CONTEXT MENU diff --git a/web/kiri/lang/en.js b/web/kiri/lang/en.js index 5ccefaa0..d3b8ad07 100644 --- a/web/kiri/lang/en.js +++ b/web/kiri/lang/en.js @@ -34,7 +34,9 @@ kiri.lang['en-us'] = { setup: "setup", settings: "settings", size: "size", + slice: "slice", solid: "solid", // view type pop menu + start: "start", tool: "tool", tools: "tools", // CAM tool menu button top: "top", From 396e369df4254f231ef1b8e07dabcc0a11b904c8 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 1 Mar 2021 11:30:06 -0500 Subject: [PATCH 195/255] duplicate declaration --- src/mode/cam/client.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/mode/cam/client.js b/src/mode/cam/client.js index 75286ed0..b58aed86 100644 --- a/src/mode/cam/client.js +++ b/src/mode/cam/client.js @@ -6,7 +6,6 @@ let KIRI = self.kiri, BASE = self.base, - LANG = KIRI.lang.current, CAM = KIRI.driver.CAM, PRO = CAM.process, newPolygon = BASE.newPolygon, From bb289dc4bbc9d4e4128856ade69efb5c3ae35083 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 1 Mar 2021 13:22:22 -0500 Subject: [PATCH 196/255] bump rev 2.7.D15 --- package.json | 2 +- src/kiri.js | 2 +- src/license.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index e4e5dc92..5474089a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grid-apps", - "version": "2.7.14D", + "version": "2.7.15D", "description": "grid.space 3d slice & modeling tools", "author": "Stewart Allen ", "license": "MIT", diff --git a/src/kiri.js b/src/kiri.js index d1296f64..2f9d1bcc 100644 --- a/src/kiri.js +++ b/src/kiri.js @@ -6,7 +6,7 @@ if (!self.kiri) { self.kiri = { - beta: 2714, + beta: 2715, driver: {}, // driver modules loader: [] // module loading: array of functions }; diff --git a/src/license.js b/src/license.js index 8ac464f4..8cb774fb 100644 --- a/src/license.js +++ b/src/license.js @@ -3,7 +3,7 @@ let terms = { COPYRIGHT: "Copyright (C) Stewart Allen - All Rights Reserved", LICENSE: "See the license.md file included with the source distribution", - VERSION: "2.7.D14" + VERSION: "2.7.D15" }; if (typeof(module) === 'object') { From c91fc10f30cc08c6e8dc7c304cef8f0601399e02 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 1 Mar 2021 16:57:06 -0500 Subject: [PATCH 197/255] fix array typo --- web/kiri/lang/fr.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/kiri/lang/fr.js b/web/kiri/lang/fr.js index 9dfc207a..72f1ade3 100644 --- a/web/kiri/lang/fr.js +++ b/web/kiri/lang/fr.js @@ -218,7 +218,7 @@ kiri.lang['fr-fr'] = { op_line_s: "type de ligne", op_line_l: ["style de ligne pour le rendu","impacte les performances 3d","chemin: 3d meilleur","plat: 2d bon","ligne = 1d rapide"], op_unit_s: "unités", - op_unit_l: ["les unités d'espace de travail affectent".,"vitesses et distances"], + op_unit_l: ["les unités d'espace de travail affectent","vitesses et distances"], op_anim_s: "animer", op_anim_l: ["densité du maillage de l'animation","plus haut = plus dense","nécessite plus de mémoire","et est plus lent"], From 59878384c9a5433c3dc55715d7115d9311135780 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 1 Mar 2021 18:12:34 -0500 Subject: [PATCH 198/255] start refactoring to remove dependence on THREE.Geometry --- src/geo/render.js | 25 ++++++++++------ src/kiri/main.js | 72 ++++++++++++++++++++++++++++++++++------------- 2 files changed, 69 insertions(+), 28 deletions(-) diff --git a/src/geo/render.js b/src/geo/render.js index 866fcc1b..becf435a 100644 --- a/src/geo/render.js +++ b/src/geo/render.js @@ -30,9 +30,10 @@ */ function wireframe(group, points, color) { if (points.length % 3 != 0) throw "invalid line : "+points.length; - let lines = new THREE.Geometry(), + let lines = new THREE.BufferGeometry(), hash = {}, - added = 0; + added = 0, + vertices = []; for (let i = 0; i < points.length; i += 3) { let p1 = points[i], p2 = points[i + 1], @@ -41,22 +42,28 @@ l2 = newOrderedLine(p2, p3), l3 = newOrderedLine(p3, p1); if (!hash[l1.key]) { - lines.vertices.push(new THREE.Vector3(p1.x, p1.y, p1.z)); - lines.vertices.push(new THREE.Vector3(p2.x, p2.y, p2.z)); + vertices.appendAll([ + p1.x, p1.y, p1.z, + p2.x, p2.y, p2.z + ]); hash[l1.key] = ++added; } if (!hash[l2.key]) { - lines.vertices.push(new THREE.Vector3(p2.x, p2.y, p2.z)); - lines.vertices.push(new THREE.Vector3(p3.x, p3.y, p3.z)); + vertices.appendAll([ + p2.x, p2.y, p2.z, + p3.x, p3.y, p3.z + ]); hash[l2.key] = ++added; } if (!hash[l3.key]) { - lines.vertices.push(new THREE.Vector3(p3.x, p3.y, p3.z)); - lines.vertices.push(new THREE.Vector3(p1.x, p1.y, p1.z)); + vertices.appendAll([ + p3.x, p3.y, p3.z, + p1.x, p1.y, p1.z + ]); hash[l3.key] = ++added; } } - lines.verticesNeedUpdate = true; + lines.setAttribute('position', new THREE.BufferAttribute( vertices.toFloat32(), 3 ) ); let mesh = new THREE.LineSegments(lines, getMaterial(color)); group.add(mesh); return mesh; diff --git a/src/kiri/main.js b/src/kiri/main.js index f0277998..652717d2 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -1503,18 +1503,52 @@ let outs = []; widgets.forEach(widget => { let mesh = widget.mesh; - let geo = new THREE.Geometry().fromBufferGeometry(mesh.geometry); + let geo = mesh.geometry; + // let geo = new THREE.Geometry().fromBufferGeometry(mesh.geometry); outs.push({geo, widget}); - facets += geo.faces.length; + facets += geo.attributes.position.count; + // facets += geo.faces.length; }); let stl = new Uint8Array(80 + 4 + facets * 50); let dat = new DataView(stl.buffer); let pos = 84; dat.setInt32(80, facets, true); - outs.forEach(out => { - let { faces, vertices } = out.geo; - for (let i=0, il=faces.length; i { + // let { faces, vertices } = out.geo; + // for (let i=0, il=faces.length; i 1) { + // let {x, y, z} = out.widget.track.pos; + // xo = x; + // yo = y; + // zo = z; + // } + // dat.setFloat32(pos + 0, normal.x, true); + // dat.setFloat32(pos + 4, normal.y, true); + // dat.setFloat32(pos + 8, normal.z, true); + // dat.setFloat32(pos + 12, vertices[a].x + xo, true); + // dat.setFloat32(pos + 16, vertices[a].y + yo, true); + // dat.setFloat32(pos + 20, vertices[a].z + zo, true); + // dat.setFloat32(pos + 24, vertices[b].x + xo, true); + // dat.setFloat32(pos + 28, vertices[b].y + yo, true); + // dat.setFloat32(pos + 32, vertices[b].z + zo, true); + // dat.setFloat32(pos + 36, vertices[c].x + xo, true); + // dat.setFloat32(pos + 40, vertices[c].y + yo, true); + // dat.setFloat32(pos + 44, vertices[c].z + zo, true); + // pos += 50; + // } + // }); + for (let out of outs) { + let { normal, position } = out.geo.attributes; + let nvals = normal.array; + let pvals = position.array; + for (let i=0, il=position.count; i 1) { let {x, y, z} = out.widget.track.pos; @@ -1522,21 +1556,21 @@ yo = y; zo = z; } - dat.setFloat32(pos + 0, normal.x, true); - dat.setFloat32(pos + 4, normal.y, true); - dat.setFloat32(pos + 8, normal.z, true); - dat.setFloat32(pos + 12, vertices[a].x + xo, true); - dat.setFloat32(pos + 16, vertices[a].y + yo, true); - dat.setFloat32(pos + 20, vertices[a].z + zo, true); - dat.setFloat32(pos + 24, vertices[b].x + xo, true); - dat.setFloat32(pos + 28, vertices[b].y + yo, true); - dat.setFloat32(pos + 32, vertices[b].z + zo, true); - dat.setFloat32(pos + 36, vertices[c].x + xo, true); - dat.setFloat32(pos + 40, vertices[c].y + yo, true); - dat.setFloat32(pos + 44, vertices[c].z + zo, true); + dat.setFloat32(pos + 0, nx, true); + dat.setFloat32(pos + 4, ny, true); + dat.setFloat32(pos + 8, nz, true); + dat.setFloat32(pos + 12, pvals[pi + 0] + xo, true); + dat.setFloat32(pos + 16, pvals[pi + 1] + yo, true); + dat.setFloat32(pos + 20, pvals[pi + 2] + zo, true); + dat.setFloat32(pos + 24, pvals[pi + 3] + xo, true); + dat.setFloat32(pos + 28, pvals[pi + 4] + yo, true); + dat.setFloat32(pos + 32, pvals[pi + 5] + zo, true); + dat.setFloat32(pos + 36, pvals[pi + 6] + xo, true); + dat.setFloat32(pos + 40, pvals[pi + 7] + yo, true); + dat.setFloat32(pos + 44, pvals[pi + 8] + zo, true); pos += 50; } - }); + } return stl; } From d230f1e473f32fa07132c901d458390508efbd2f Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 1 Mar 2021 18:32:47 -0500 Subject: [PATCH 199/255] transition support detect from Geometry to BufferGeometry --- src/mode/fdm/slice.js | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index f802cafc..c5ae80f9 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -1269,10 +1269,9 @@ let process = settings.process; let size = process.sliceSupportSize; let min = process.sliceSupportArea || 1; - let buf = new THREE.BufferGeometry(); - buf.setAttribute('position', new THREE.BufferAttribute(widget.vertices, 3)); + let geo = new THREE.BufferGeometry(); + geo.setAttribute('position', new THREE.BufferAttribute(widget.vertices, 3)); let mat = new THREE.MeshBasicMaterial(); - let geo = new THREE.Geometry().fromBufferGeometry(buf); let rad = (Math.PI / 180); let deg = (180 / Math.PI); let angle = rad * settings.process.sliceSupportAngle; @@ -1329,19 +1328,22 @@ } : (f) => { return f.normal.z < thresh; }; - geo.faces.filter(filter).forEach(face => { - let a = geo.vertices[face.a]; - let b = geo.vertices[face.b]; - let c = geo.vertices[face.c]; + let position = geo.attributes.position; + let { itemSize, count, array } = position; + for (let i = 0; i 0; }; From 6aa78d2a6aaaf105ce51d87edb78738b60a8176a Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 1 Mar 2021 22:41:29 -0500 Subject: [PATCH 200/255] major changes to upgrade to 3JS 1.2.5 -- deprecated THREE.Geometry -- breakage may ensue --- app.js | 1 + package.json | 2 +- src/add/three.js | 36 +++++++++++++++--------- src/kiri/main.js | 63 ++++++++++++------------------------------ src/kiri/widget.js | 19 ++++++++++++- src/mode/fdm/client.js | 16 +++-------- src/mode/fdm/slice.js | 16 +++++++---- src/moto/space.js | 15 +++++----- 8 files changed, 83 insertions(+), 85 deletions(-) diff --git a/app.js b/app.js index c0a26730..9e877619 100644 --- a/app.js +++ b/app.js @@ -241,6 +241,7 @@ const script = { kiri : [ "kiri", "ext/three", + "ext/three-bgu", "license", "ext/clip2", // work.test "ext/tween", diff --git a/package.json b/package.json index 5474089a..72c1d131 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "moment": "^2.24.0", "pixi.js": "^4.8.9", "serve-static": "^1.14.1", - "three": "^0.122.0", + "three": "^0.125.0", "tween.js": "^0.14.0", "uglify-es": "3.3.9", "validator": "^8.2.0", diff --git a/src/add/three.js b/src/add/three.js index 4baccf91..97567201 100644 --- a/src/add/three.js +++ b/src/add/three.js @@ -5,9 +5,18 @@ (function() { var MP = THREE.Mesh.prototype, - GP = THREE.Geometry.prototype, BP = THREE.BufferGeometry.prototype; + THREE.computeFaceNormal = function(vA,vB,vC) { + const ab = new THREE.Vector3(); + const cb = new THREE.Vector3(); + cb.subVectors( vC, vB ); + ab.subVectors( vA, vB ); + cb.cross( ab ); + cb.normalize(); + return cb; + }; + MP.getBoundingBox = function(update) { return this.geometry.getBoundingBox(update); }; @@ -46,7 +55,7 @@ }; // center geometry on x,y,z coordinates (defaults to 0,0,0) - GP.center = function(x,y,z) { + BP.center = function(x,y,z) { var box = this.getBoundingBox(), mid = box.dim.clone().multiplyScalar(0.5), dif = mid.clone().add(box.min), @@ -69,7 +78,7 @@ }; // return cached or refreshed (when update = true) bounding box - GP.getBoundingBox = function(update) { + BP.getBoundingBox = function(update) { if (update || !this.boundingBox) { this.boundingBox = null; this.computeBoundingBox(); @@ -79,7 +88,7 @@ }; // uniformly scale any mesh to a max x/y/z dim of 'unit' (defaults to 1) - GP.unitScale = function(unit) { + BP.unitScale = function(unit) { var bbox = this.getBoundingBox().clone(), scale = (unit || 1) / Math.max( bbox.max.x - bbox.min.x, @@ -92,20 +101,21 @@ return this; }; - BP.center = GP.center; - BP.getBoundingBox = GP.getBoundingBox; - BP.unitScale = GP.unitScale; - BP.fixNormals = function() { this.computeVertexNormals(); return this; }; - THREE.Geometry.fromVertices = function(vertices) { - var geometry = new THREE.BufferGeometry(); - geometry.setAttribute('position', new THREE.BufferAttribute(vertices, 3)); - return geometry; - }; + // may be faster than the equivalent matrix transform. to be tested +// BP.translate = function(x,y,z) { +// let off = [x,y,z], +// arr = this.attributes.position.array, +// len = arr.length; +// for (let i=0; i { let mesh = widget.mesh; let geo = mesh.geometry; - // let geo = new THREE.Geometry().fromBufferGeometry(mesh.geometry); outs.push({geo, widget}); facets += geo.attributes.position.count; - // facets += geo.faces.length; }); let stl = new Uint8Array(80 + 4 + facets * 50); let dat = new DataView(stl.buffer); let pos = 84; dat.setInt32(80, facets, true); - // outs.forEach(out => { - // let { faces, vertices } = out.geo; - // for (let i=0, il=faces.length; i 1) { - // let {x, y, z} = out.widget.track.pos; - // xo = x; - // yo = y; - // zo = z; - // } - // dat.setFloat32(pos + 0, normal.x, true); - // dat.setFloat32(pos + 4, normal.y, true); - // dat.setFloat32(pos + 8, normal.z, true); - // dat.setFloat32(pos + 12, vertices[a].x + xo, true); - // dat.setFloat32(pos + 16, vertices[a].y + yo, true); - // dat.setFloat32(pos + 20, vertices[a].z + zo, true); - // dat.setFloat32(pos + 24, vertices[b].x + xo, true); - // dat.setFloat32(pos + 28, vertices[b].y + yo, true); - // dat.setFloat32(pos + 32, vertices[b].z + zo, true); - // dat.setFloat32(pos + 36, vertices[c].x + xo, true); - // dat.setFloat32(pos + 40, vertices[c].y + yo, true); - // dat.setFloat32(pos + 44, vertices[c].z + zo, true); - // pos += 50; - // } - // }); for (let out of outs) { - let { normal, position } = out.geo.attributes; - let nvals = normal.array; + let { position } = out.geo.attributes; let pvals = position.array; for (let i=0, il=position.count; i 1) { let {x, y, z} = out.widget.track.pos; @@ -1556,18 +1527,18 @@ yo = y; zo = z; } - dat.setFloat32(pos + 0, nx, true); - dat.setFloat32(pos + 4, ny, true); - dat.setFloat32(pos + 8, nz, true); - dat.setFloat32(pos + 12, pvals[pi + 0] + xo, true); - dat.setFloat32(pos + 16, pvals[pi + 1] + yo, true); - dat.setFloat32(pos + 20, pvals[pi + 2] + zo, true); - dat.setFloat32(pos + 24, pvals[pi + 3] + xo, true); - dat.setFloat32(pos + 28, pvals[pi + 4] + yo, true); - dat.setFloat32(pos + 32, pvals[pi + 5] + zo, true); - dat.setFloat32(pos + 36, pvals[pi + 6] + xo, true); - dat.setFloat32(pos + 40, pvals[pi + 7] + yo, true); - dat.setFloat32(pos + 44, pvals[pi + 8] + zo, true); + dat.setFloat32(pos + 0, norm.x, true); + dat.setFloat32(pos + 4, norm.y, true); + dat.setFloat32(pos + 8, norm.z, true); + dat.setFloat32(pos + 12, p0.x + xo, true); + dat.setFloat32(pos + 16, p0.y + yo, true); + dat.setFloat32(pos + 20, p0.z + zo, true); + dat.setFloat32(pos + 24, p1.x + xo, true); + dat.setFloat32(pos + 28, p1.y + yo, true); + dat.setFloat32(pos + 32, p1.z + zo, true); + dat.setFloat32(pos + 36, p2.x + xo, true); + dat.setFloat32(pos + 40, p2.y + yo, true); + dat.setFloat32(pos + 44, p2.z + zo, true); pos += 50; } } diff --git a/src/kiri/widget.js b/src/kiri/widget.js index b99137e4..0eb4a720 100644 --- a/src/kiri/widget.js +++ b/src/kiri/widget.js @@ -557,7 +557,24 @@ }; PRO.getGeoVertices = function() { - return this.mesh.geometry.getAttribute('position').array; + let geo = this.mesh.geometry; + let pos = geo.getAttribute('position').array; + if (geo.index) { + let idx = geo.index.array; + let len = idx.length; + let p2 = new Float32Array(len * 3); + let inc = 0; + for (let i=0; i w.sups).map(w => Object.values(w.sups)).flat(); + if (!merge.length) { continue; } - let bbg = new THREE.BufferGeometry().fromGeometry(merged); + let boxen = merge.map(m => m.box.geometry.clone().translate(m.x, m.y, m.z)); + let bbg = THREE.BufferGeometryUtils.mergeBufferGeometries(boxen); let sw = kiri.newWidget(null, group); let fwp = group[0].track.pos; sw.loadGeometry(bbg); diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index c5ae80f9..b0a68eee 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -1323,19 +1323,25 @@ point.added = true; } } - let filter = isBelt ? (f) => { - return f.normal.z < thresh && f.normal.y < -0.001; - } : (f) => { - return f.normal.z < thresh; + let filter = isBelt ? (norm) => { + return norm.z < thresh && norm.y < -0.001; + } : (norm) => { + return norm.z < thresh; }; - let position = geo.attributes.position; + let { position } = geo.attributes; let { itemSize, count, array } = position; for (let i = 0; i Date: Mon, 1 Mar 2021 22:59:29 -0500 Subject: [PATCH 201/255] Update readme.md --- readme.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/readme.md b/readme.md index 2dd840bd..c147fe0f 100644 --- a/readme.md +++ b/readme.md @@ -85,8 +85,9 @@ web site. requires node.js 12+ -### Javascript Slicing API +### Javascript Slicing APIs -A script include that injects a web worker into the page that will asynchronously perform any of Kiri’s slicing and gcode generation functions. +A script include that injects a web worker into the page that will asynchronously perform any of Kiri’s slicing and gcode generation functions. And a frame messaging API for controlling Kiri:Moto inside an IFrame. -https://grid.space/kiri/engine.html +* https://grid.space/kiri/engine.html +* https://grid.space/kiri/frame.html From 27f5b3522c654ed1f79076e476036002946b59f6 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 1 Mar 2021 23:55:07 -0500 Subject: [PATCH 202/255] add three utils --- src/ext/three-bgu.js | 1 + 1 file changed, 1 insertion(+) create mode 120000 src/ext/three-bgu.js diff --git a/src/ext/three-bgu.js b/src/ext/three-bgu.js new file mode 120000 index 00000000..c920aa9d --- /dev/null +++ b/src/ext/three-bgu.js @@ -0,0 +1 @@ +../../node_modules/three/examples/js/utils/BufferGeometryUtils.js \ No newline at end of file From fe28975fb39d153239781509dbcf0bd854abdc3e Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Tue, 2 Mar 2021 00:15:22 -0500 Subject: [PATCH 203/255] improve grouping --- src/kiri/widget.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/kiri/widget.js b/src/kiri/widget.js index 0eb4a720..d901d003 100644 --- a/src/kiri/widget.js +++ b/src/kiri/widget.js @@ -40,9 +40,13 @@ let grps = widgets.map(w => w.group).uniq(); if (grps.length > 1) { let root = grps.shift(); + let rpos = root[0].track.pos; for (let grp of grps) { for (let w of grp) { + let wpos = w.track.pos; w.group = root; + w.moveMesh(rpos.x - wpos.x, rpos.y - wpos.y, rpos.z - wpos.z); + w._move(rpos.x, rpos.y, rpos.z, true); root.push(w); } groups.splice(groups.indexOf(grp),1); From 5b1f922f3c90daeb188a31f94ec906216635c2e0 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Tue, 2 Mar 2021 15:12:58 -0500 Subject: [PATCH 204/255] move to module --- app.js | 113 ----------------------------------------------- src/kiri/init.js | 48 -------------------- 2 files changed, 161 deletions(-) diff --git a/app.js b/app.js index 9e877619..94b4b6ec 100644 --- a/app.js +++ b/app.js @@ -86,7 +86,6 @@ function init(mod) { mod.add(handleVersion); mod.add(prepath([ [ "/code/", handleCode ], - [ "/data/", handleData ], [ "/wasm/", handleWasm ] ])); mod.add(fixedmap("/api/", api)); @@ -502,118 +501,6 @@ function handleOptions(req, res, next) { } } -function handleData(req, res, next) { - addCorsHeaders(req, res); - res.setHeader('Cache-Control', 'private, no-cache, max-age=0'); - - let tok = req.app.path.split('/'), - muid = req.headers['x-moto-ajax'], - space = tok[2] || null, - version = tok[3], - valid = space && space.length >= 4 && space.length <= 8; - - function genKey() { - while (true) { - let k = Math.round(Math.random() * 9999999999).toString(36); - if (k.length >= 4 && k.length <= 8) return k; - } - } - - function countKey(space) { - return db.key(['meta/counter',space]); - } - - function ownerKey(space) { - return db.key(['meta/owner',muid,'space',space]); - } - - function recordKey(space, version) { - return db.key(["meta/space",space,version]); - } - - // retrieve latest space data - if (valid && req.method === 'GET' && valid) { - function send(rec, version) { - if (rec) { - res.write(obj2string({space:space,ver:version,rec:rec})); - res.end(); - } else { - res.end(); - } - } - - function retrieve(version) { - return db.get(recordKey(space,version)) - .then(record => { - send(record || null, version); - }) - } - - if (version) { - retrieve(version) - } else { - db.get(countKey(space)).then(version => retrieve(version)); - } - } else if (valid && req.method === 'POST') { - let dbOwner = null, - dbVersion = null, - postBody = null, - spacein = space, - version = 0, - body = ''; - - function checkDone() { - if (!(dbVersion && postBody)) return; - // if not owner, assign new space id - if (dbVersion > 1) { - if (!dbOwner) { - space = genKey(); - version = 1; - logger.log({forked:space,from:spacein,by:muid}); - } - } - // log what we have - logger.log({ - space: space, - ver: dbVersion, - uid: muid, - size: postBody.length - }); - if (muid && muid.length > 0) { - level.put(recordKey(space, dbVersion), body); - level.put(ownerKey(space), {time: time(), ver: dbVersion}); - level.put(countKey(space), dbVersion); - } - res.end(obj2string({space: space, ver: dbVersion})); - } - - // accumulate post body - req.on('data', data => { body += data }); - req.on('end', () => { - postBody = body; - checkDone(); - }); - - // fetch owner and version information - db.get(ownerKey(space)) - .then(owner => { - dbOwner = owner; - return db.get(countKey(space)); - }) - .then(version => { - dbVersion = parseInt(version || "0") + 1; - checkDone(); - }); - - return; - - } else { - - next(); - - } -} - function handleWasm(req, res, next) { let [root, file] = req.app.path.split('/').slice(1); let ext = (file || '').split('.')[1]; diff --git a/src/kiri/init.js b/src/kiri/init.js index 2dce901b..1e5b1963 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -363,14 +363,6 @@ case cca('i'): // file import API.event.import(); break; - case cca('U'): // full settings url - storeSettingsToServer(true); - break; - case cca('u'): // full settings url - UC.prompt("settings id to load", "").then(id => { - if (id) loadSettingsFromServer(id); - }); - break; case cca('S'): // slice case cca('s'): // slice if (evt.shiftKey) { @@ -547,43 +539,6 @@ moveSelection(x, y, z, true); } - function loadSettingsFromServer(tok) { - let hash = (tok || LOC.hash.substring(1)).split("/"); - if (hash.length === 2) { - new moto.Ajax(function(reply) { - if (reply) { - let res = JSON.parse(reply); - if (res && res.ver && res.rec) { - let set = API.util.b64dec(res.rec); - set.id = res.space; - set.ver = res.ver; - API.conf.put(set); - API.event.settings(); - API.ui.sync(); - LOC.hash = ''; - } - } - }).request("/data/"+ hash[0] + "/" + hash[1]); - } - } - - function storeSettingsToServer(display) { - let set = API.util.b64enc(settings()); - new moto.Ajax(function(reply) { - if (reply) { - let res = JSON.parse(reply); - if (res && res.ver) { - LOC.hash = res.space + "/" + res.ver; - if (display) { - UC.alert(`unique settings id is: ${res.space}/${res.ver}`); - } - } - } else { - updateSpaceState(); - } - }).request("/data/"+ settings().id + "/" + settings().ver, set); - } - function deviceExport(exp, name) { name = (name || "device") .toLowerCase() @@ -2435,9 +2390,6 @@ UI.sync(); - // load settings provided in url hash - loadSettingsFromServer(); - // clear alerts as they build up setInterval(API.event.alerts, 1000); From 3478b700f93bbf0639a571472eed2b0f2fbefbf8 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Tue, 2 Mar 2021 18:36:08 -0500 Subject: [PATCH 205/255] fix 'round' bug reports --- src/mode/fdm/export.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mode/fdm/export.js b/src/mode/fdm/export.js index 652b1e57..4ed0bb7e 100644 --- a/src/mode/fdm/export.js +++ b/src/mode/fdm/export.js @@ -334,7 +334,7 @@ path.layer === 0 ? (process.firstSliceHeight || process.sliceHeight) : path.height); - zpos = path.z; + zpos = path.z || zpos; subst.z = subst.Z = zpos.round(3); subst.e = subst.E = outputLength; subst.layer = layer; From dd181e96e2ba37df9a231b13904e04bc7df0c60b Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Tue, 2 Mar 2021 19:43:04 -0500 Subject: [PATCH 206/255] add fractional shells. requires 'experimental' to be enabled for now. fixes #121 --- src/kiri/init.js | 2 +- src/mode/fdm/slice.js | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/kiri/init.js b/src/kiri/init.js index 1e5b1963..d070748b 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -1620,7 +1620,7 @@ sliceHeight: UC.newInput(LANG.sl_lahi_s, {title:LANG.sl_lahi_l, convert:UC.toFloat, modes:FDM}), sliceMinHeight: UC.newInput(LANG.ad_minl_s, {title:LANG.ad_minl_l, bound:UC.bound(0,3.0), convert:UC.toFloat, modes:FDM, show: () => UI.sliceAdaptive.checked}), fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}), - sliceShells: UC.newInput(LANG.sl_shel_s, {title:LANG.sl_shel_l, convert:UC.toInt, modes:FDM}), + sliceShells: UC.newInput(LANG.sl_shel_s, {title:LANG.sl_shel_l, convert:UC.toFloat, modes:FDM}), sliceTopLayers: UC.newInput(LANG.sl_ltop_s, {title:LANG.sl_ltop_l, convert:UC.toInt, modes:FDM}), sliceSolidLayers: UC.newInput(LANG.sl_lsld_s, {title:LANG.sl_lsld_l, convert:UC.toInt, modes:FDM}), sliceBottomLayers: UC.newInput(LANG.sl_lbot_s, {title:LANG.sl_lbot_l, convert:UC.toInt, modes:FDM}), diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index b0a68eee..b41e59e2 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -278,6 +278,16 @@ // create shells and diff inner fillable areas forSlices(0.0, 0.2, slice => { let params = getRangeParameters(settings, slice.index); + let shellFrac = (params.sliceShells - (params.sliceShells | 0)); + let sliceShells = params.sliceShells | 0; + if (ctrl.danger && shellFrac) { + let v1 = shellFrac > 0.5 ? 1 - shellFrac : shellFrac; + let v2 = 1 - v1; + let parts = Math.round(v2/v1) + 1; + let rem = slice.index % parts; + let trg = shellFrac > 0.5 ? 1 : parts - 1; + sliceShells += rem >= trg ? 1 : 0; + } let first = slice.index === 0; let isBottom = slice.index < spro.sliceBottomLayers; let isTop = slice.index > slices.length - spro.sliceTopLayers-1; @@ -286,7 +296,7 @@ let spaceMult = first ? spro.firstLayerLineMult || 1 : 1; let offset = shellOffset * spaceMult; let fillOff = fillOffset * spaceMult; - let count = isSynth ? 1 : params.sliceShells; + let count = isSynth ? 1 : sliceShells; doShells(slice, count, offset, fillOff, { vase: vaseMode, thin: spro.detectThinWalls && !isSynth, From 270ef4521334cf62e0b06b4ea85d6d674d77baf8 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Tue, 2 Mar 2021 22:49:01 -0500 Subject: [PATCH 207/255] fix face normal inversion on mirrored parts so lay flat works properly --- src/kiri/widget.js | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/kiri/widget.js b/src/kiri/widget.js index d901d003..f1244471 100644 --- a/src/kiri/widget.js +++ b/src/kiri/widget.js @@ -546,18 +546,34 @@ }; PRO._mirror = function() { - this.setWireframe(false); this.clearSlices(); - let vert = this.getGeoVertices(); - for (let i=0; i Date: Thu, 4 Mar 2021 08:54:05 -0500 Subject: [PATCH 208/255] add {spindle} and {rpm} as aliases for {speed} --- src/mode/cam/export.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/mode/cam/export.js b/src/mode/cam/export.js index fe098518..b914d21a 100644 --- a/src/mode/cam/export.js +++ b/src/mode/cam/export.js @@ -279,7 +279,10 @@ if (layerout.spindle && layerout.spindle !== spindle) { spindle = layerout.spindle; if (spindle > 0) { - filterEmit(cmdSpindle, {speed: Math.abs(spindle)}); + let speed = Math.abs(spindle); + filterEmit(cmdSpindle, { + speed, spindle: speed, rpm: speed + }); } else { append("M4"); } From 50d95e607795e5db98d081530e9378e563a90e7d Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 4 Mar 2021 10:35:16 -0500 Subject: [PATCH 209/255] use entirely different selector for single line traces. fixes #111 --- src/mode/cam/slice.js | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/mode/cam/slice.js b/src/mode/cam/slice.js index 4a8600db..acc7e0d1 100644 --- a/src/mode/cam/slice.js +++ b/src/mode/cam/slice.js @@ -242,6 +242,13 @@ let traces = []; // find and trim polys (including open) to shadow let oneach = (data, index, total) => { + if (single) { + for (let line of data.lines) { + if (line.p1.distTo2D(line.p2) > 1) { + traces.push(newPolygon().append(line.p1).append(line.p2).setOpen()); + } + } + } else BASE.polygons.flatten(data.tops,null,true).forEach(poly => { poly.inner = null; poly.parent = null; @@ -257,13 +264,9 @@ return; } } - if (single) { - poly.forEachSegment((p1, p2) => { - traces.push(newPolygon().append(p1).append(p2).setOpen()); - }, poly.open); - } else { - traces.push(poly); - } + poly.forEachSegment((p1, p2) => { + traces.push(newPolygon().append(p1).append(p2).setOpen()); + }, poly.open); }); }; let opts = { each: oneach, over: false, flatoff: 0, edges: true, openok: true }; From 3edf74f027a306cc0db9d48677bcc4f5a10e5115 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 4 Mar 2021 13:22:53 -0500 Subject: [PATCH 210/255] add orthographic display preference. fixes #31 --- notes.md | 6 +++--- src/kiri/conf.js | 3 ++- src/kiri/init.js | 11 +++++++++-- src/moto/space.js | 21 ++++++++++++++------- web/kiri/lang/en.js | 2 ++ 5 files changed, 30 insertions(+), 13 deletions(-) diff --git a/notes.md b/notes.md index 25a8ae2c..b4b6b8a1 100644 --- a/notes.md +++ b/notes.md @@ -7,8 +7,8 @@ * `P` duplicate objects should share same slice data unless rotated or scaled * `P` allow selection to me decimated on demand (context menu?) * `P` improve decimation speed: omit point conversion or use wasm -* `P` client/worker interface normalization -* `P` explore widget vertex reloading / replacing (Onshape primarily) +* `P` client/worker message interface normalization +* `P` explore widget vertex reloading / replacing (Onshape) (issue #48) * `F` show slider range values in workspace units (on hover?) * `F` allow select of a range by typing in values in slices or workspace units @@ -73,6 +73,7 @@ * `B` climb vs conventional not fully consistent after refactor * `B` outside cutting direction in roughing mode inverted +* `F` user-selectable origin (issue #28) * `F` import SVG into a path that can be overlaid onto a 3D mesh (laser?) * `F` intelligently turn circle hole pocket clear into spiral down * `F` trace follow hole that matches endmill should turn into a drill op @@ -97,7 +98,6 @@ * `F` support lathe mode / A-axis / rotary * `F` gcode output option as zip for multiple or flip ops or tool change * `F` ease-down should be engaged in all descending cutting operations -* `F` entirely user-selectable origin * `F` maintain several part orientations + op chains in a single profile * `P` common part pre-analyze to speed up 'slice' and improve shadow (overhangs) diff --git a/src/kiri/conf.js b/src/kiri/conf.js index 6e8acd7f..8545ea61 100644 --- a/src/kiri/conf.js +++ b/src/kiri/conf.js @@ -658,7 +658,8 @@ decimate: true, detail: "good", animesh: "200", - healMesh: false + healMesh: false, + ortho: false }, // label state preferences labels: { diff --git a/src/kiri/init.js b/src/kiri/init.js index d070748b..9620a03c 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -138,6 +138,7 @@ function booleanSave() { let control = settings().controller; let isDark = control.dark; + let doAlert = UI.ortho.checked !== control.ortho; control.decals = UI.decals.checked; control.danger = UI.danger.checked; control.showOrigin = UI.showOrigin.checked; @@ -153,6 +154,7 @@ control.exportPreview = UI.exportPreview.checked; control.decimate = UI.decimate.checked; control.healMesh = UI.healMesh.checked; + control.ortho = UI.ortho.checked; SPACE.view.setZoom(control.reverseZoom, control.zoomSpeed); // platform.layout(); API.conf.save(); @@ -168,6 +170,9 @@ clearDeviceTexture(); } API.event.emit('boolean.update'); + if (doAlert) { + API.show.alert("change requires page refresh"); + } } function updateFPS() { @@ -1396,7 +1401,7 @@ SPACE.setSkyColor(controller.dark ? 0 : 0xffffff); SPACE.init(container, function (delta) { if (API.var.layer_max === 0 || !delta) return; - if (settings().controller.reverseZoom) delta = -delta; + if (controller.reverseZoom) delta = -delta; let same = API.var.layer_hi === API.var.layer_lo; let track = API.var.layer_lo > 0; if (delta > 0) { @@ -1415,7 +1420,7 @@ } API.view.update_slider(); API.show.slices(); - }); + }, controller.ortho); SPACE.platform.onMove(API.conf.save); SPACE.platform.setRound(true); SPACE.useDefaultKeys(API.feature.on_key === undefined || API.feature.on_key_defaults); @@ -1585,6 +1590,7 @@ lprefs: UC.newGroup(LANG.op_menu, $('prefs-gen1'), {inline: true}), reverseZoom: UC.newBoolean(LANG.op_invr_s, booleanSave, {title:LANG.op_invr_l}), + ortho: UC.newBoolean(LANG.op_orth_s, booleanSave, {title:LANG.op_orth_l}), dark: UC.newBoolean(LANG.op_dark_s, booleanSave, {title:LANG.op_dark_l}), decals: UC.newBoolean(LANG.op_decl_s, booleanSave, {title:LANG.op_decl_s}), danger: UC.newBoolean(LANG.op_dang_s, booleanSave, {title:LANG.op_dang_l}), @@ -2356,6 +2362,7 @@ UI.autoSave.checked = control.autoSave; UI.decimate.checked = control.decimate; UI.healMesh.checked = control.healMesh; + UI.ortho.checked = control.ortho; lineTypeSave(); detailSave(); updateFPS(); diff --git a/src/moto/space.js b/src/moto/space.js index 4719a2e7..5aaed5d5 100644 --- a/src/moto/space.js +++ b/src/moto/space.js @@ -97,6 +97,7 @@ camera, renderer, container, + raycaster, freezeTo, freeze, isRound = false, @@ -699,9 +700,7 @@ } function intersect(objects, recurse) { - let lookAt = new THREE.Vector3(mouse.x, mouse.y, 0.0).unproject(camera); - let ray = new THREE.Raycaster(camera.position, lookAt.sub(camera.position).normalize()); - return ray.intersectObjects(objects, recurse); + return raycaster.intersectObjects(objects, recurse); } /** ****************************************************************** @@ -809,6 +808,11 @@ updateLastAction(); let int, vis; + const mv = new THREE.Vector2(); + mv.x = ( event.clientX / window.innerWidth ) * 2 - 1; + mv.y = - ( event.clientY / window.innerHeight ) * 2 + 1; + raycaster.setFromCamera( mv, camera ); + if (viewControl.enabled) { event.preventDefault(); let selection = mouseHover ? mouseHover() : null; @@ -854,6 +858,7 @@ onEnterKey: onEnterKey, onResize: onResize, update: requestRefresh, + raycast: intersect, refresh: refresh, showSkyGrid: function(b) { @@ -1025,7 +1030,7 @@ return { renderer, camera, platform }; }, - init: function(domelement, slider) { + init: function(domelement, slider, ortho) { container = domelement; WORLD.rotation.x = -PI2; @@ -1038,14 +1043,16 @@ antialias: true, preserveDrawingBuffer: true }); - camera = perspective ? - new THREE.PerspectiveCamera(perspective, aspect(), 5, 100000) : - new THREE.OrthographicCamera(-100 * aspect(), 100 * aspect(), 100, -100, 0.1, 100000); + camera = ortho ? + new THREE.OrthographicCamera(-100 * aspect(), 100 * aspect(), 100, -100, 0.1, 100000) : + new THREE.PerspectiveCamera(perspective, aspect(), 5, 100000); camera.position.set(0, 200, 340); renderer.setSize(width(), height()); domelement.appendChild(renderer.domElement); + raycaster = new THREE.Raycaster(); + viewControl = new MOTO.CTRL(camera, domelement, function (position, moved) { if (platform) { platform.visible = hidePlatformBelow ? diff --git a/web/kiri/lang/en.js b/web/kiri/lang/en.js index d3b8ad07..036f16c9 100644 --- a/web/kiri/lang/en.js +++ b/web/kiri/lang/en.js @@ -213,6 +213,8 @@ kiri.lang['en-us'] = { op_free_l: ["permit dragable layout","no effect in laser mode"], op_spcr_s: "spacing", op_spcr_l: ["spacing between objects","during auto layout","in workspace units"], + op_orth_s: "orthographic", + op_orth_l: ["orthographic display","requires page refresh"], op_invr_s: "invert zoom", op_invr_l: ["invert mouse wheel","scroll zoom"], op_save_s: "auto save", From 962ac8186543ea4297b2d9a26abb92915131317b Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 4 Mar 2021 14:47:24 -0500 Subject: [PATCH 211/255] play with incremental rendering --- src/kiri/stack.js | 10 ++++++++++ src/kiri/stacks.js | 12 ++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/kiri/stack.js b/src/kiri/stack.js index 206c3509..a510b60c 100644 --- a/src/kiri/stack.js +++ b/src/kiri/stack.js @@ -44,6 +44,16 @@ this.show(); for (let i=0, s=this.slices, len=s.length; i= newMin && i <= newMax; + if (s[i].visible) this.lastVis = s[i]; + } + } + + setLastFraction(frac = 1) { + for (let mesh of this.lastVis.children) { + let geo = mesh.geometry; + let pos = geo.attributes.position; + let len = frac === 1 ? Infinity : Math.round(pos.count * frac); + geo.setDrawRange(0, len); } } diff --git a/src/kiri/stacks.js b/src/kiri/stacks.js index 24106415..dce39e29 100644 --- a/src/kiri/stacks.js +++ b/src/kiri/stacks.js @@ -52,6 +52,10 @@ return stacks[name]; } + function getStacks() { + return Object.entries(stacks); + } + function getLabels() { return Object.keys(DYN); } @@ -139,16 +143,24 @@ max = newMax; } + function setFraction(frac) { + Object.values(stacks).forEach(stack => { + stack.obj.setLastFraction(frac); + }); + } + KIRI.stacks = { clear, create, rotate, remove, getStack, + getStacks, getRange, setRange, getLabels, setVisible, + setFraction, setFreeMem }; From f30865c60a5f36c82ef27e4df8157f1b3ce9a967 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 4 Mar 2021 15:17:09 -0500 Subject: [PATCH 212/255] stub in placeholder for fdm animation --- src/kiri/main.js | 6 +++++- src/kiri/stack.js | 1 + src/mode/cam/client.js | 4 ++-- src/mode/fdm/client.js | 18 ++++++++++++++++++ 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/kiri/main.js b/src/kiri/main.js index 07e9f9e6..3fa57428 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -287,7 +287,7 @@ slice: prepareSlices, print: preparePreview, prepare: preparePreview, - animate: noop, + animate: prepareAnimation, export: prepareExport, cancel: cancelWorker, clear: KIRI.client.clear, @@ -1221,6 +1221,10 @@ }); } + function prepareAnimation() { + API.event.emit("function.animate", {mode: settings.mode}); + } + function prepareExport() { const argsave = arguments; if (!complete.preview) { diff --git a/src/kiri/stack.js b/src/kiri/stack.js index a510b60c..48d6f268 100644 --- a/src/kiri/stack.js +++ b/src/kiri/stack.js @@ -49,6 +49,7 @@ } setLastFraction(frac = 1) { + if (this.lastVis) for (let mesh of this.lastVis.children) { let geo = mesh.geometry; let pos = geo.attributes.position; diff --git a/src/mode/cam/client.js b/src/mode/cam/client.js index b58aed86..2bf4f16d 100644 --- a/src/mode/cam/client.js +++ b/src/mode/cam/client.js @@ -41,7 +41,7 @@ API = api; // wire up animate button in ui - api.function.animate = () => { + api.event.on("function.animate", (mode) => { if (isCamMode && !camStock) { return api.show.alert("animation requires stock to be enabled"); } @@ -50,7 +50,7 @@ animate(); } }); - }; + }); api.event.on("mode.set", (mode) => { isCamMode = mode === 'CAM'; diff --git a/src/mode/fdm/client.js b/src/mode/fdm/client.js index 8e6296f7..7f56f8a2 100644 --- a/src/mode/fdm/client.js +++ b/src/mode/fdm/client.js @@ -102,6 +102,24 @@ } } + api.event.on("function.animate", (mode) => { + if (!isFdmMode) { + return; + } + if (!API.conf.get().controller.danger) { + return; + } + let pct = 0; + let int = setInterval(function() { + if (pct <= 1) { + api.const.STACKS.setFraction(pct); + pct += 0.05; + } else { + api.const.STACKS.setFraction(1); + clearTimeout(int); + } + }, 50); + }); api.event.on("mode.set", mode => { isFdmMode = mode === 'FDM'; lastMode = mode; From d3ed5941301181c84a966d4f0591cfd6f08e0069 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 4 Mar 2021 17:10:39 -0500 Subject: [PATCH 213/255] properly select dx or dy based on contour type --- src/mode/cam/topo.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mode/cam/topo.js b/src/mode/cam/topo.js index e94be23c..0b6434bb 100644 --- a/src/mode/cam/topo.js +++ b/src/mode/cam/topo.js @@ -154,8 +154,8 @@ if (curvesOnly && lastP) { // maxangle const dz = Math.abs(lastP.z - z); - const dxy = Math.max(Math.abs(lastP.x - x), Math.abs(lastP.y - y)); - const angle = Math.atan2(dz, dxy) * RAD2DEG; + const dv = contourX ? Math.abs(lastP.x - x) : Math.abs(lastP.y - y); + const angle = Math.atan2(dz, dv) * RAD2DEG; // if (lastP.z < 0.1) console.log('pp', {dz, dxy, angle}); if (angle > maxangle) { lastP = newP; From bdc7f5ac40a3bcb8653e801eb1cf50f617f087a7 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 4 Mar 2021 19:35:27 -0500 Subject: [PATCH 214/255] fix premature solid optimization --- src/mode/fdm/slice.js | 55 ++++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 30 deletions(-) diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index b41e59e2..ef96d4d0 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -26,7 +26,8 @@ }, PROTO = Object.clone(COLOR), bwcomp = (1 / Math.cos(Math.PI/4)), - getRangeParameters = FDM.getRangeParameters; + getRangeParameters = FDM.getRangeParameters, + debug = false; let isThin = false; // force line rendering let isFlat = false; // force flat rendering @@ -477,13 +478,13 @@ .setLayer("gaps", COLOR.gaps) .addPolys(top.gaps, vopt({ offset, height, thin: true })); - // if (isThin && debug) { - // slice.output() - // .setLayer('offset', { face: 0, line: 0x888888 }) - // .addPolys(top.fill_off) - // .setLayer('last', { face: 0, line: 0x008888 }) - // .addPolys(top.last); - // } + if (isThin && debug) { + slice.output() + .setLayer('offset', { face: 0, line: 0x888888 }) + .addPolys(top.fill_off) + .setLayer('last', { face: 0, line: 0x008888 }) + .addPolys(top.last); + } if (top.fill_lines && top.fill_lines.length) output .setLayer("fill", isSynth ? COLOR.support : COLOR.fill) @@ -496,15 +497,22 @@ if (top.thin_fill) output .setLayer("fill", COLOR.fill) .addLines(top.thin_fill, vopt({ offset, height })); - - // emit solid areas - // if (isThin && debug) { - // output - // .setLayer("solids", { face: 0x00dd00 }) - // .addAreas(slice.solids); - // } }); + if (isThin && debug) { + if (slice.solids) output + .setLayer("solids", { face: 0x00dd00 }) + .addAreas(slice.solids); + + if (slice.bridges) output + .setLayer("bridges", { face: 0x00aaaa, line: 0x00aaaa }) + .addAreas(slice.bridges); + + if (slice.flats) output + .setLayer("flats", { face: 0xaa00aa, line: 0xaa00aa }) + .addAreas(slice.flats); + } + if (slice.supports) output .setLayer("support", COLOR.support) .addPolys(slice.supports, vopt({ offset, height })); @@ -515,16 +523,6 @@ .addLines(poly.fill, vopt({ offset, height })); }); - // if (isThin && debug) { - // output - // .setLayer("bridges", { face: 0x00aaaa, line: 0x00aaaa }) - // .addAreas(top.bridges); - // - // output - // .setLayer("flats", { face: 0xaa00aa, line: 0xaa00aa }) - // .addAreas(top.flats); - // } - // console.log(slice.index, slice.render.stats); } @@ -939,18 +937,15 @@ if (solids.length === 0) return false; if (unioned.length === 0) return false; - let masks, - trims = [], + let trims = [], inner = isSLA ? slice.topPolys() : slice.topFillOff(); // trim each solid to the inner bounds unioned.forEach(function(p) { p.setZ(slice.z); inner.forEach(function(i) { - if (p.del) return; - masks = p.mask(i); + let masks = p.mask(i); if (masks && masks.length > 0) { - p.del = true; trims.appendAll(masks); } }); From 32c162e99c6e573df6de11f231fa43f8faba3fb3 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 4 Mar 2021 19:37:08 -0500 Subject: [PATCH 215/255] bump rev 2.7.D16 --- package.json | 2 +- src/kiri.js | 2 +- src/license.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 72c1d131..d27a16af 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grid-apps", - "version": "2.7.15D", + "version": "2.7.16D", "description": "grid.space 3d slice & modeling tools", "author": "Stewart Allen ", "license": "MIT", diff --git a/src/kiri.js b/src/kiri.js index 2f9d1bcc..a0e52c79 100644 --- a/src/kiri.js +++ b/src/kiri.js @@ -6,7 +6,7 @@ if (!self.kiri) { self.kiri = { - beta: 2715, + beta: 2716, driver: {}, // driver modules loader: [] // module loading: array of functions }; diff --git a/src/license.js b/src/license.js index 8cb774fb..360a42f4 100644 --- a/src/license.js +++ b/src/license.js @@ -3,7 +3,7 @@ let terms = { COPYRIGHT: "Copyright (C) Stewart Allen - All Rights Reserved", LICENSE: "See the license.md file included with the source distribution", - VERSION: "2.7.D15" + VERSION: "2.7.D16" }; if (typeof(module) === 'object') { From 0b26bf35b18ef83cdcb979023d756da0dfb42d17 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 4 Mar 2021 22:13:44 -0500 Subject: [PATCH 216/255] change method for eliminating duplicate internal thru polys --- notes.md | 12 ++++-------- src/mode/cam/ops.js | 8 +++++--- src/mode/fdm/prepare.js | 7 ++++--- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/notes.md b/notes.md index b4b6b8a1..09a30f38 100644 --- a/notes.md +++ b/notes.md @@ -10,12 +10,12 @@ * `P` client/worker message interface normalization * `P` explore widget vertex reloading / replacing (Onshape) (issue #48) +* `F` SVG import to 3D part like images * `F` show slider range values in workspace units (on hover?) * `F` allow select of a range by typing in values in slices or workspace units * `F` add % field type with conversion (like units) * `F` complete G2/G3 arc output / input (85% now) * `F` expose grouping feature -* `F` SVG import to 3D part like images * `F` integrate svg nest arrange algorithm # FDM @@ -68,19 +68,16 @@ * `B` path routing with tabs sometimes makes no sense * `B` clicking on a pop-op should pin it until clicked or [esc] * `B` need to force cut line at synthetic z bottom (midlines, etc) -* `B` non-clear-voids duplicates thru-holes * `B` starting export during animation unleashes chaos -* `B` climb vs conventional not fully consistent after refactor -* `B` outside cutting direction in roughing mode inverted +* `F` add ease-down support to trace op +* `F` add linear clearing strategy +* `F` add adaptive clearing strategy * `F` user-selectable origin (issue #28) -* `F` import SVG into a path that can be overlaid onto a 3D mesh (laser?) * `F` intelligently turn circle hole pocket clear into spiral down * `F` trace follow hole that matches endmill should turn into a drill op * `F` add climb/conventional into each operation * `F` update analyzer to detect overhangs -* `F` add linear clearing strategy option for roughing / pocket -* `F` adaptive clearing in roughing mode * `F` extend acute roughing on inside polys to clear small voids * `F` option to use part / STL coordinate space to determine X,Y origin * `F` validate muti-part layout and spacing exceeds largest outside tool diameter @@ -97,7 +94,6 @@ * `F` can animation clear the mesh in areas where the cuts go through the stock? * `F` support lathe mode / A-axis / rotary * `F` gcode output option as zip for multiple or flip ops or tool change -* `F` ease-down should be engaged in all descending cutting operations * `F` maintain several part orientations + op chains in a single profile * `P` common part pre-analyze to speed up 'slice' and improve shadow (overhangs) diff --git a/src/mode/cam/ops.js b/src/mode/cam/ops.js index 4d0e0ce3..465a3cce 100644 --- a/src/mode/cam/ops.js +++ b/src/mode/cam/ops.js @@ -223,7 +223,7 @@ }); shadow = POLY.nest(shadow); - // expand shadow by half tool diameter + stock to leave + // shell = shadow expanded by half tool diameter + leave stock const sadd = roughIn ? toolDiam / 2 : toolDiam / 2; const shell = POLY.offset(shadow, sadd + roughLeave); @@ -274,10 +274,12 @@ // elimate double inset on inners offset.forEach(op => { if (op.inner) { - let operim = op.perimeter(); + let pv1 = op.perimeter(); let newinner = []; op.inner.forEach(oi => { - if (Math.abs(oi.perimeter() - operim) > 0.01) { + let pv2 = oi.perimeter(); + let pct = pv1 > pv2 ? pv2/pv1 : pv1/pv2; + if (pct < 0.98) { newinner.push(oi); } }); diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index 32db121e..3891e03c 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -580,6 +580,7 @@ const flat = opts.flat; const thin = opts.thin && !flat; const ckspeed = opts.speed !== false; + const headColor = 0x888888; const moveColor = opts.move >= 0 ? opts.move : 0xaaaaaa; const printColor = opts.print >= 0 ? opts.print : 0x777700; const layers = []; @@ -709,14 +710,14 @@ } if (heads.length) { output - .setLayer('arrows', { face: moveColor, line: 0x555555, opacity: 0.5 }, true) + .setLayer('arrows', { face: headColor, line: 0x112233, opacity: 0.5 }, true) .addAreas(heads.map(points => { const {p1, p2} = points; const slope = p2.slopeTo(p1); const s1 = BASE.newSlopeFromAngle(slope.angle + 20); const s2 = BASE.newSlopeFromAngle(slope.angle - 20); - const p3 = points.p2.projectOnSlope(s1, 0.4); - const p4 = points.p2.projectOnSlope(s2, 0.4); + const p3 = points.p2.projectOnSlope(s1, 0.8); + const p4 = points.p2.projectOnSlope(s2, 0.8); return newPolygon().addPoints([p2,p3,p4]).setZ(p2.z + 0.01); }), { thin: true, outline: true }); } From 1239968ade6e9e5b8e347c432f11f2ed1c3cf21c Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 5 Mar 2021 11:24:05 -0500 Subject: [PATCH 217/255] fix parsing of gcode with initial purge on a high z --- notes.md | 1 + src/kiri/print.js | 24 ++++++++++++++---------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/notes.md b/notes.md index 09a30f38..3ac5d9e6 100644 --- a/notes.md +++ b/notes.md @@ -70,6 +70,7 @@ * `B` need to force cut line at synthetic z bottom (midlines, etc) * `B` starting export during animation unleashes chaos +* `F` limit cut depth to flute length of selected tool * `F` add ease-down support to trace op * `F` add linear clearing strategy * `F` add adaptive clearing strategy diff --git a/src/kiri/print.js b/src/kiri/print.js index e134298f..f830fda5 100644 --- a/src/kiri/print.js +++ b/src/kiri/print.js @@ -134,7 +134,8 @@ seq = [], autolayer = true, newlayer = false, - arcdivs = Math.PI / 12; + arcdivs = Math.PI / 12, + hasmoved = false; const output = scope.output = [ seq ]; const beltaxis = { X: "X", Y: "Z", Z: "Y", E: "E", F: "F" }; @@ -211,25 +212,23 @@ function G0G1(g0, line) { const mov = {}; + const axes = {}; line.forEach(function(tok) { let axis = tok.charAt(0); if (morph && belt) { axis = beltaxis[axis]; } + let val = parseFloat(tok.substring(1)); + axes[axis] = val; if (abs) { - pos[axis] = parseFloat(tok.substring(1)); + pos[axis] = val; } else { - mov[axis] = parseFloat(tok.substring(1)); + mov[axis] = val; + pos[axis] += val; } }); - if (!abs) { - for (let [k,v] of Object.entries(mov)) { - pos[k] += v; - } - } - const point = newPoint( factor * pos.X + off.X + xoff.X, factor * pos.Y + off.Y + xoff.Y, @@ -242,7 +241,7 @@ } const retract = (fdm && pos.E < 0) || undefined; - const moving = g0 || (fdm && pos.E <= 0); + const moving = g0 || (fdm && (pos.E <= 0 || !(axes.X || axes.Y || axes.Z))); if (!moving && point.x) bounds.min.x = Math.min(bounds.min.x, point.x); if (!moving && point.x) bounds.max.x = Math.max(bounds.max.x, point.x); @@ -280,6 +279,11 @@ output.push(seq); } + if (!hasmoved && !moving) { + seq.height = seq.Z = pos.Z; + hasmoved = true; + } + // debug extrusion rate if (false && fdm && lastPos) { let dE = (absE ? pos.E - lastPos.E : pos.E); From cf2e40b035b82e42a007d0863bc06ba21d1a5c8d Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 6 Mar 2021 12:21:25 -0500 Subject: [PATCH 218/255] start polish localization --- notes.md | 5 +- package.json | 2 +- src/kiri/init.js | 4 + src/kiri/lang.js | 13 +- web/kiri/index.html | 1 + web/kiri/lang/pl-help.html | 1 + web/kiri/lang/pl-pl-help.html | 180 ++++++++++ web/kiri/lang/pl-pl.js | 646 ++++++++++++++++++++++++++++++++++ web/kiri/lang/pl.js | 1 + 9 files changed, 843 insertions(+), 10 deletions(-) create mode 120000 web/kiri/lang/pl-help.html create mode 100644 web/kiri/lang/pl-pl-help.html create mode 100644 web/kiri/lang/pl-pl.js create mode 120000 web/kiri/lang/pl.js diff --git a/notes.md b/notes.md index 3ac5d9e6..8a93138d 100644 --- a/notes.md +++ b/notes.md @@ -20,6 +20,7 @@ # FDM +* `B` re-calibrate slicing progress weighting * `B` infill densities are inaccurate * `B` fix support projection/end with grouped parts * `B` multi-extruder rendering of raft fails to offset the rest of the print @@ -58,7 +59,9 @@ * `B` ranges don't work with anchors * `B` multiple parts with one angled against origin "floats" in preview * `B` re-add progress calls for all work units -* `F` arrange should just align down Z. no side to side. + +* `F` slightly angle supports to lean into the Z of the part +* `F` arrange should just align down Z, not side to side. # CAM diff --git a/package.json b/package.json index d27a16af..0ed33b26 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "moment": "^2.24.0", "pixi.js": "^4.8.9", "serve-static": "^1.14.1", - "three": "^0.125.0", + "three": "^0.126.0", "tween.js": "^0.14.0", "uglify-es": "3.3.9", "validator": "^8.2.0", diff --git a/src/kiri/init.js b/src/kiri/init.js index 9620a03c..7c90ab0f 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -2020,6 +2020,10 @@ SDB.setItem('kiri-lang', 'fr-fr'); API.space.reload(); }; + $('lset-pl').onclick = function() { + SDB.setItem('kiri-lang', 'pl-pl'); + API.space.reload(); + }; SPACE.addEventHandlers(self, [ 'keyup', keyUpHandler, diff --git a/src/kiri/lang.js b/src/kiri/lang.js index 9f464938..1745774e 100644 --- a/src/kiri/lang.js +++ b/src/kiri/lang.js @@ -17,14 +17,11 @@ } let tok = key.split('-'); switch (tok[0]) { - case 'en': - return 'en-us'; - case 'da': - return 'da-dk'; - case 'de': - return 'de-de'; - case 'fr': - return 'fr-fr'; + case 'da': return 'da-dk'; + case 'de': return 'de-de'; + case 'en': return 'en-us'; + case 'fr': return 'fr-fr'; + case 'pl': return 'pl-pl'; } return KDFL; }; diff --git a/web/kiri/index.html b/web/kiri/index.html index 49de7522..eee7e8bb 100644 --- a/web/kiri/index.html +++ b/web/kiri/index.html @@ -51,6 +51,7 @@
    english
    french
    german
    +
    polish
    diff --git a/web/kiri/lang/pl-help.html b/web/kiri/lang/pl-help.html new file mode 120000 index 00000000..e1c48e23 --- /dev/null +++ b/web/kiri/lang/pl-help.html @@ -0,0 +1 @@ +pl-pl-help.html \ No newline at end of file diff --git a/web/kiri/lang/pl-pl-help.html b/web/kiri/lang/pl-pl-help.html new file mode 100644 index 00000000..bb5c4f49 --- /dev/null +++ b/web/kiri/lang/pl-pl-help.html @@ -0,0 +1,180 @@ +
    + +
    + + +
    + +
    + +
    +
    o programie
    +
    początki
    +
    sterowanie
    +
    wsparcie
    +
    projekt
    +
    + +
    +
    +
    +

    + Kiri:Moto jest unikalnym, opartym na przeglądarce, w pełni otwartym programem + do cięcia modeli, który zamienia modele 3d w instrukcje maszynowe dla drukarek 3D, + frezarek CNC i wycinarek laserowych. +


    +

    + Oparcie na przeglądarce oznacza, że całe przetwarzanie odbywa się w lokalnej + przeglądarce, a nie w chmurze. Twoje dane i modele pozostają prywatne tylko dla Ciebie. +


    +

    + Oznacza to, że Kiri zachowuje się tak samo, jak natywny program na komputerze użytkownika. + Bezpieczna tak jak bezpieczna jest piaskownica przeglądarki. +


    +

    + Kolejną zaletą działania w sieci jest to, że Kiri jest zawsze aktualny. Nowa strona + nowe funkcje, poprawki błędów i aktualizacje pojawiają się często. Jeśli chcesz uruchomić + starszą wersję Kiri lub wersję rozwojową, należy wybrać ją z menu użytkownika w prawym górnym rogu. +

    +
    +
    + Słowo Kiri pochodzi od kiri-e, która jest japońską sztuką wycinania papieru. + Moto to skrót od "Modeling Tool". +
    + +
    + Skrócona instrukcja obsługi +
    +

    +

  • obejrzyj (po angielsku) The Definitive Video Guide to Kiri:Moto 2.5
  • +
  • menu ustawienia urządzenia i tryby
  • +
  • ustawienia interfejsu użytkownika i trybów
  • +
  • dopasowanie parametrów urządzenia, jeśli chcesz zmienić ustawienia domyślne
  • +
  • otwórz plik lub zaimportuj element do przestrzeni roboczej
  • +
  • uzyj menu po prawej stronie by dopasować parametry krojenia obiektów
  • +
  • aby zobaczyć jak działają parametry, pokrój obiekty
  • +
  • podgląd ścieżki z pokrojonych obiektów
  • +
  • eksportuj ścieżki zmian do g-kodu lub pliku svg
  • +

    +
    +
    + Tryby pracy +

    Każdy tryb (FDM, CAM, Laser, SLA) ma inne funkcje i ustawienia. + Obejrzyj filmy na Youtube, aby dowiedzieć się więcej. +

    +
    +
    + +
    o druku 3d
    +
    o frezowaniu cnc
    +
    o cięciu laserem
    + +
    +
    +


    Contrôles via la souris
    ComboAction
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Sterowanie klawiaturą
    KlawiszDziałanie
    Konfiguracja
    Wybór urządzenia
    Wybór narzędzi CAM
    Lokalna siatka odniesienia urządzeń
    Panel sterowania
    Profile prac
    Tryb
    Wyrównanie
    Krojenie
    Podgląd
    Animacja
    Eksport
    Plik
    Import
    Ostatnie
    Widok
    Początek
    Góra
    Z przodu
    Z tyłu
    Przywrócenie ustawień widoku
    Widok cykli
    Podświetl (wyrównanie)
    Warstwa (plastry/podgląd)
    Obiekty
    Powiel
    Odbij
    Ustawienia obrotów
    Kasowanie
    Obrót o 90°
    Obrót o 5°
    Przesuń o 5mm
    Zaznacz wszystko
    Pomoc
    To okno


    Ustawienia myszy
    ComboAkcje
    Widok
    kołaZmiana warstwy
    przemieśćprzemieść obiekty
    przemieść obiekty
    Obróć
    Powiększ
    Powiększ
    przesuńprzemieść obiekty
    Obiekty
    Dopasowanie ściany do podłoża
    Dopasowanie ściany do podłoża
    +
    +
    + +
    + Zasoby + + Opcje w programie +

    + Pod przyciskiem menu użytkownika w prawym górnym rogu, + jest opcja eksport, tworzy on kopię do pobrania profili urządzenia + (opcjonalnie również obszaru roboczego). Plik ten może być użyty do tworzenia kolejnych wersji i + przywracania pełnej migawki konfiguracji w dowolnym momencie. Można go również udostępnić programistom + lub innym użytkownikom, aby mogli odtworzyć środowisko użytkownika. Może to pomóc w usuwaniu błędów. +

    +
    + +
    + Otwarte Oprogramowanie +

    + Kiri:Moto jest w całości wolnym oprogramowaniem. + Sprawdź stronę projektu na Githubie. Istnieją projekty towarzyszące, zarówno sprzętowe jak i programowe. + Nowi programiści i wkłady w kod źródłowy są oczywiście mile widziane. Kod źródłowy na licencji MIT. +


    +

    + Dotacje mile widziane. +

    +
    Integrations +

    Kiri:Moto współdziała z różnymi innymi aplikacjami jako strona internetowa

    +
  • Onshape w sklepie App Store
  • +
  • Thingiverse jako natywne 'Thing Apps'
  • +
  • Jako główny program do cięcia uzywany przez SimplyPrint.io
  • +
  • CAMLab jest programem pochodnym poprzedniej wersji Kiri:Moto
  • +
    + +
    + +
    +
    diff --git a/web/kiri/lang/pl-pl.js b/web/kiri/lang/pl-pl.js new file mode 100644 index 00000000..fdbe0cb0 --- /dev/null +++ b/web/kiri/lang/pl-pl.js @@ -0,0 +1,646 @@ +// english. other language maps will defer to english +// map for any missing key/value pairs +kiri.lang['pl'] = +kiri.lang['pl-pl'] = { + // common keys and menus + animate: "animacja", // CAM animate button + arrange: "rozmieść", // layout workspace objects + axis: "osie", // left object scale pop menu + clear: "wyczyść", //"czyszczenie z obiektów", // clear workspace (remove all objects) + copy: "kopiowanie", + delete: "kasowanie", + detail: "szczegóły", + done: "wykonaj", + enable: "włącz", + export: "eksport", + files: "pliki", + help: "pomoc", + ghost: "druciak", // left render pop menu (wireframe) + hide: "ukryj", // left render pop menu (invisible) + home: "początek", + import: "import", + language: "język", + machine: "maszyna", // device or machine + metric: "metryka", + name: "nazwa", + prefs: "ustawienia", // left menu "preferences" + preview: "podgląd", + recent: "recent", + render: "render", // left render pop menu + reset: "reset", + rotate: "obróć", // left rotate pop menu + save: "zapisz", + scale: "skala", // left object scale pop menu + setup: "ustaw", + settings: "ustawienia", + size: "wielkość", + slice: "plaserki", + solid: "wypełniony", // view type pop menu + start: "start", + tool: "narzędzie", + tools: "narzędzia", // CAM tool menu button + top: "góra", + type: "typ", // CAM tool type + version: "wersja", + view: "widok", // left view pop menu + wire: "druciak", // left render pop menu "wire" + + acct_xpo: ["zrób backup swojego urządzenia","i profil urządzenia z","opcja by zapisać przestrzeń roboczą","obiekty i pozycje"], + + // RIGHT-CLICK CONTEXT MENU + rc_clws: "wyczyść przestrzeń roboczą", + rc_xpws: "wyeksportuj przestrzeń roboczą", + rc_lafl: "ułóż płasko", + rc_mirr: "odbicie", // lustro + rc_dupl: "skopiuj", + rc_xstl: "zapisz w formacie STL", + + // DEVICE MENU and related dialogs + dm_sldt: "select a device type", + dm_stdd: "standard devices", + dm_mydd: "my devices", + dm_seld: "selected device", + dm_rcnt: "recent files", + dm_savs: "saved settings", + dm_appp: "Application Preferences", + + // CAM Tool Dialog + td_tyem: "end", // end mill + td_tybm: "ball", // ball mill + td_tytm: "taper", // taper mill + td_tonm: "tool #", + td_shft: "shaft", // endmill shaft specs + td_flut: "flute", // endmill flute specs + td_tapr: "taper", // endmill taper specs + + // DEVICE dialog groups + dv_gr_dev: "device", + dv_gr_ext: "extruder", + dv_gr_out: "output", + dv_gr_gco: "gcode macros", + + // DEVICE dialog (_s = label, _l = hover help) + dv_name_s: "name", + dv_name_l: "device name", + dv_fila_s: "filament", + dv_fila_l: "diameter in millimeters", + dv_nozl_s: "nozzle", + dv_nozl_l: "diameter in millimeters", + dv_bedw_s: "width", + dv_bedw_l: "workspace units", + dv_bedd_s: "depth", + dv_bedd_l: "workspace units", + dv_bedh_s: "height", + dv_bedh_l: ["max build height","in workspace units"], + dv_spmx_s: "max spindle", + dv_spmx_l: ["max spindle rpm speed","0 to disable"], + dv_xtab_s: "absolute positioning", + dv_xtab_l: "extrusion moves absolute", + dv_orgc_s: "origin center", + dv_orgc_l: "bed origin center", + // dv_orgt_s: "origin top", + // dv_orgt_l: "part z origin top", + dv_bedc_s: "circular bed", + dv_bedc_l: "device bed is circular", + dv_belt_s: "belt bed", + dv_belt_l: "continuous printing bed", + dv_retr_s: "firmware retract", + dv_retr_l: ["device fimware supports G10/G11"], + dv_fanp_s: "fan power", + dv_fanp_l: "set cooling fan power", + dv_prog_s: "progress", + dv_prog_l: "output on each % progress", + dv_layr_s: "layer", + dv_layr_l: ["output at each","layer change"], + dv_tksp_s: "token spacer", + dv_tksp_l: ["add a space between","gcode axis parameters","G0X0Y0X0","vs","G0 X0 Y0 Z0"], + dv_strc_s: "strip comments", + dv_strc_l: ["strip gcode comments","comments begin with ;"], + dv_fext_s: "file extension", + dv_fext_l: "file name extension", + dv_dwll_s: "dwell", + dv_dwll_l: "gcode dwell script", + dv_tool_s: "tool change", + dv_tool_l: "tool change script", + dv_sspd_s: "spindle speed", + dv_sspd_l: "set spindle speed", + dv_paus_s: "pause", + dv_paus_l: "gcode pause script", + dv_head_s: "header", + dv_head_l: "gcode header script", + dv_foot_s: "footer", + dv_foot_l: "gcode footer script", + dv_lzon_s: "laser on", + dv_lzon_l: "gcode laser on script", + dv_lzof_s: "laser off", + dv_lzof_l: "gcode laser off script", + dv_exts_s: "select", + dv_exts_l: "gcode run to enable this extruder", + dv_dext_s: "deselect", + dv_dext_l: "gcode run before enabling another extruder", + dv_extd_s: "deselect", + dv_extd_l: "gcode to deselect this extruder", + dv_exox_s: "offset x", + dv_exox_l: "nozzle offset x", + dv_exoy_s: "offset y", + dv_exoy_l: "nozzle offset y", + + // MODE + mo_menu: "mode", + mo_fdmp: "FDM Print", + mo_slap: "SLA Print", + mo_lazr: "Laser Cut", + mo_cncm: "CNC Mill", + + // SETUP + su_menu: "setup", + su_devi: "Devices", + su_tool: "Tools", + su_locl: "Local", + su_xprt: "Export", + su_help: "Help", + + // LOAD + fe_menu: "file", + fn_recn: "Recent", + fn_impo: "Import", + + // FUNCTION + fn_menu: "action", + fn_arra: "Arrange", + fn_slic: "Slice", + fn_prev: "Preview", + fn_expo: "Export", + + // VIEW + vu_menu: "view", + vu_home: "Home", + vu_rset: "Reset", + vu_sptp: "Top", + vu_spfr: "Front", + vu_splt: "Left", + vu_sprt: "Right", + + // WORKSPACE + ws_menu: "view", + ws_save: "Save", + ws_cler: "Clear", + + // OPTIONS + op_menu: "interface", + op_disp: "display", + op_xprt_s: "expert", + op_xprt_l: "show more settings options", + op_decl_s: "decals", + op_decl_l: "show device decals and logos", + op_dang_s: "experimental", + op_dang_l: "show experimental parameters", + op_hopo_s: "hover pop", + op_hopo_l: ["enable menu hover","to activate"], + op_dark_s: "dark mode", + op_dark_l: "dark mode interface", + op_comp_s: "compact ui", + op_comp_l: ["compact user interface","better for small screens","and tablets"], + op_shor_s: "show origin", + op_shor_l: "show device or process origin", + op_shru_s: "show rulers", + op_shru_l: ["show axes rulers","on major gridlines"], + op_sped_s: "show speeds", + op_sped_l: ["show speed to color bar","in preview mode"], + op_auto_s: "auto layout", + op_auto_l: ["automatically layout platform","when new items added"], + op_free_s: "free layout", + op_free_l: ["permit dragable layout","no effect in laser mode"], + op_spcr_s: "spacing", + op_spcr_l: ["spacing between objects","during auto layout","in workspace units"], + op_orth_s: "orthographic", + op_orth_l: ["orthographic display","requires page refresh"], + op_invr_s: "invert zoom", + op_invr_l: ["invert mouse wheel","scroll zoom"], + op_save_s: "auto save", + op_save_l: ["preserve objects in workspace","between application reloads"], + op_line_s: "line type", + op_line_l: ["line style for path rendering","impacts 3d performance","path: 3d best","flat: 2d good","line = 1d fast"], + op_unit_s: "units", + op_unit_l: ["workspace units affects","speeds and distances"], + op_anim_s: "animate", + op_anim_l: ["animation mesh density","higher is more dense","takes more memory","and is slower"], + + lo_menu: "layout", + + pt_menu: "parts", + pt_deci_s: "decimate", + pt_deci_l: ["enable or disable point decimation","during port import. for faster slicing","and lower memory usage"], + pt_qual_s: "quality", + pt_qual_l: ["level of detail to retain","during slicing operations","lower is faster"], + pt_heal_s: "heal mesh", + pt_heal_l: ["attempt to heal","non-manifold meshes","adds to slicing time"], + + xp_menu: "exports", + + // SETTINGS + se_menu: "profile", + se_load: "load", + se_save: "save", + + // FDM SLICING + sl_menu: "layers", + sl_lahi_s: "height", + sl_lahi_l: ["height of each slice","layer in millimeters"], + ad_minl_s: "height min", + ad_minl_l: ["adaptive min layer height","in millimeters","must be non-zero"], + sl_ltop_s: "top layers", + sl_ltop_l: ["number of solid layers","to enforce at the","top of the print"], + sl_lsld_s: "solid layers", + sl_lsld_l: ["solid fill areas computed","from layer deltas. see","layer pop menu"], + sl_lbot_s: "base layers", + sl_lbot_l: ["number of solid layers","to enforce at the","bottom of the print"], + ad_adap_s: "adaptive", + ad_adap_l: ["use adaptive layer heights","with 'layer height' as max","and 'layer min' as the min"], + + // FDM SHELLS + sl_shel_s: "shell count", + sl_shel_l: ["number of perimeter","walls to generate"], + sl_ordr_s: "shell order", + sl_ordr_l: ["output shell order","inside to outside","or outside to inside","affects surface quality"], + sl_strt_s: "layer start", + sl_strt_l: ["layer starting point","last = last layer end","center = part center","origin = device origin"], + ad_thin_s: "thin walls", + ad_thin_l: ["detect and fill gaps","between shell walls"], + + // FDM FILL + fi_menu: "infill", + fi_type: "type", + fi_pcnt_s: "fill fraction", + fi_pcnt_l: ["fill density values","0.0 - 1.0"], + fi_angl_s: "solid start", + fi_angl_l: ["starting angle in degrees","90 degrees added to ","each following layer","applies only to solid layers"], + fi_over_s: "overlap", + fi_over_l: ["overlap with shell and other fill","as fraction of nozzle diameter","0.0 - 1.0"], + // fi_rate_s: "print speed", + fi_rate_l: ["extrusion speed for infill","set to 0 to use default","output print speeds"], + + // FDM FIRST LAYER + fl_menu: "base", + fl_lahi_s: "layer height", + fl_lahi_l: ["height of each slice","in millimeters","should be >= slice height"], + fl_rate_s: "shell speed", + fl_rate_l: ["shell printing max speed","in millimeters / minute"], + fl_frat_s: "fill speed", + fl_frat_l: ["fill printing max speed","in millimeters / minute"], + fl_mult_s: "flow factor", + fl_mult_l: ["extrusion multiplier","0.0 - 2.0"], + fl_sfac_s: "width factor", + fl_sfac_l: ["multiplier on nozzle size","changes line spacing"], + fl_skrt_s: "skirt count", + fl_skrt_l: ["number of first-layer offset","brims to generate"], + fl_skro_s: "skirt offset", + fl_skro_l: ["skirt offset from part","in millimeters"], + fl_nozl_s: "nozzle temp", + fl_nozl_l: ["degrees in celsius","output setting used","when this is zero"], + fl_bedd_s: "bed temp", + fl_bedd_l: ["degrees in celsius","output setting used","when this is zero"], + fr_spac_s: "raft gap", + fr_spac_l: ["additional layer spacing","between 1st layer and raft","in millimeters"], + fr_nabl_s: "raft enable", + fr_nabl_l: ["create a raft under the","model for better adhesion","uses skirt offset and","disables skirt output"], + + // FDM BELT ONLY + fl_zoff_s: "belt offset", + fl_zoff_l: ["height offset from belt","of lowest extrusion","in millimeters"], + fl_brim_s: "brim size", + fl_brim_l: ["add brim to part bottom","size is width in millimeters","0 to disable"], + fl_brmn_s: "brim trigger", + fl_brmn_l: ["add brims only when segment","facing belt is shorter than this","value in millimeters","0 = Infinity"], + fl_bled_s: "part anchor", + fl_bled_l: ["belt part anchor","at start of print","in millimeters"], + + // FDM SUPPORT + sp_menu: "support", + sp_detect: "detect", + sp_dens_s: "density", + sp_dens_l: ["fraction 0.0 - 1.0","recommended 0.15","0 to disable"], + sp_size_s: "pillar size", + sp_size_l: ["pillar width","in millimeters"], + sp_offs_s: "part offset", + sp_offs_l: ["offset from part","in millimeters"], + sp_gaps_s: "gap layers", + sp_gaps_l: ["number of layers","offset from part"], + sp_span_s: "max span", + sp_span_l: ["unsupported span that causes","a new support to be generated","in millimeters"], + sp_angl_s: "max angle", + sp_angl_l: ["max overhang angle before","supporting pillar is generated"], + sp_area_s: "min area", + sp_area_l: ["minimum area for","a support column","in millimeters"], + sp_xpnd_s: "expand", + sp_xpnd_l: ["expand support area","beyond part boundary","in millimeters"], + sp_nozl_s: "extruder", + sp_nozl_l: ["in multi-extruder systems","the extruder to use for","support material"], + sp_auto_s: "automatic", + sp_auto_l: ["enable generated supports","using at-slice-time geometry","supports will only appear","after slicing completes"], + + // LASER SLICING + ls_offs_s: "offset", + ls_offs_l: ["adjust for beam width","in millimeters"], + ls_lahi_s: "height", + ls_lahi_l: ["layer height","in millimeters","0 = auto/detect"], + ls_lahm_s: "min", + ls_lahm_l: ["layer height minimum","will merge auto slices","under this thickness","in millimeters"], + ls_sngl_s: "single", + ls_sngl_l: ["perform only one slice","at specified layer height"], + + // CNC COMMON terms + cc_tool: "tool", + cc_offs_s: "offset", + cc_offs_l: ["offset tool center","from chosen path"], + cc_spnd_s: "spindle rpm", + cc_spnd_l: ["spindle speed in","revolutions / minute"], + cc_sovr_s: "step over", + cc_sovr_l: ["as a fraction of","tool diameter"], + cc_sdwn_s: "step down", + cc_sdwn_l: ["step down depth","for each pass","in workspace units","0 to disable"], + cc_feed_s: "feed rate", + cc_feed_l: ["max cutting speed in","workspace units / minute"], + cc_plng_s: "plunge rate", + cc_plng_l: ["max z axis speed in","workspace units / minute"], + cc_sngl_s: "select lines only", + cc_sngl_l: ["select only single edges","instead of connected polylines"], + + // CNC COMMON + cc_menu: "limits", + cc_flip: "flip", + cc_rapd_s: "xy feed", + cc_rapd_l: ["max xy moves feedrate","in workspace units / minute"], + cc_rzpd_s: "z feed", + cc_rzpd_l: ["max z moves feedrate","in workspace units / minute"], + + cc_loff_s: "offset", + cc_loff_l: ["distance from stock face","for leveling pass","in workspace units"], + + // CNC ROUGHING + cr_menu: "rough", + cr_lsto_s: "leave stock", + cr_lsto_l: ["horizontal offset from vertical faces","stock to leave for finishing pass","in workspace units"], + cr_ease_s: "ease down", + cr_ease_l: ["plunge cuts will","spiral down or ease","along a linear path"], + cr_clrt_s: "clear top", + cr_clrt_l: ["run a clearing pass over","the bounding area of the part","at z = 0"], + cr_clrp_s: "clear voids", + cr_clrp_l: ["mill out through pockets","instead of just the outline"], + cr_clrf_s: "clear faces", + cr_clrf_l: ["interpolate step down to","clear any detected flat areas"], + cr_olin_s: "inside only", + cr_olin_l: ["limit cutting to","inside part boundaries"], + + // CNC OUTLINE + co_menu: "outline", + co_dogb_s: "dogbones", + co_dogb_l: ["insert dogbone cuts","into inside corners"], + co_wide_s: "wide cutout", + co_wide_l: ["widen outside cutout paths","for deep cuts in hard material"], + co_olin_s: "inside only", + co_olin_l: ["limit cutting to","inside part boundaries"], + co_olot_s: "outside only", + co_olot_l: ["limit cutting to","exterior part boundaries","which can be thought of","as the shadow outline"], + co_omit_s: "omit through", + co_omit_l: "eliminate thru holes", + co_olen_s: "enable", + co_olen_l: "enabled outline cutting", + + // CNC CONTOUR + cn_menu: "contour", + cf_angl_s: "max angle", + cf_angl_l: ["angles greater than this","are considered vertical"], + cf_curv_s: "curves only", + cf_curv_l: ["limit linear cleanup","to curved surfaces"], + cf_olin_s: "inside only", + cf_olin_l: ["limit cutting to","inside part boundaries"], + cf_linx_s: "enable y pass", + cf_linx_l: "linear y-axis finishing", + cf_liny_s: "enable x pass", + cf_liny_l: "linear x-axis finishing", + + // CNC TRACE + cu_menu: "trace", + cu_type_s: "type", + cu_type_l: ["follow = tool tip follows line","right or left = tool tip","follows line offset by tool radius"], + + // CNC DRILLING + cd_menu: "drill", + cd_axis: "axis", + cd_points: "points", + cd_plpr_s: "plunge per", + cd_plpr_l: ["max plunge between","dwell periods","in workspace units","0 to disable"], + cd_dwll_s: "dwell time", + cd_dwll_l: ["dwell time","between plunges in","in milliseconds"], + cd_lift_s: "drill lift", + cd_lift_l: ["lift between plunges","after dwell period","in workspace units","0 to disable"], + cd_regi_s: "register", + cd_regi_l: ["drill registration holes","for double-sided parts","independent of enable","drilling but uses same","tool and settings"], + + // CNC CUTOUT TABS + ct_menu: "tabs", + ct_angl_s: "angle", + ct_angl_l: ["starting angle for tab spacing","in degrees (0-360)"], + ct_numb_s: "count", + ct_numb_l: ["number of tabs to use","will be spaced evenly","around the part"], + ct_wdth_s: "width", + ct_wdth_l: "width in workspace units", + ct_hght_s: "height", + ct_hght_l: "height in workspace units", + ct_dpth_s: "depth", + ct_dpth_l: ["distance in workspace units","that the tab projects from","the part surface"], + ct_midl_s: "midline", + ct_midl_l: ["use midline of tab","instead of z bottom","for double-sided work"], + ct_nabl_s: "auto", + ct_nabl_l: ["auto generate radial tabs","projected from part center","using count and angle offset"], + + // OUTPUT + ou_menu: "output", + + // LASER KNIFE + dk_menu: "knife", + dk_dpth_s: "cut depth", + dk_dpth_l: ["final cut depth","in millimeters"], + dk_pass_s: "cut passes", + dk_pass_l: ["number of passes","down to cut depth"], + dk_offs_s: "tip offset", + dk_offs_l: ["distance from blade tip","to center of tool","in millimeters"], + + // OUTPUT LASER + ou_spac_s: "spacing", + ou_spac_l: ["distance between layer output","in millimeters"], + ou_scal_s: "scaling", + ou_scal_l: "multiplier (0.1 to 100)", + ou_powr_s: "power", + ou_powr_l: ["0 - 100","represents %"], + ou_sped_s: "speed", + ou_sped_l: "millimeters / minute", + ou_mrgd_s: "merged", + ou_mrgd_l: ["merge all layers using","color coding to denote","stacking depth"], + ou_grpd_s: "grouped", + ou_grpd_l: ["retain each layer as","a unified grouping","instead of separated","polygons"], + ou_layr_s: "layer order", + ou_layr_l: ["output layer order","from top right to","bottom left"], + ou_layo_s: "layer color", + ou_layo_l: ["output layer colors","for each z index","overridden by merged"], + ou_drkn_s: "drag knife", + ou_drkn_l: ["enable drag knife","output in gcode","cut radii are added","to corners with","cut down passes"], + + // OUTPUT FDM + ou_nozl_s: "nozzle temp", + ou_nozl_l: "degrees in celsius", + ou_bedd_s: "bed temp", + ou_bedd_l: "degrees in celsius", + ou_feed_s: "print speed", + ou_feed_l: ["max print speed","millimeters / minute"], + ou_fini_s: "finish speed", + ou_fini_l: ["outermost shell speed","millimeters / minute"], + ou_move_s: "move speed", + ou_move_l: ["non-print move speed","millimeters / minute","0 = enable G0 moves"], + ou_shml_s: "shell factor", + ou_flml_s: "solid factor", + ou_spml_s: "infill factor", + ou_exml_l: ["extrusion multiplier","0.0 - 2.0"], + ou_fans_s: "fan speed", + ou_fans_l: "0 - 255", + + // OUTPUT CAM + ou_toll_s: "tolerance", + ou_toll_l: ["surface precision","in workspace units","lower is slower and","uses more memory","0 = automatic based","on animate preference"], + ou_zanc_s: "z anchor", + ou_zanc_l: ["controls the position of the part","when stock Z exceeds part Z"], + ou_ztof_s: "z offset", + ou_ztof_l: ["offset z anchor","in workspace units","has no effect when","anchor is middle"], + ou_zbot_s: "z bottom", + ou_zbot_l: ["offset from part bottom","to limit cutting depth","in workspace units"], + ou_zclr_s: "z clearance", + ou_zclr_l: ["safe travel offset","from top of part","in workspace units"], + ou_ztru_s: "z thru", + ou_ztru_l: ["extend cutout pass down","in workspace units"], + ou_conv_s: "conventional", + ou_conv_l: ["milling direction","uncheck for 'climb'"], + ou_depf_s: "depth first", + ou_depf_l: ["optimize pocket cuts","with depth priority"], + + // CAM STOCK + cs_menu: "stock", + cs_wdth_s: "width", + cs_wdth_l: ["width (x) in workspace units","0 defaults to part size"], + cs_dpth_s: "depth", + cs_dpth_l: ["depth (y) in workspace units","0 defaults to part size"], + cs_hght_s: "height", + cs_hght_l: ["height (z) in workspace units","0 defaults to part size"], + cs_offs_s: "offset", + cs_offs_l: ["use width, depth, height","as offsets from max","part size on platform"], + cs_clip_s: "clip to", + cs_clip_l: ["rough and outline","clip cutting paths","to defined stock"], + cs_offe_s: "enable", + cs_offe_l: "enable milling stock", + + // ORIGIN (CAM & LASER) + or_bnds_s: "origin bounds", + or_bnds_l: ["origin is relative to","boundary of all objects"], + or_cntr_s: "origin center", + or_cntr_l: "origin is referenced from the center", + or_topp_s: "origin top", + or_topp_l: "origin is references from the top of objects", + + // FDM ADVANCED + ad_menu: "expert", + ad_rdst_s: "retract dist", + ad_rdst_l: ["amount to retract filament","for long moves. in millimeters"], + ad_rrat_s: "retract rate", + ad_rrat_l: ["speed of filament","retraction in mm/s"], + ad_rdwl_s: "engage dwell", + ad_wpln_s: "retract wipe", + ad_wpln_l: ["non-printing move","after retraction","in millimeters"], + ad_rdwl_l: ["time between re-engaging","filament and movement","in milliseconds"], + ad_scst_s: "shell coast", + ad_scst_l: ["non-printing end","of perimeter shells","in millimeters"], + ad_msol_s: "min solid", + ad_msol_l: ["minimum area (mm^2)","required to keep solid","must be > 0.1"], + ad_mins_s: "min speed", + ad_mins_l: ["minimum speed","for short segments"], + ad_spol_s: "short path", + ad_spol_l: ["polygons shorter than this","will have their print speed","scaled down to min speed","in millimeters"], + ad_arct_s: "arc tolerance", + ad_arct_l: ["convert faceted lines to arcs","center point drift tolerance","when matching arc points","consider values around 0.15","in millimeters","0 to disable"], + ad_zhop_s: "z hop dist", + ad_zhop_l: ["amount to raise z","on retraction moves","in millimeters","0 to disable"], + ad_abkl_s: "anti-backlash", + ad_abkl_l: ["for better flat surface finish","use micro-movements to cancel","backlash in solid layer output","in millimeters","0 to disable","if your firmware has M425","put that in the gcode header","and leave this as 0"], + ad_lret_s: "layer retract", + ad_lret_l: ["force filament retraction","between layers"], + ad_play_s: "polish layers", + ad_play_l: ["polish up to specified","# of layers at a time"], + ad_pspd_s: "polish speed", + ad_pspd_l: ["polishing speed","in millimeters / minute"], + + // CAM EXPERT + cx_fast_s: "skip shadow", + cx_fast_l: ["disable overhang detection","can be faster and use less","memory with complex models","but fails with overhangs","try enabling if slicing","hangs during shadowing"], + + // FDM GCODE + ag_menu: "gcode", + ag_nozl_s: "nozzle", + ag_nozl_l: "select output nozzle or head", + ag_paws_s: "pause layers", + ag_paws_l: ["comma-separated list of layers","to inject pause commands before"], + ag_loop_s: "loop layers", + ag_loop_l: ["layer ranges to repeat in the format","first-last-count,first-last-count,...","omitted count = 1"], + + // SLA MENU + sa_menu: "slicing", + sa_lahe_s: "layer height", + sa_lahe_l: ["layer height","in millimeters"], + sa_shel_s: "hollow shell", + sa_shel_l: ["shell thickness in mm","use multiple of layer height","use 0 for solid (disabled)"], + sa_otop_s: "open top", + sa_otop_l: ["if shell is enabled","results in an open top"], + sa_obas_s: "open base", + sa_obas_l: ["if shell is enabled","results in an open base","disabled with supports"], + + sa_layr_m: "layers", + sa_lton_s: "light on time", + sa_lton_l: ["layer light on","time in seconds"], + sa_ltof_s: "light off time", + sa_ltof_l: ["layer light off","time in seconds"], + sa_pldi_s: "peel distance", + sa_pldi_l: ["peel distance","in millimeters"], + sa_pllr_s: "peel lift rate", + sa_pllr_l: ["peel lift speed","in mm/sec"], + sa_pldr_s: "peel drop rate", + sa_pldr_l: ["peel drop speed","in mm/sec"], + + sa_base_m: "base", + sa_balc_s: "layer count", + sa_balc_l: ["number of","base layers"], + sa_bltn_l: ["base layer light on","time in seconds"], + sa_bltf_l: ["base layer light off","time in seconds"], + + sa_infl_m: "infill", + sa_ifdn_s: "density", + sa_ifdn_l: ["percent infill","requires shell","0 = disabled","valid 0.0 - 1.0"], + sa_iflw_s: "line width", + sa_iflw_l: ["hatch line width","in millimeters"], + + sa_supp_m: "support", + sa_slyr_s: "base layers", + sa_slyr_l: ["base support layers","value range 0-10"], + sa_slgp_s: "gap layers", + sa_slgp_l: ["number of layers between","raft and bottom of object"], + sa_sldn_s: "density", + sa_sldn_l: ["used to compute the","number of support pillars","0.0-1.0 (0 = disable)"], + sa_slsz_s: "size", + sa_slsz_l: ["max size of a","support pillar","in millimeters"], + sa_slpt_s: "points", + sa_slpt_l: ["number of points in","each support pillar","in millimeters"], + sl_slen_l: "enable supports", + + sa_outp_m: "output", + sa_opzo_s: "z offset", + sa_opzo_l: ["z layer offset","almost always 0.0","0.0-1.0 in millimeters"], + sa_opaa_s: "anti alias", + sa_opaa_l: ["enable anti-aliasing","produces larger files","can blur details"] +}; diff --git a/web/kiri/lang/pl.js b/web/kiri/lang/pl.js new file mode 120000 index 00000000..73247290 --- /dev/null +++ b/web/kiri/lang/pl.js @@ -0,0 +1 @@ +pl-pl.js \ No newline at end of file From 423ad7064d6f73c9f6f70b58cd6ec06588cbc44b Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 6 Mar 2021 14:30:22 -0500 Subject: [PATCH 219/255] fix default min solid --- src/dev/fdm/Creality.CR-30 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dev/fdm/Creality.CR-30 b/src/dev/fdm/Creality.CR-30 index a080edbd..1315bf71 100644 --- a/src/dev/fdm/Creality.CR-30 +++ b/src/dev/fdm/Creality.CR-30 @@ -77,7 +77,7 @@ "sliceSupportExtra": 0, "sliceSupportAngle": 1, "sliceSupportNozzle": 0, - "sliceSolidMinArea": 10, + "sliceSolidMinArea": 1, "sliceSolidLayers": 3, "sliceBottomLayers": 3, "sliceTopLayers": 3, From fcc247a4e07e5d11ce871255efdefb7af8581372 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 6 Mar 2021 15:26:41 -0500 Subject: [PATCH 220/255] fix contour cutting corners --- src/mode/cam/ops.js | 7 ++++--- src/mode/cam/prepare.js | 6 +++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/mode/cam/ops.js b/src/mode/cam/ops.js index 465a3cce..0c8d515a 100644 --- a/src/mode/cam/ops.js +++ b/src/mode/cam/ops.js @@ -647,7 +647,8 @@ let { settings, widget } = state; let { process } = settings; - let toolDiam = this.toolDiam; + let toolDiam = this.toolDiam = new CAM.Tool(settings, op.tool).fluteDiameter(); + let stepover = toolDiam * op.step * 2; let cutdir = process.camConventional; let depthFirst = process.camDepthFirst; let depthData = []; @@ -674,7 +675,7 @@ poly.reverse(); } poly.forEachPoint(function(point, pidx) { - camOut(point.clone(), pidx > 0); + camOut(point.clone(), pidx > 0, stepover); }, false); }); newLayer(); @@ -688,7 +689,7 @@ poly.reverse(); } poly.forEachPoint(function(point, pidx) { - camOut(point.clone(), pidx > 0); + camOut(point.clone(), pidx > 0, stepover); }, false); newLayer(); return lastPoint(); diff --git a/src/mode/cam/prepare.js b/src/mode/cam/prepare.js index a5ebc0f3..91d43b38 100644 --- a/src/mode/cam/prepare.js +++ b/src/mode/cam/prepare.js @@ -231,7 +231,7 @@ ); } - function camOut(point, cut) { + function camOut(point, cut, moveLen = toolDiamMove) { point = point.clone(); point.x += wmx; point.y += wmy; @@ -264,7 +264,7 @@ } // convert short planar moves to cuts in some cases - if (isMove && deltaXY <= toolDiamMove) { + if (isMove && deltaXY <= moveLen) { let iscontour = tolerance > 0; let isflat = absDeltaZ < 0.001; // restrict this to contouring @@ -279,7 +279,7 @@ } } else if (isMove) { // for longer moves, check the terrain to see if we need to go up and over - const bigXY = (deltaXY > toolDiamMove); + const bigXY = (deltaXY > moveLen); const bigZ = (deltaZ > toolDiam/2 && deltaXY > tolerance); const midZ = (absDeltaZ >= tolerance); if ((bigXY || bigZ) && (isMove || midZ)) { From d2558e3cc5948f9901304f6df70775254744de47 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 6 Mar 2021 15:39:49 -0500 Subject: [PATCH 221/255] fix traces for non-singles --- src/mode/cam/slice.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/mode/cam/slice.js b/src/mode/cam/slice.js index acc7e0d1..da4689b2 100644 --- a/src/mode/cam/slice.js +++ b/src/mode/cam/slice.js @@ -264,9 +264,7 @@ return; } } - poly.forEachSegment((p1, p2) => { - traces.push(newPolygon().append(p1).append(p2).setOpen()); - }, poly.open); + traces.push(poly); }); }; let opts = { each: oneach, over: false, flatoff: 0, edges: true, openok: true }; From 3aab15888863b9c7cca17633cf9346811d93cfd8 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 6 Mar 2021 19:12:25 -0500 Subject: [PATCH 222/255] bump rev 2.8.0D --- package.json | 2 +- src/kiri.js | 2 +- src/license.js | 2 +- src/mode/laser/driver.js | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 0ed33b26..d1366ecf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grid-apps", - "version": "2.7.16D", + "version": "2.8.0D", "description": "grid.space 3d slice & modeling tools", "author": "Stewart Allen ", "license": "MIT", diff --git a/src/kiri.js b/src/kiri.js index a0e52c79..cdacb447 100644 --- a/src/kiri.js +++ b/src/kiri.js @@ -6,7 +6,7 @@ if (!self.kiri) { self.kiri = { - beta: 2716, + beta: 2800, driver: {}, // driver modules loader: [] // module loading: array of functions }; diff --git a/src/license.js b/src/license.js index 360a42f4..baf3fa57 100644 --- a/src/license.js +++ b/src/license.js @@ -3,7 +3,7 @@ let terms = { COPYRIGHT: "Copyright (C) Stewart Allen - All Rights Reserved", LICENSE: "See the license.md file included with the source distribution", - VERSION: "2.7.D16" + VERSION: "2.8.D0" }; if (typeof(module) === 'object') { diff --git a/src/mode/laser/driver.js b/src/mode/laser/driver.js index 36847b82..10fb3196 100644 --- a/src/mode/laser/driver.js +++ b/src/mode/laser/driver.js @@ -301,7 +301,7 @@ e = o.point; e.x += p.max.w / 2 - m.fit.x; e.y += p.max.h / 2 - m.fit.y; - // e.z = 0; + e.z = 0; }); } From 102555ceb4e7f9548e1958d097f261427d52ac58 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 7 Mar 2021 15:30:26 -0500 Subject: [PATCH 223/255] allow omit thru in all outline modes --- src/mode/cam/client.js | 2 +- src/mode/cam/ops.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mode/cam/client.js b/src/mode/cam/client.js index 2bf4f16d..c21a3ccc 100644 --- a/src/mode/cam/client.js +++ b/src/mode/cam/client.js @@ -831,7 +831,7 @@ dogbones: UC.newBoolean(LANG.co_dogb_s, undefined, {title:LANG.co_dogb_l, show:(op) => { return !op.inputs.wide.checked }}), inside: UC.newBoolean(LANG.co_olin_s, undefined, {title:LANG.co_olin_l, show:(op) => { return !op.inputs.outside.checked }}), outside: UC.newBoolean(LANG.co_olot_s, undefined, {title:LANG.co_olot_l, show:(op) => { return !op.inputs.inside.checked }}), - omitthru: UC.newBoolean(LANG.co_omit_s, undefined, {title:LANG.co_omit_l, show:(op) => { return op.inputs.outside.checked }}), + omitthru: UC.newBoolean(LANG.co_omit_s, undefined, {title:LANG.co_omit_l, xshow:(op) => { return op.inputs.outside.checked }}), wide: UC.newBoolean(LANG.co_wide_s, undefined, {title:LANG.co_wide_l, show:(op) => { return !op.inputs.inside.checked }}) }; diff --git a/src/mode/cam/ops.js b/src/mode/cam/ops.js index 0c8d515a..4174ae21 100644 --- a/src/mode/cam/ops.js +++ b/src/mode/cam/ops.js @@ -467,7 +467,7 @@ tops = tshadow; } - if (op.outside && op.omitthru) { + if (op.omitthru) { // eliminate thru holes from shadow for (let hole of thruHoles) { for (let top of tops) { From 5be46bff759c09b32a0db2cc16929b44524dd718 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 8 Mar 2021 11:08:53 -0500 Subject: [PATCH 224/255] add experimental Roland MDX-50 --- src/dev/cam/Any.Generic.LinuxCNC | 2 +- src/dev/cam/Roland.MDX-50 | 21 +++++++++++++++++++++ src/mode/cam/export.js | 20 +++++++++++++++++--- 3 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 src/dev/cam/Roland.MDX-50 diff --git a/src/dev/cam/Any.Generic.LinuxCNC b/src/dev/cam/Any.Generic.LinuxCNC index e7ad43f9..b1406adf 100644 --- a/src/dev/cam/Any.Generic.LinuxCNC +++ b/src/dev/cam/Any.Generic.LinuxCNC @@ -8,7 +8,7 @@ "M03 S20000 ; spindle on" ], "post":[ - "M05 ; spindle off", + "M05 ; spindle off", "M30 ; program end" ], "tool-change":[ diff --git a/src/dev/cam/Roland.MDX-50 b/src/dev/cam/Roland.MDX-50 new file mode 100644 index 00000000..b9bbb820 --- /dev/null +++ b/src/dev/cam/Roland.MDX-50 @@ -0,0 +1,21 @@ +{ + "file-ext": "rml", + "token-space": "", + "strip-comments": true, + "pre":[ + "PA;PA;VS4;!VZ4;!PZ0,80;!MC1;" + ], + "post":[ + "PA;PA;!PZ0,2420;PU0,6096;!MC0;" + ], + "dwell":[ + "W{time};" + ], + "spindle": [ + "!RC{speed};" + ], + "settings": { + "bed_width": 400, + "bed_depth": 305 + } +} diff --git a/src/mode/cam/export.js b/src/mode/cam/export.js index b914d21a..fbd13fec 100644 --- a/src/mode/cam/export.js +++ b/src/mode/cam/export.js @@ -31,6 +31,7 @@ gcodes = settings.device || {}, tools = settings.tools, space = gcodes.gcodeSpace ? ' ' : '', + isRML = device.gcodeFExt.toLowerCase() === 'rml', stripComments = gcodes.gcodeStrip || false, cmdToolChange = gcodes.gcodeChange || [ "M6 T{tool}" ], cmdSpindle = gcodes.gcodeSpindle || [ "M3 S{speed}" ], @@ -88,7 +89,7 @@ if (!array) return; for (i=0; i= 0) { + if (!isRML && stripComments && (cidx = line.indexOf(";")) >= 0) { line = line.substring(0, cidx).trim(); if (line.length === 0) continue; } @@ -179,7 +180,8 @@ dz = newpos.z - pos.z, maxf = dz ? maxZd : maxXYd, feed = Math.min(speed || maxf, maxf), - dist = Math.sqrt(dx * dx + dy * dy + dz * dz); + dist = Math.sqrt(dx * dx + dy * dy + dz * dz), + newFeed = feed && feed !== pos.f; // drop dup points (all deltas are 0) if (!(dx || dy || dz)) { @@ -204,11 +206,23 @@ runbox.max.z = Math.max(runbox.max.z, pos.z); nl.append(space).append("Z").append(add0(pos.z * factor)); } - if (feed && feed !== pos.f) { + if (newFeed) { pos.f = feed; nl.append(space).append("F").append(add0(feed * factor, true)); } + // temp hack to support RML1 dialect from a file extensions trigger + if (isRML) { + if (speed) { + if (newFeed) { + append(`VS${feed};`); + } + nl = [ "Z", add0(pos.x * factor), ",", add0(pos.y * factor), ",", add0(pos.z * factor), ";" ]; + } else { + nl = [ "PU", add0(pos.x * factor), ",", add0(pos.y * factor), ";" ]; + } + } + // update time calculation time += (dist / (pos.f || 1000)) * 60; From c8ec0aa498204e81c9f3799a4f17f1734a696a7f Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 8 Mar 2021 21:57:28 -0500 Subject: [PATCH 225/255] add belt peel guard to prevent deflection on long prints as they leave the belt end --- app.js | 2 ++ src/kiri/conf.js | 1 + src/kiri/init.js | 3 ++- src/mode/fdm/export.js | 13 ++++++++++++- web/kiri/lang/en.js | 2 ++ 5 files changed, 19 insertions(+), 2 deletions(-) diff --git a/app.js b/app.js index 94b4b6ec..9fcaeca4 100644 --- a/app.js +++ b/app.js @@ -167,6 +167,8 @@ function initModule(mod, file, dir) { time: time, guid: guid, mkdirs: util.mkdir, + isfile: util.isfile, + confdir: util.confdir, datadir: util.datadir, lastmod: lastmod, obj2string: obj2string, diff --git a/src/kiri/conf.js b/src/kiri/conf.js index 8545ea61..e1b4f47c 100644 --- a/src/kiri/conf.js +++ b/src/kiri/conf.js @@ -341,6 +341,7 @@ outputLayerRetract: false, outputOriginCenter: true, outputLoopLayers: "", + outputPeelGuard: 0, outputInvertX: false, outputInvertY: false, detectThinWalls: false, diff --git a/src/kiri/init.js b/src/kiri/init.js index 7c90ab0f..013f2992 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -1788,7 +1788,8 @@ arcTolerance: UC.newInput(LANG.ad_arct_s, {title:LANG.ad_arct_l, bound:UC.bound(0,1.0), convert:UC.toFloat, modes:FDM, show:() => { return isDanger() && isNotBelt() }}), antiBacklash: UC.newInput(LANG.ad_abkl_s, {title:LANG.ad_abkl_l, bound:UC.bound(0,3), convert:UC.toInt, modes:FDM}), fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}), - gcodePauseLayers: UC.newInput(LANG.ag_paws_s, {title:LANG.ag_paws_l, modes:FDM, comma:true}), + outputPeelGuard: UC.newInput(LANG.ag_peel_s, {title:LANG.ag_peel_l, convert:UC.toInt, modes:FDM, comma:true, show:isBelt}), + gcodePauseLayers: UC.newInput(LANG.ag_paws_s, {title:LANG.ag_paws_l, modes:FDM, comma:true, show:isNotBelt}), outputLoopLayers: UC.newInput(LANG.ag_loop_s, {title:LANG.ag_loop_l, modes:FDM, comma:true, show:isBelt}), outputLayerRetract: UC.newBoolean(LANG.ad_lret_s, onBooleanClick, {title:LANG.ad_lret_l, modes:FDM}), diff --git a/src/mode/fdm/export.js b/src/mode/fdm/export.js index 4ed0bb7e..8a0cdda4 100644 --- a/src/mode/fdm/export.js +++ b/src/mode/fdm/export.js @@ -47,6 +47,9 @@ lout = null, last = null, zpos = 0, + bmax = 0, + blast = 0, + blastz = 0, process = settings.process, loops = process.outputLoopLayers, zhop = process.zHopDistance || 0, // range @@ -55,6 +58,7 @@ retSpeed = process.outputRetractSpeed * 60, // range retDwell = process.outputRetractDwell || 0, // range timeDwell = retDwell / 1000, + peelGuard = process.outputPeelGuard || 0, arcDist = isBelt || !isDanger ? 0 : (process.arcTolerance || 0), originCenter = process.outputOriginCenter, offset = originCenter ? null : { @@ -272,7 +276,7 @@ let epos = isBelt ? { x: pos.x, y: pos.y, z: pos.z } : pos; if (isBelt) { epos.x = originCenter ? -pos.x : device.bedWidth - pos.x; - epos.z = pos.z * icos; + epos.z = blastz = pos.z * icos; epos.y = -pos.y + epos.z * bcos; lout = epos; } @@ -335,6 +339,7 @@ (process.firstSliceHeight || process.sliceHeight) : path.height); zpos = path.z || zpos; + bmax = Math.max(bmax, pos.z * icos); subst.z = subst.Z = zpos.round(3); subst.e = subst.E = outputLength; subst.layer = layer; @@ -342,6 +347,12 @@ if (isBelt) { pos.z = zpos; + if (peelGuard && bmax > peelGuard && blast < peelGuard) { + peelGuard += 50; + append(`G0 Z${(blast + 55).round(decimals)} F200 ; peel guard`); + append(`G0 Z${blastz.round(decimals)} F200 ; unpeel`); + } + blast = bmax; } if (pauseCmd && pause.indexOf(layer) >= 0) { diff --git a/web/kiri/lang/en.js b/web/kiri/lang/en.js index 036f16c9..7244e587 100644 --- a/web/kiri/lang/en.js +++ b/web/kiri/lang/en.js @@ -585,6 +585,8 @@ kiri.lang['en-us'] = { ag_menu: "gcode", ag_nozl_s: "nozzle", ag_nozl_l: "select output nozzle or head", + ag_peel_s: "peel guard", + ag_peel_l: ["starting at this belt z positoin","periodically roll the print off and","back on to the belt to unstick it","and prevent rolling deflection"], ag_paws_s: "pause layers", ag_paws_l: ["comma-separated list of layers","to inject pause commands before"], ag_loop_s: "loop layers", From ba7438a6e6440a68c5fc7bd9396309f25c4d82da Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 8 Mar 2021 21:58:42 -0500 Subject: [PATCH 226/255] bump rev 2.8.D1 --- package.json | 2 +- src/kiri.js | 2 +- src/license.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index d1366ecf..5b6e0277 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grid-apps", - "version": "2.8.0D", + "version": "2.8.1D", "description": "grid.space 3d slice & modeling tools", "author": "Stewart Allen ", "license": "MIT", diff --git a/src/kiri.js b/src/kiri.js index cdacb447..3d39ec4a 100644 --- a/src/kiri.js +++ b/src/kiri.js @@ -6,7 +6,7 @@ if (!self.kiri) { self.kiri = { - beta: 2800, + beta: 2801, driver: {}, // driver modules loader: [] // module loading: array of functions }; diff --git a/src/license.js b/src/license.js index baf3fa57..e86c51bb 100644 --- a/src/license.js +++ b/src/license.js @@ -3,7 +3,7 @@ let terms = { COPYRIGHT: "Copyright (C) Stewart Allen - All Rights Reserved", LICENSE: "See the license.md file included with the source distribution", - VERSION: "2.8.D0" + VERSION: "2.8.D1" }; if (typeof(module) === 'object') { From 83a23b405c59507a93a5d66fb3f596279d0b26a1 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Tue, 9 Mar 2021 10:02:17 -0500 Subject: [PATCH 227/255] polish updates --- web/kiri/lang/pl-pl.js | 167 ++++++++++++++++++++--------------------- 1 file changed, 83 insertions(+), 84 deletions(-) diff --git a/web/kiri/lang/pl-pl.js b/web/kiri/lang/pl-pl.js index fdbe0cb0..f6870e66 100644 --- a/web/kiri/lang/pl-pl.js +++ b/web/kiri/lang/pl-pl.js @@ -1,8 +1,7 @@ -// english. other language maps will defer to english -// map for any missing key/value pairs +// Polish. Język polski tłumaczony na zasadach własności publicznej kiri.lang['pl'] = kiri.lang['pl-pl'] = { - // common keys and menus + // hasło i tłumaczenie animate: "animacja", // CAM animate button arrange: "rozmieść", // layout workspace objects axis: "osie", // left object scale pop menu @@ -56,87 +55,87 @@ kiri.lang['pl-pl'] = { rc_xstl: "zapisz w formacie STL", // DEVICE MENU and related dialogs - dm_sldt: "select a device type", - dm_stdd: "standard devices", - dm_mydd: "my devices", - dm_seld: "selected device", - dm_rcnt: "recent files", - dm_savs: "saved settings", - dm_appp: "Application Preferences", + dm_sldt: "wybierz rodzaj swojego urządzenia", + dm_stdd: "zwykłe urządzenia", + dm_mydd: "moje urządzenia", + dm_seld: "wybierz urządzenie", + dm_rcnt: "ostatnio uzywane pliki", + dm_savs: "zachowane ustawienia", + dm_appp: "Ustawienia programu", // CAM Tool Dialog - td_tyem: "end", // end mill - td_tybm: "ball", // ball mill - td_tytm: "taper", // taper mill - td_tonm: "tool #", - td_shft: "shaft", // endmill shaft specs - td_flut: "flute", // endmill flute specs - td_tapr: "taper", // endmill taper specs + td_tyem: "tępo zakończone", // end mill + td_tybm: "kula na końcu", // ball mill + td_tytm: "zwężający się", // taper mill + td_tonm: "narzędzie #", + td_shft: "wał (pionowy)", // endmill shaft specs + td_flut: "czołowy", // endmill flute specs + td_tapr: "zwężający się", // endmill taper specs // DEVICE dialog groups - dv_gr_dev: "device", - dv_gr_ext: "extruder", - dv_gr_out: "output", - dv_gr_gco: "gcode macros", + dv_gr_dev: "urządzenie", + dv_gr_ext: "ekstruder", + dv_gr_out: "wynik", + dv_gr_gco: "makra gkodu", // DEVICE dialog (_s = label, _l = hover help) - dv_name_s: "name", - dv_name_l: "device name", + dv_name_s: "nazwa", + dv_name_l: "nazwa urządzenia", dv_fila_s: "filament", - dv_fila_l: "diameter in millimeters", - dv_nozl_s: "nozzle", - dv_nozl_l: "diameter in millimeters", - dv_bedw_s: "width", - dv_bedw_l: "workspace units", - dv_bedd_s: "depth", - dv_bedd_l: "workspace units", - dv_bedh_s: "height", - dv_bedh_l: ["max build height","in workspace units"], - dv_spmx_s: "max spindle", - dv_spmx_l: ["max spindle rpm speed","0 to disable"], - dv_xtab_s: "absolute positioning", - dv_xtab_l: "extrusion moves absolute", - dv_orgc_s: "origin center", - dv_orgc_l: "bed origin center", - // dv_orgt_s: "origin top", - // dv_orgt_l: "part z origin top", - dv_bedc_s: "circular bed", - dv_bedc_l: "device bed is circular", - dv_belt_s: "belt bed", - dv_belt_l: "continuous printing bed", - dv_retr_s: "firmware retract", - dv_retr_l: ["device fimware supports G10/G11"], - dv_fanp_s: "fan power", - dv_fanp_l: "set cooling fan power", - dv_prog_s: "progress", - dv_prog_l: "output on each % progress", - dv_layr_s: "layer", + dv_fila_l: "średnica w milimetrach", + dv_nozl_s: "dysza", + dv_nozl_l: "średnica w milimetrach", + dv_bedw_s: "szerokość", + dv_bedw_l: "pole robocze w jednostkach", + dv_bedd_s: "głębokość", + dv_bedd_l: "pole robocze w jednostkach", + dv_bedh_s: "wysokość", + dv_bedh_l: ["maksymalna wysokość budowania","w jednostkach pola roboczego"], + dv_spmx_s: "maksymalna prędkość wrzeciona", + dv_spmx_l: ["maksymalna prędkość wrzeciona w obrotach na minutę","0 wyłączone"], + dv_xtab_s: "ustawienie pozycji absolutnie", + dv_xtab_l: "absolutna wartość wypchnięcia", + dv_orgc_s: "środek odniesienia", + dv_orgc_l: "środek odniesienia na platformie", + // dv_orgt_s: "odniesienie u góry", + // dv_orgt_l: "oś z odniesienie u góry", + dv_bedc_s: "okrądła platforma drukowania", + dv_bedc_l: "platforma druku jest okrągła", + dv_belt_s: "pas na platformie", + dv_belt_l: "kontynuacja drukowania platformy", + dv_retr_s: "domyślne cofnięcie (retrakcja)", + dv_retr_l: ["firmware urządzenia wspiera kody G10/G11"], + dv_fanp_s: "zasilanie wiatraczków", + dv_fanp_l: "ustawienia zasilania wiatraczków", + dv_prog_s: "postęp", + dv_prog_l: "wynik w czasie każdego % postępu", + dv_layr_s: "warstwa", dv_layr_l: ["output at each","layer change"], dv_tksp_s: "token spacer", dv_tksp_l: ["add a space between","gcode axis parameters","G0X0Y0X0","vs","G0 X0 Y0 Z0"], dv_strc_s: "strip comments", dv_strc_l: ["strip gcode comments","comments begin with ;"], - dv_fext_s: "file extension", - dv_fext_l: "file name extension", + dv_fext_s: "rozszerzenie pliku", + dv_fext_l: "rozszerzenie pliku", dv_dwll_s: "dwell", dv_dwll_l: "gcode dwell script", - dv_tool_s: "tool change", - dv_tool_l: "tool change script", - dv_sspd_s: "spindle speed", - dv_sspd_l: "set spindle speed", - dv_paus_s: "pause", - dv_paus_l: "gcode pause script", - dv_head_s: "header", - dv_head_l: "gcode header script", - dv_foot_s: "footer", - dv_foot_l: "gcode footer script", - dv_lzon_s: "laser on", + dv_tool_s: "zmiana narzędzia", + dv_tool_l: "skrypt zmiany narzędzia", + dv_sspd_s: "prędkość wrzeciona", + dv_sspd_l: "ustaw prędkość wrzeciona", + dv_paus_s: "pauza", + dv_paus_l: "gkod skryptu pauzy", + dv_head_s: "nagłówek (początek)", + dv_head_l: "skrypt gkod nagłówka", + dv_foot_s: "stopka (zakończenie)", + dv_foot_l: "skrypt gkod stopki", + dv_lzon_s: "laser włączony", dv_lzon_l: "gcode laser on script", - dv_lzof_s: "laser off", + dv_lzof_s: "laser wyłączony", dv_lzof_l: "gcode laser off script", - dv_exts_s: "select", + dv_exts_s: "zaznacz", dv_exts_l: "gcode run to enable this extruder", - dv_dext_s: "deselect", + dv_dext_s: "odznacz", dv_dext_l: "gcode run before enabling another extruder", dv_extd_s: "deselect", dv_extd_l: "gcode to deselect this extruder", @@ -146,24 +145,24 @@ kiri.lang['pl-pl'] = { dv_exoy_l: "nozzle offset y", // MODE - mo_menu: "mode", - mo_fdmp: "FDM Print", - mo_slap: "SLA Print", - mo_lazr: "Laser Cut", - mo_cncm: "CNC Mill", + mo_menu: "tryb", + mo_fdmp: "FDM Druk przyrostowy", + mo_slap: "SLA Druk przyrostowy", + mo_lazr: "Ciecie laserem", + mo_cncm: "Frezowanie CNC", // SETUP - su_menu: "setup", - su_devi: "Devices", - su_tool: "Tools", - su_locl: "Local", - su_xprt: "Export", - su_help: "Help", + su_menu: "ustawienia", + su_devi: "Urządzenia", + su_tool: "Narzędzia", + su_locl: "Lokalnie", + su_xprt: "Eksport", + su_help: "Pomoc", // LOAD - fe_menu: "file", - fn_recn: "Recent", - fn_impo: "Import", + fe_menu: "plik", + fn_recn: "ostatnie pliki", + fn_impo: "Importowanie", // FUNCTION fn_menu: "action", @@ -639,8 +638,8 @@ kiri.lang['pl-pl'] = { sl_slen_l: "enable supports", sa_outp_m: "output", - sa_opzo_s: "z offset", + sa_opzo_s: "przesunięcie osi Z", sa_opzo_l: ["z layer offset","almost always 0.0","0.0-1.0 in millimeters"], - sa_opaa_s: "anti alias", - sa_opaa_l: ["enable anti-aliasing","produces larger files","can blur details"] + sa_opaa_s: "antyaliasing", + sa_opaa_l: ["włączenie tej opcji","tworzy większe pliki","ale pokazuje przejścia tonalne"] }; From 85c40aa6eeb67489a1f243ea635840360073af1f Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Tue, 9 Mar 2021 17:38:39 -0500 Subject: [PATCH 228/255] fix buggy extra clearance --- src/mode/cam/prepare.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/mode/cam/prepare.js b/src/mode/cam/prepare.js index 91d43b38..0486878e 100644 --- a/src/mode/cam/prepare.js +++ b/src/mode/cam/prepare.js @@ -298,9 +298,6 @@ clearz = maxz; // up if any point between higher than start/outline, go up if (mustGoUp) { - if (bigXY) { - clearz += zclear; - } layerPush(lastPoint.clone().setZ(clearz), 0, 0, tool.getNumber()); } // move to point above target point From 7b98977b2c659f030042a44ec01f2c2ac3cf40f7 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Tue, 9 Mar 2021 17:58:24 -0500 Subject: [PATCH 229/255] remove erroneous passing height --- src/mode/cam/prepare.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/mode/cam/prepare.js b/src/mode/cam/prepare.js index 0486878e..022d6681 100644 --- a/src/mode/cam/prepare.js +++ b/src/mode/cam/prepare.js @@ -296,7 +296,7 @@ ) + ztOff, mustGoUp = Math.max(maxz - point.z, maxz - lastPoint.z) >= tolerance, clearz = maxz; - // up if any point between higher than start/outline, go up + // up if any point between higher than start/outline, go up first if (mustGoUp) { layerPush(lastPoint.clone().setZ(clearz), 0, 0, tool.getNumber()); } @@ -488,8 +488,9 @@ * return tool Z clearance height for a line segment movement path */ function getZClearPath(terrain, x1, y1, x2, y2, z, zadd, off, over) { + // when terrain skipped, top + pass used if (terrain > 0) { - return terrain + zadd + over; + return terrain; } let maxz = z; let check = []; From 83e5ff55553410450983d0852b5a3e72c57f4023 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Wed, 10 Mar 2021 08:45:36 -0500 Subject: [PATCH 230/255] fix default cr30 profile. stub in pluggable undefined type in codec --- src/dev/fdm/Creality.CR-30 | 14 +++++++------- src/kiri/codec.js | 7 ++++--- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/dev/fdm/Creality.CR-30 b/src/dev/fdm/Creality.CR-30 index 1315bf71..f6e36013 100644 --- a/src/dev/fdm/Creality.CR-30 +++ b/src/dev/fdm/Creality.CR-30 @@ -89,17 +89,17 @@ "firstLayerFanSpeed": 0, "outputTemp": 210, "outputFanMax": 255, - "outputBedTemp": 60, + "outputBedTemp": 70, "outputFanSpeed": 255, "outputFeedrate": 50, - "outputFinishrate": 50, + "outputFinishrate": 40, "outputSeekrate": 80, - "outputShellMult": 1.25, - "outputFillMult": 1.25, - "outputSparseMult": 1.25, + "outputShellMult": 1.2, + "outputFillMult": 1.2, + "outputSparseMult": 1.2, "outputFanLayer": 0, - "outputRetractDist": 4.5, - "outputRetractSpeed": 50, + "outputRetractDist": 5, + "outputRetractSpeed": 40, "outputRetractWipe": 1, "outputRetractDwell": 25, "outputShortPoly": 60.0, diff --git a/src/kiri/codec.js b/src/kiri/codec.js index af2bd088..1fbfff78 100644 --- a/src/kiri/codec.js +++ b/src/kiri/codec.js @@ -11,6 +11,7 @@ const zeroOut = true; const codec = KIRI.codec = { + undef: undefined, encode: encode, decode: decode, registerDecoder: registerDecoder, @@ -154,7 +155,7 @@ polys: encode(layer.polys, state), lines: encodePointArray(layer.lines, state), faces: codec.allocFloat32Array(layer.faces), - cface: layer.cface, + cface: layer.cface || codec.undef, color: layer.color, paths: layer.paths.map(lp => { const pe = { @@ -167,13 +168,13 @@ } return pe; }), - cpath: layer.cpath, + cpath: layer.cpath || codec.undef, off: layer.off }; if (zeroOut && state.zeros && e.faces.length) { state.zeros.push(e.faces.buffer); } - // console.log('-->',e); + // console.log('-->',layer,e); return e; }) }; From 15a00248bdff7ec1c12a6417cd779770668d7093 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Wed, 10 Mar 2021 10:01:49 -0500 Subject: [PATCH 231/255] fix engine direct parsing --- src/kiri/engine.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/kiri/engine.js b/src/kiri/engine.js index 67d0bd38..3b4c0a36 100644 --- a/src/kiri/engine.js +++ b/src/kiri/engine.js @@ -47,11 +47,10 @@ class Engine { parse(data) { return new Promise((accept, reject) => { try { - new moto.STL().parse(data, vertices => { - this.listener({parsed: data, vertices}); - this.widget.loadVertices(vertices).center(); - accept(this); - }); + let vertices = new moto.STL().parse(data); + this.listener({parsed: data, vertices}); + this.widget.loadVertices(vertices).center(); + accept(this); } catch (error) { reject(error); } From 3844642ad2c58663afda2819616695b5c1587741 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Wed, 10 Mar 2021 11:00:10 -0500 Subject: [PATCH 232/255] add the ability to selectively disable widget slicing. normalize support widget meshes to make mergeBufferGeometries happy --- src/kiri/main.js | 19 ++++++++++--------- src/mode/fdm/client.js | 10 +++++++++- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/kiri/main.js b/src/kiri/main.js index 3fa57428..c5dc7bf4 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -987,7 +987,8 @@ API.conf.save(); API.event.emit('slice.begin', getMode()); - let countdown = WIDGETS.length, + let slicing = WIDGETS.slice().filter(w => !w.track.ignore), + countdown = slicing.length, totalProgress, track = {}, mode = settings.mode, @@ -996,10 +997,10 @@ defvert; // determing this widgets % of processing time estimated by vertex count - for (let widget of WIDGETS) { + for (let widget of slicing) { totvert += widget.getVertices().count; } - defvert = totvert / WIDGETS.length; + defvert = totvert / slicing.length; setOpacity(color.slicing_opacity); @@ -1017,7 +1018,7 @@ lastMsg; // for each widget, slice - forAllWidgets(function(widget) { + for (let widget of slicing) { let camOrLaser = mode === 'CAM' || mode === 'LASER', stack = widget.stack = STACKS.create(widget.id, widget.mesh), factor = (widget.getVertices().count / defvert); @@ -1055,7 +1056,7 @@ alert = API.show.alert("Rendering"); }; KIRI.client.unrotate(settings, () => { - forAllWidgets(widget => { + for (let widget of slicing) { // on done segtimes[`${widget.id}_${segNumber++}_draw`] = widget.render(widget.stack); // rotate stack for belt beds @@ -1069,7 +1070,7 @@ widget.setColor(color.deselected); API.hide.alert(alert); } - }); + } updateSliderMax(true); setVisibleLayer(-1, 0); if (scale === 1) { @@ -1103,12 +1104,12 @@ // on update track[widget.id] = (update || 0) * factor; totalProgress = 0; - forAllWidgets(function(w) { + for (let w of slicing) { totalProgress += (track[w.id] || 0); - }); + } API.show.progress(offset + (totalProgress / WIDGETS.length) * scale, msg); }); - }); + } } function preparePreview(callback, scale = 1, offset = 0) { diff --git a/src/mode/fdm/client.js b/src/mode/fdm/client.js index 7f56f8a2..b11885d8 100644 --- a/src/mode/fdm/client.js +++ b/src/mode/fdm/client.js @@ -229,7 +229,15 @@ if (!merge.length) { continue; } - let boxen = merge.map(m => m.box.geometry.clone().translate(m.x, m.y, m.z)); + let boxen = merge.map(m => { + let geo = m.box.geometry.clone(); + if (geo.index) geo = geo.toNonIndexed(); + return geo.translate(m.x, m.y, m.z); + }); + for (let box of boxen) { + // eliminate / normalize uv to allow other widget merge + box.setAttribute('uv',new THREE.BufferAttribute(new Float32Array(0), 3)); + } let bbg = THREE.BufferGeometryUtils.mergeBufferGeometries(boxen); let sw = kiri.newWidget(null, group); let fwp = group[0].track.pos; From 13038c04db5cc39f9499fe32c8418f0dc7e7127b Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Wed, 10 Mar 2021 11:16:28 -0500 Subject: [PATCH 233/255] filter ignored widgets in prepare --- src/mode/fdm/prepare.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index 3891e03c..b59408c5 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -20,6 +20,9 @@ * @returns {Object[]} returns array of render objects */ FDM.prepare = function(widgets, settings, update) { + // filter ignored widgets + widgets = widgets.filter(w => !w.track.ignore); + settings = FDM.fixExtruders(settings); let render = settings.render !== false, { device, process, controller, bounds, mode } = settings, From 1d44ab2cf5ee94e53d7928b4fb052276fed48906 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 11 Mar 2021 10:28:42 -0500 Subject: [PATCH 234/255] fix commented M82/M83 commands changing mode --- src/mode/fdm/export.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mode/fdm/export.js b/src/mode/fdm/export.js index 8a0cdda4..b7a14414 100644 --- a/src/mode/fdm/export.js +++ b/src/mode/fdm/export.js @@ -192,11 +192,11 @@ let line = device.gcodePre[i]; if (line.indexOf('T0') >= 0) t0 = true; else if (line.indexOf('T1') >= 0) t1 = true; else - if (line.indexOf('M82') >= 0) { + if (line.indexOf('M82') === 0) { extrudeAbs = true; extrudeSet = true; } else - if (line.indexOf('M83') >= 0) { + if (line.indexOf('M83') === 0) { extrudeAbs = false; extrudeSet = true; } else From 6f4afa0cbef7a40d50906cdf7568077bc4ff751a Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 11 Mar 2021 10:36:51 -0500 Subject: [PATCH 235/255] same fix for T0/T1/G90/G91/G92 --- src/mode/fdm/export.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/mode/fdm/export.js b/src/mode/fdm/export.js index b7a14414..cdb4fcdd 100644 --- a/src/mode/fdm/export.js +++ b/src/mode/fdm/export.js @@ -190,8 +190,8 @@ let t1 = false; for (let i=0; i= 0) t0 = true; else - if (line.indexOf('T1') >= 0) t1 = true; else + if (line.indexOf('T0') === 0) t0 = true; else + if (line.indexOf('T1') === 0) t1 = true; else if (line.indexOf('M82') === 0) { extrudeAbs = true; extrudeSet = true; @@ -200,8 +200,8 @@ extrudeAbs = false; extrudeSet = true; } else - if (line.indexOf('G90') >= 0 && !extrudeSet) extrudeAbs = true; else - if (line.indexOf('G91') >= 0 && !extrudeSet) extrudeAbs = false; else + if (line.indexOf('G90') === 0 && !extrudeSet) extrudeAbs = true; else + if (line.indexOf('G91') === 0 && !extrudeSet) extrudeAbs = false; else if (line.indexOf('G92') === 0) { line.split(";")[0].split(' ').forEach(function (tok) { let val = parseFloat(tok.substring(1) || 0) || 0; From c534ff2fe1cda6a6990c85845ff22a35a2f0e7de Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 11 Mar 2021 16:52:58 -0500 Subject: [PATCH 236/255] fix excessive retractions (mostly in belt mode) --- src/kiri/print.js | 3 ++- src/mode/fdm/prepare.js | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/kiri/print.js b/src/kiri/print.js index f830fda5..e30f06ff 100644 --- a/src/kiri/print.js +++ b/src/kiri/print.js @@ -628,7 +628,8 @@ coast: firstLayer ? 0 : coastDist, extrude: pref(opt.extrude, shellMult), onfirst: function(firstPoint) { - if (startPoint.distTo2D(firstPoint) > retractDist) { + let from = lastOut ? lastOut.point.sub(offset) : startPoint; + if (from.distTo2D(firstPoint) > retractDist) { retract(); } } diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index b59408c5..9d57604f 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -407,7 +407,7 @@ // output seek to start point between mesh slices if previous data printPoint = print.slicePrintPath( slice, - isBelt ? newPoint(-wtb.w, wtb.d * 2, 0) : printPoint.sub(offset), + slice.belt && slice.belt.touch ? newPoint(-wtb.w, wtb.d * 2, 0) : printPoint.sub(offset), offset, layerout, { From e27aabc860292db093ebea12f9d33523cb210208 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 11 Mar 2021 17:24:44 -0500 Subject: [PATCH 237/255] another attempt at retraction fix --- src/kiri/print.js | 4 +++- src/mode/fdm/prepare.js | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/kiri/print.js b/src/kiri/print.js index e30f06ff..2b8f1c92 100644 --- a/src/kiri/print.js +++ b/src/kiri/print.js @@ -534,6 +534,7 @@ wipeDist = process.outputRetractWipe || 0, isBelt = device.bedBelt, startClone = startPoint.clone(), + seedPoint = opt.seedPoint || startPoint, z = slice.z, lastPoly; @@ -628,10 +629,11 @@ coast: firstLayer ? 0 : coastDist, extrude: pref(opt.extrude, shellMult), onfirst: function(firstPoint) { - let from = lastOut ? lastOut.point.sub(offset) : startPoint; + let from = seedPoint || startPoint; if (from.distTo2D(firstPoint) > retractDist) { retract(); } + seedPoint = null; } }); lastPoly = slice.lastPoly = poly; diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index 9d57604f..60e299d7 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -411,6 +411,7 @@ offset, layerout, { + seedPoint: printPoint.sub(offset), params, // range parameters first: slice.index === 0, support: slice.widget.support, From 5f36260772d955d06aa594754f1f4449cd346c7a Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 12 Mar 2021 12:39:36 -0500 Subject: [PATCH 238/255] add intra-top routing to minimize retractions when possible --- src/kiri/print.js | 126 ++++++++++++++++++++++++++++++++++++++-- src/mode/fdm/client.js | 5 ++ src/mode/fdm/prepare.js | 12 ++-- web/kiri/index.css | 11 ++++ web/kiri/index.html | 3 + 5 files changed, 149 insertions(+), 8 deletions(-) diff --git a/src/kiri/print.js b/src/kiri/print.js index 2b8f1c92..a7545ce9 100644 --- a/src/kiri/print.js +++ b/src/kiri/print.js @@ -471,7 +471,7 @@ if (options.onfirst) { options.onfirst(point); } - // move from startPoint to point + // move to first output point on poly addOutput(output, point, 0, moveSpeed, tool); first = false; } else { @@ -564,18 +564,134 @@ } function intersectsTop(p1, p2) { + return retractRequired(p1, p2); let int = false; POLY.flatten(slice.topPolys().clone(true)).forEach(function(poly) { if (!int) poly.forEachSegment(function(s1, s2) { if (UTIL.intersect(p1,p2,s1,s2,BASE.key.SEGINT)) { - int = true; - return int; + return int = true; } }); }); return int; } + // returns true if no path around and retract required + // returns false if routed around or no retract + function retractRequired(p1, p2) { + const dbug = false; + + let ints = []; + let tops = POLY.flatten(slice.topPolys().clone(true)); + for (let poly of tops) { + poly.forEachSegment(function(s1, s2) { + let ip = UTIL.intersect(p1,p2,s1,s2,BASE.key.SEGINT); + if (ip) { + ints.push({ip, poly}); + } + }); + } + + // odd # of intersections ?!? do retraction + if (ints.length && ints.length % 2 !== 0) { + if (dbug === slice.index) console.log(slice.index, {odd_intersects: ints}); + return true; + } + + // sort by distance + ints.sort((a, b) => { + return a.ip.dist - b.ip.dist; + }); + + let valid = ints.length; + + // check pairs. eliminate too close points. + // pairs must intersect same poly or retract. + for (let i=0; i 2) { + if (dbug === slice.index) console.log(slice.index, {complex_route: valid}); + return true; + } + + if (valid) { + // can route around intersected top polys + for (let i=0; ii.ip.dist), + i1, i2, same: i1.poly === i2.poly, + route, + r1, r1d, r1s, r1e, + r2, r2d, r2s, r2e, + isCW}); + + for (let p of route) { + addOutput(preout, p, 0, moveSpeed, extruder); + } + + // output last point + addOutput(preout, i2.ip, 0, moveSpeed, extruder); + } + } + + return false; + } + function outputTraces(poly, opt = {}) { if (!poly) return; if (Array.isArray(poly)) { @@ -631,7 +747,9 @@ onfirst: function(firstPoint) { let from = seedPoint || startPoint; if (from.distTo2D(firstPoint) > retractDist) { - retract(); + if (intersectsTop(from, firstPoint)) { + retract(); + } } seedPoint = null; } diff --git a/src/mode/fdm/client.js b/src/mode/fdm/client.js index b11885d8..046dee70 100644 --- a/src/mode/fdm/client.js +++ b/src/mode/fdm/client.js @@ -119,6 +119,11 @@ clearTimeout(int); } }, 50); + // let slider = $('top-slider'); + // slider.style.display = 'flex'; + // slider.oninput = slider.onchange = (ev) => { + // api.const.STACKS.setFraction(parseInt(ev.target.value)/100); + // }; }); api.event.on("mode.set", mode => { isFdmMode = mode === 'FDM'; diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index 60e299d7..e2bae31c 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -587,6 +587,8 @@ const headColor = 0x888888; const moveColor = opts.move >= 0 ? opts.move : 0xaaaaaa; const printColor = opts.print >= 0 ? opts.print : 0x777700; + const arrowAll = false; + const arrowSize = arrowAll ? 0.2 : 0.4; const layers = []; const moveOpt = { @@ -613,6 +615,7 @@ let lastOut = null; let current = null; let retracted = false; + let retractz = 0; function color(point) { return FDM.rateToColor(point.speed, maxspd); @@ -648,6 +651,7 @@ if (out.retract) { retracts.push(out.point); retracted = true; + retractz++; } if (!out.point) { // in cam mode, these are drilling or dwell ops @@ -655,7 +659,7 @@ } if (lastOut) { - if (lastOut.emit !== out.emit) { + if (arrowAll || lastOut.emit !== out.emit) { heads.push({p1: lastOut.point, p2: out.point}); } const op = out.point, lp = lastOut.point; @@ -720,8 +724,8 @@ const slope = p2.slopeTo(p1); const s1 = BASE.newSlopeFromAngle(slope.angle + 20); const s2 = BASE.newSlopeFromAngle(slope.angle - 20); - const p3 = points.p2.projectOnSlope(s1, 0.8); - const p4 = points.p2.projectOnSlope(s2, 0.8); + const p3 = points.p2.projectOnSlope(s1, arrowSize); + const p4 = points.p2.projectOnSlope(s2, arrowSize); return newPolygon().addPoints([p2,p3,p4]).setZ(p2.z + 0.01); }), { thin: true, outline: true }); } @@ -753,7 +757,7 @@ update(index / levels.length, output); }); - + console.log({retractz}); return layers; } diff --git a/web/kiri/index.css b/web/kiri/index.css index 2e077c8f..28d25b73 100644 --- a/web/kiri/index.css +++ b/web/kiri/index.css @@ -1244,6 +1244,17 @@ th, tr, td, label { width: 20px; } +#top-slider { + position: absolute; + display: none; + top: 60px; + left: 50px; + right: 50px; +} +#anim-slider { + width: 100%; +} + #alert-area { display: none; justify-content: center; diff --git a/web/kiri/index.html b/web/kiri/index.html index eee7e8bb..fd8dd83b 100644 --- a/web/kiri/index.html +++ b/web/kiri/index.html @@ -461,6 +461,9 @@
    alerts
    alerts
    alerts
    +
    + +
    From 5cc160cb1fa9bea8d85594d0b85ad5e384856f96 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 12 Mar 2021 12:49:41 -0500 Subject: [PATCH 239/255] add CR30 PETG profile and Ender3 PLA profile --- notes.md | 3 +- src/dev/fdm/Creality.CR-30 | 71 +++++++++++++++++++++++++++++++----- src/dev/fdm/Creality.Ender.3 | 56 +++++++++++++++++++++++++++- 3 files changed, 118 insertions(+), 12 deletions(-) diff --git a/notes.md b/notes.md index 8a93138d..05785fca 100644 --- a/notes.md +++ b/notes.md @@ -16,7 +16,7 @@ * `F` add % field type with conversion (like units) * `F` complete G2/G3 arc output / input (85% now) * `F` expose grouping feature -* `F` integrate svg nest arrange algorithm +* `F` add svgnest-like arrange algorithm # FDM @@ -45,7 +45,6 @@ * `P` revisit path routing / optimization * `P` implement infill clipping in wasm * `P` solid fill the tops of supports for down facing flats -* `P` sparse infill should follow polys between intersect points # FDM - SLA diff --git a/src/dev/fdm/Creality.CR-30 b/src/dev/fdm/Creality.CR-30 index f6e36013..ce41b937 100644 --- a/src/dev/fdm/Creality.CR-30 +++ b/src/dev/fdm/Creality.CR-30 @@ -58,7 +58,60 @@ "build_height": 170 }, "profiles":[{ - "processName": "CR30", + "processName": "CR30 PLA", + "sliceHeight": 0.25, + "sliceShells": 3, + "sliceShellOrder": "in-out", + "sliceLayerStart": "last", + "sliceFillAngle": 45, + "sliceFillOverlap": 0.3, + "sliceFillSparse": 0.2, + "sliceFillType": "hex", + "sliceAdaptive": false, + "sliceMinHeight": 0, + "sliceSupportDensity": 0.25, + "sliceSupportOffset": 0.4, + "sliceSupportGap": 0, + "sliceSupportSize": 6, + "sliceSupportArea": 0.25, + "sliceSupportExtra": 0, + "sliceSupportAngle": 1, + "sliceSupportNozzle": 0, + "sliceSolidMinArea": 1, + "sliceSolidLayers": 3, + "sliceBottomLayers": 3, + "sliceTopLayers": 3, + "firstLayerRate": 10, + "firstLayerPrintMult": 1.10, + "firstLayerYOffset": 0, + "firstLayerBrim": 0, + "firstLayerBeltLead": 0, + "firstLayerFanSpeed": 0, + "outputTemp": 210, + "outputFanMax": 255, + "outputBedTemp": 70, + "outputFanSpeed": 255, + "outputFeedrate": 50, + "outputFinishrate": 40, + "outputSeekrate": 80, + "outputShellMult": 1.2, + "outputFillMult": 1.2, + "outputSparseMult": 1.2, + "outputFanLayer": 0, + "outputRetractDist": 5, + "outputRetractSpeed": 40, + "outputRetractWipe": 1, + "outputRetractDwell": 20, + "outputShortPoly": 60.0, + "outputMinSpeed": 10.0, + "outputCoastDist": 0.1, + "outputWipeDistance": 1, + "outputLayerRetract": false, + "detectThinWalls": true, + "zHopDistance": 0, + "antiBacklash": 0 + },{ + "processName": "CR30 PETG", "sliceHeight": 0.25, "sliceShells": 3, "sliceShellOrder": "in-out", @@ -87,21 +140,21 @@ "firstLayerBrim": 0, "firstLayerBeltLead": 0, "firstLayerFanSpeed": 0, - "outputTemp": 210, - "outputFanMax": 255, + "outputTemp": 240, + "outputFanMax": 0, "outputBedTemp": 70, - "outputFanSpeed": 255, - "outputFeedrate": 50, - "outputFinishrate": 40, + "outputFanSpeed": 0, + "outputFeedrate": 40, + "outputFinishrate": 30, "outputSeekrate": 80, "outputShellMult": 1.2, "outputFillMult": 1.2, "outputSparseMult": 1.2, "outputFanLayer": 0, - "outputRetractDist": 5, - "outputRetractSpeed": 40, + "outputRetractDist": 5.5, + "outputRetractSpeed": 30, "outputRetractWipe": 1, - "outputRetractDwell": 25, + "outputRetractDwell": 20, "outputShortPoly": 60.0, "outputMinSpeed": 10.0, "outputCoastDist": 0.1, diff --git a/src/dev/fdm/Creality.Ender.3 b/src/dev/fdm/Creality.Ender.3 index 7d84aae1..922f2616 100644 --- a/src/dev/fdm/Creality.Ender.3 +++ b/src/dev/fdm/Creality.Ender.3 @@ -39,5 +39,59 @@ "bed_width": 220, "bed_depth": 220, "build_height": 300 - } + }, + "profiles":[{ + "processName": "Ender3 PLA", + "sliceHeight": 0.25, + "sliceShells": 3, + "sliceShellOrder": "in-out", + "sliceLayerStart": "last", + "sliceFillAngle": 45, + "sliceFillOverlap": 0.3, + "sliceFillSparse": 0.2, + "sliceFillType": "hex", + "sliceAdaptive": false, + "sliceMinHeight": 0, + "sliceSupportDensity": 0.25, + "sliceSupportOffset": 0.4, + "sliceSupportGap": 0, + "sliceSupportSize": 6, + "sliceSupportArea": 0.25, + "sliceSupportExtra": 0, + "sliceSupportAngle": 1, + "sliceSupportNozzle": 0, + "sliceSolidMinArea": 1, + "sliceSolidLayers": 3, + "sliceBottomLayers": 3, + "sliceTopLayers": 3, + "firstLayerRate": 10, + "firstLayerPrintMult": 1.10, + "firstLayerYOffset": 0, + "firstLayerBrim": 0, + "firstLayerBeltLead": 0, + "firstLayerFanSpeed": 0, + "outputTemp": 210, + "outputFanMax": 255, + "outputBedTemp": 70, + "outputFanSpeed": 255, + "outputFeedrate": 50, + "outputFinishrate": 40, + "outputSeekrate": 80, + "outputShellMult": 1.2, + "outputFillMult": 1.2, + "outputSparseMult": 1.2, + "outputFanLayer": 0, + "outputRetractDist": 5, + "outputRetractSpeed": 40, + "outputRetractWipe": 1, + "outputRetractDwell": 20, + "outputShortPoly": 60.0, + "outputMinSpeed": 10.0, + "outputCoastDist": 0.1, + "outputWipeDistance": 1, + "outputLayerRetract": false, + "detectThinWalls": true, + "zHopDistance": 0, + "antiBacklash": 0 + }] } From ae9cd843c1fb47c4ded2ceac2e8a4719035063f2 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 12 Mar 2021 13:19:57 -0500 Subject: [PATCH 240/255] fix brim offset bug. disable manual supports when automatic enabled --- src/kiri/init.js | 4 ++-- src/kiri/print.js | 4 +++- src/mode/fdm/client.js | 30 +++++++++++++++++++++++++++--- src/mode/fdm/prepare.js | 7 +++++-- 4 files changed, 37 insertions(+), 8 deletions(-) diff --git a/src/kiri/init.js b/src/kiri/init.js index 013f2992..8e8ff20a 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -198,7 +198,7 @@ // } API.conf.update(); DOC.activeElement.blur(); - // API.event.emit("boolean.click"); + API.event.emit("boolean.click"); } function onButtonClick(ev) { @@ -1691,7 +1691,7 @@ sliceSupportGen: UC.newRow([ UI.ssaGen = UC.newButton(LANG.sp_detect, onButtonClick, {class: "f-col grow a-center"}) - ], { modes: FDM, class: "ext-buttons f-row grow", xshow:isNotBelt }), + ], { modes: FDM, class: "ext-buttons f-row grow" }), fdmSep: UC.newBlank({class:"pop-sep", modes:FDM, show:isNotBelt}), sliceSupportManual: UC.newRow([ (UI.ssmAdd = UC.newButton(undefined, onButtonClick, {icon:''})), diff --git a/src/kiri/print.js b/src/kiri/print.js index a7545ce9..eb4f6467 100644 --- a/src/kiri/print.js +++ b/src/kiri/print.js @@ -564,7 +564,9 @@ } function intersectsTop(p1, p2) { - return retractRequired(p1, p2); + if (opt.danger) { + return retractRequired(p1, p2); + } let int = false; POLY.flatten(slice.topPolys().clone(true)).forEach(function(poly) { if (!int) poly.forEachSegment(function(s1, s2) { diff --git a/src/mode/fdm/client.js b/src/mode/fdm/client.js index 046dee70..5cced634 100644 --- a/src/mode/fdm/client.js +++ b/src/mode/fdm/client.js @@ -102,6 +102,23 @@ } } + api.event.on("boolean.click", func.updateSupportButtons = () => { + if (!isFdmMode) { + return; + } + for (let btn of [ + UI.ssaGen, + UI.ssmAdd, + UI.ssmDun, + UI.ssmClr + ]) { + btn.disabled = UI.sliceSupportEnable.checked; + } + if (UI.sliceSupportEnable.checked) { + func.sclear(); + } + }); + api.event.on("function.animate", (mode) => { if (!isFdmMode) { return; @@ -160,6 +177,7 @@ }); api.event.on("settings.saved", (settings) => { updateRanges(settings.process.ranges); + func.updateSupportButtons(); // let ranges = settings.process.ranges; // UI.rangeGroup.style.display = isFdmMode && ranges && ranges.length ? 'flex' : 'none'; }); @@ -217,8 +235,9 @@ }); api.event.on("fdm.supports.clear", func.sclear = () => { func.sdone(); - clearAllWidgetSupports(); - API.conf.save(); + if (clearAllWidgetSupports()) { + API.conf.save(); + } }); api.event.on("slice.begin", () => { if (!isFdmMode) { @@ -495,18 +514,23 @@ } function clearAllWidgetSupports() { + let cleared = 0; API.widgets.all().forEach(widget => { - clearWidgetSupports(widget); + cleared += clearWidgetSupports(widget); }); + return cleared; } function clearWidgetSupports(widget) { + let cleared = 0; Object.values(widget.sups || {}).forEach(support => { widget.adds.remove(support.box); widget.mesh.remove(support.box); + cleared++; }); widget.sups = {}; delete API.widgets.annotate(widget.id).support; + return cleared; } function delbox(name) { diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index e2bae31c..c6448d25 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -32,6 +32,7 @@ isBelt = device.bedBelt, isThin = controller.lineType === "line", isFlat = controller.lineType === "flat", + isDanger = controller.danger || false, firstLayerHeight = isBelt ? process.sliceHeight : process.firstSliceHeight || process.sliceHeight, firstLayerSeek = process.outputSeekrate, firstLayerRate = process.firstLayerRate, @@ -84,7 +85,8 @@ }); // nest and offset tops POLY.nest(tops).forEach(function(poly) { - poly.offset(-offset + nozzle / 2).forEach(function(brim) { + let off = poly.offset(-offset + nozzle / 2); + if (off) off.forEach(function(brim) { brim.move(widget.track.pos); brims.push(brim); }); @@ -92,7 +94,7 @@ }); // merge brims - brims = POLY.union(brims); + brims = POLY.union(brims, undefined, true); // if brim is offset, over-expand then shrink to induce brims to merge if (offset && brims.length) { @@ -412,6 +414,7 @@ layerout, { seedPoint: printPoint.sub(offset), + danger: isDanger, params, // range parameters first: slice.index === 0, support: slice.widget.support, From 4a0a000ef98f8d7eda7b787f49f2f4f04b62a06e Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 12 Mar 2021 14:44:05 -0500 Subject: [PATCH 241/255] fix shell depth cues used for extrusion speed --- src/geo/polygons.js | 10 ++++++++++ src/mode/fdm/slice.js | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/geo/polygons.js b/src/geo/polygons.js index e6b389cb..39aac8cf 100644 --- a/src/geo/polygons.js +++ b/src/geo/polygons.js @@ -550,6 +550,7 @@ let total = count; let layers = []; let ref = polys; + let depth = 0; while (count-- > 0 && ref && ref.length) { let off = offset(ref, -dist, {z}); let mid = offset(off, dist / 2, {z}); @@ -563,6 +564,15 @@ subtract(ref, cmp, gap, null, z); } layers.push({idx: total-count, off, mid, gap}); + // fixup depth cues + for (let m of mid) { + m.depth = depth++; + if (m.inner) { + for (let mi of m.inner) { + mi.depth = m.depth; + } + } + } ref = off; } return layers; diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index ef96d4d0..b918b8f9 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -609,6 +609,11 @@ if (p.fill_off) { p.fill_off.forEach(pi => pi.depth = i); } + if (p.inner) { + for (let pi of p.inner) { + pi.depth = p.depth; + } + } top.shells.push(p); }); last = polys; @@ -643,6 +648,11 @@ // use negative offset for inners pi.depth = -(count - countNow); }); + if (p.inner) { + for (let pi of p.inner) { + pi.depth = p.depth; + } + } }); }); } From e549bba9d50c62cd94a6df978135cf822c7bf047 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 12 Mar 2021 14:44:30 -0500 Subject: [PATCH 242/255] optimize no-intersects case --- src/kiri/print.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/kiri/print.js b/src/kiri/print.js index eb4f6467..9659b109 100644 --- a/src/kiri/print.js +++ b/src/kiri/print.js @@ -594,6 +594,11 @@ }); } + // no intersections + if (ints.length === 0) { + return false; + } + // odd # of intersections ?!? do retraction if (ints.length && ints.length % 2 !== 0) { if (dbug === slice.index) console.log(slice.index, {odd_intersects: ints}); From fad92d063a2562cde65f8d8027f1ea08df13f3b1 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 12 Mar 2021 18:34:51 -0500 Subject: [PATCH 243/255] add arc tolerance and anti-backlash to range params --- src/mode/fdm/client.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/mode/fdm/client.js b/src/mode/fdm/client.js index 5cced634..c0dd57f9 100644 --- a/src/mode/fdm/client.js +++ b/src/mode/fdm/client.js @@ -51,6 +51,8 @@ "sliceLayerStart": LANG.sl_strt_s, // export "zHopDistance": LANG.ad_zhop_s, + "arcTolerance": LANG.ad_zhop_s, + "antiBacklash": LANG.ad_abkl_s, "outputTemp": LANG.ou_nozl_s, "outputBedTemp": LANG.ou_bedd_s, "outputFanSpeed": LANG.ou_fans_s, From 0367606e29f91536b37908e5ea5ee530324fb4fe Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 13 Mar 2021 08:27:56 -0500 Subject: [PATCH 244/255] add shell overlap to range params --- src/mode/fdm/client.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mode/fdm/client.js b/src/mode/fdm/client.js index c0dd57f9..809e745a 100644 --- a/src/mode/fdm/client.js +++ b/src/mode/fdm/client.js @@ -37,6 +37,7 @@ "sliceSolidMinArea": LANG.ad_msol_s, // prepare "sliceShellOrder": LANG.sl_ordr_s, + "sliceFillOverlap": LANG.fi_over_s, "outputFeedrate": LANG.ou_feed_s, "outputFinishrate": LANG.ou_fini_s, "outputShellMult": LANG.ou_shml_s, From 4aa1a0be0b5cd1b83fc5396cc34a81268be653a2 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 13 Mar 2021 13:41:47 -0500 Subject: [PATCH 245/255] remove level. no longer used --- app.js | 56 ---------------------------------------------------- package.json | 3 --- 2 files changed, 59 deletions(-) diff --git a/app.js b/app.js index 9fcaeca4..8b96bcf4 100644 --- a/app.js +++ b/app.js @@ -21,7 +21,6 @@ const load = []; const synth = {}; const api = {}; -let level; let setupFn; let cacheDir; let startTime; @@ -44,25 +43,8 @@ function init(mod) { dir = mod.dir; log = mod.log; - if (mod.util.globdir) { - // when globdir available, look for shared kvstore - // and if not present, create and share in through env - if (mod.env._level) { - level = mod.env._level; - logger.log("using shared kvstore"); - } else { - level = require('level')(mod.util.globdir("kvstore"), {valueEncoding:"json"}); - mod.env._level = level; - logger.log("creating shared kvstore"); - } - } else { - logger.log("fallback to local kvstore"); - level = require('level')(mod.util.datadir("kvstore"), {valueEncoding:"json"}); - } - cacheDir = mod.util.datadir("cache"); - mod.on.reload(() => level.close()); mod.on.test((req) => { let cookie = cookieValue(req.headers.cookie, "version") || undefined; let vmatch = mod.meta.version || "*"; @@ -176,10 +158,6 @@ function initModule(mod, file, dir) { getCookieValue: cookieValue, logger: log.new }, - db: { - api: db, - level: level - }, inject: (code, file, options) => { if (!script[code]) { return logger.log(`inject missing target "${code}"`); @@ -410,40 +388,6 @@ const script = { // prevent caching of specified modules const cachever = {}; -const db = { - // -------- - key: arr => arr.join("/"), - // -------- - get: key => { - if (Array.isArray(key)) key = db.key(key); - return promise((resolve,reject) => { - level.get(key,(err,record) => { - resolve(record,err); - }); - }); - }, - - // -------- - put: (key, value) => { - if (Array.isArray(key)) key = db.key(key); - return promise((resolve,reject) => { - level.put(key,value,(err) => { - if (err) reject(err); - else resolve(); - }); - }); - }, - // -------- - del: key => { - return promise((resolve,reject) => { - level.del(key, (err) => { - if (err) reject(err); - else resolve(); - }); - }); - } -}; - function promise(resolve, reject) { return new Promise(resolve, reject); } diff --git a/package.json b/package.json index 5b6e0277..fb1230ec 100644 --- a/package.json +++ b/package.json @@ -28,9 +28,6 @@ "earcut": "^2.2.2", "express-useragent": "^1.0.13", "jszip": "^3.5.0", - "level": "^6.0.1", - "leveldown": "^5.6.0", - "levelup": "^4.4.0", "moment": "^2.24.0", "pixi.js": "^4.8.9", "serve-static": "^1.14.1", From 4d488bd6a88146950c38f5d98002c9b8964994df Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 13 Mar 2021 16:35:08 -0500 Subject: [PATCH 246/255] remove import file filter --- src/kiri/main.js | 4 +--- web/kiri/index.html | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/kiri/main.js b/src/kiri/main.js index c5dc7bf4..f62cfb8f 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -4,9 +4,7 @@ (function () { - let iOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent), - // --------------- - MOTO = moto, + let MOTO = moto, KIRI = self.kiri, BASE = self.base, UTIL = BASE.util, diff --git a/web/kiri/index.html b/web/kiri/index.html index fd8dd83b..f4809bfa 100644 --- a/web/kiri/index.html +++ b/web/kiri/index.html @@ -381,7 +381,7 @@
    - +
    From 8e7a51a01d889e82957425245fd24160732f88ee Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 14 Mar 2021 12:01:23 -0400 Subject: [PATCH 247/255] fixes #137 --- src/mode/fdm/prepare.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index c6448d25..70059c2d 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -26,6 +26,7 @@ settings = FDM.fixExtruders(settings); let render = settings.render !== false, { device, process, controller, bounds, mode } = settings, + { bedWidth, bedDepth } = device, output = [], printPoint = newPoint(0,0,0), nozzle = device.extruders[0].extNozzle, @@ -167,7 +168,8 @@ }); // output brim points - printPoint = print.poly2polyEmit(polys, printPoint, function(poly, index, count, startPoint) { + let brimStart = offset < nozzle * 2 ? newPoint(-bedWidth, -bedDepth, 0) : printPoint; + printPoint = print.poly2polyEmit(polys, brimStart, (poly, index, count, startPoint) => { return print.polyPrintPath(poly, startPoint, preout, { rate: firstLayerRate, onfirst: function(point) { From d3aeb39fa986aee2355e8dbad5bdc6dfb4075d59 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 14 Mar 2021 13:47:36 -0400 Subject: [PATCH 248/255] prevent new animation when running animation --- src/mode/cam/client.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/mode/cam/client.js b/src/mode/cam/client.js index c21a3ccc..c5402b50 100644 --- a/src/mode/cam/client.js +++ b/src/mode/cam/client.js @@ -42,6 +42,9 @@ // wire up animate button in ui api.event.on("function.animate", (mode) => { + if (isAnimate) { + return; + } if (isCamMode && !camStock) { return api.show.alert("animation requires stock to be enabled"); } From 50d6ca59c8cfaf0b4ef4e0f95501987cdc6e7d82 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 14 Mar 2021 13:53:39 -0400 Subject: [PATCH 249/255] fix raft layer z heights --- src/mode/fdm/prepare.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index 70059c2d..059a16a0 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -131,6 +131,7 @@ speed: speed, mult: extrude, }); + layerout.z = zoff + height; layerout.height = height; output.append(layerout); From da9af51bb6d2d0c542b3cee4229526a5d20aaf41 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 14 Mar 2021 14:32:16 -0400 Subject: [PATCH 250/255] fix raft model spacing --- src/mode/fdm/prepare.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index 059a16a0..76fa94f6 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -147,6 +147,7 @@ // raise first layer off raft slightly to lessen adhesion firstLayerHeight += process.outputRaftSpacing || 0; + zoff += process.outputRaftSpacing || 0; // retract after last raft layer output.last().last().retract = true; From 8df9860aeea0901fd95ca100187592b85dfcb765 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 14 Mar 2021 15:16:30 -0400 Subject: [PATCH 251/255] better fan handling. fix range params with rafts --- src/mode/fdm/driver.js | 3 +++ src/mode/fdm/export.js | 18 ++++++++++++------ src/mode/fdm/prepare.js | 3 ++- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/mode/fdm/driver.js b/src/mode/fdm/driver.js index c28582c1..b50bb300 100644 --- a/src/mode/fdm/driver.js +++ b/src/mode/fdm/driver.js @@ -30,6 +30,9 @@ } function getRangeParameters(settings, index) { + if (index === undefined || index === null || index < 0) { + return settings.process; + } let ranges = settings.process.ranges; if (!(ranges && ranges.length)) { return settings.process; diff --git a/src/mode/fdm/export.js b/src/mode/fdm/export.js index cdb4fcdd..66688c48 100644 --- a/src/mode/fdm/export.js +++ b/src/mode/fdm/export.js @@ -67,7 +67,7 @@ }, nozzleTemp = process.firstLayerNozzleTemp || process.outputTemp, bedTemp = process.firstLayerBedTemp || process.outputBedTemp, - fanSpeed = process.firstLayerFanSpeed, + fanSpeed = undefined, lastNozzleTemp = nozzleTemp, lastBedTemp = bedTemp, lastFanSpeed = fanSpeed, @@ -106,9 +106,15 @@ retSpeed = process.outputRetractSpeed * 60; // range retDwell = process.outputRetractDwell || 0; // range timeDwell = retDwell / 1000; - nozzleTemp = process.outputTemp || process.firstLayerNozzleTemp; - bedTemp = process.outputBedTemp || process.firstLayerBedTemp; - fanSpeed = process.outputFanSpeed; + nozzleTemp = layer === 0 ? + process.firstLayerNozzleTemp || process.outputTemp : + process.outputTemp || process.firstLayerNozzleTemp; + bedTemp = layer === 0 ? + process.firstLayerBedTemp || process.outputBedTemp : + process.outputBedTemp || process.firstLayerBedTemp; + fanSpeed = layer === 0 ? + process.firstLayerFanSpeed || 0 : + process.outputFanSpeed || 0; Object.assign(subst, { temp_bed: bedTemp, bed_temp: bedTemp, @@ -327,8 +333,8 @@ while (layer < layers.length) { path = layers[layer]; - // allow range overrides past base - if (path.layer > 0) { + // range overrides + if (path.layer >= 0) { updateParams(path.layer); } diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index 76fa94f6..5f97698d 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -403,6 +403,7 @@ lastWidget = slice.widget; layerout.z = z + slice.height / 2; layerout.height = layerout.height || slice.height; + layerout.slice = slice; // mark layer as anchor if slice is belt and flag set layerout.anchor = slice.belt && slice.belt.anchor; // detect extruder change and print purge block @@ -764,7 +765,7 @@ update(index / levels.length, output); }); - console.log({retractz}); + // console.log({retractz}); return layers; } From b8afd5d243ab1a9b4b8a9c538f5fd32795b8d0ca Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 14 Mar 2021 18:50:47 -0400 Subject: [PATCH 252/255] tweak raft settings for cleaner separation --- src/mode/fdm/prepare.js | 6 +++--- src/mode/fdm/slice.js | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/mode/fdm/prepare.js b/src/mode/fdm/prepare.js index 5f97698d..04c38bfe 100644 --- a/src/mode/fdm/prepare.js +++ b/src/mode/fdm/prepare.js @@ -139,11 +139,11 @@ zoff += height; }; - raft(nozzle/1, process.sliceFillAngle + 0 , nozzle * 6.0, firstLayerRate / 3, 4); - raft(nozzle/1, process.sliceFillAngle + 0 , nozzle * 6.0, firstLayerRate / 2, 4); + raft(nozzle/1, process.sliceFillAngle + 0 , nozzle * 5.0, firstLayerRate / 3, 4); + raft(nozzle/1, process.sliceFillAngle + 0 , nozzle * 5.0, firstLayerRate / 2, 4); raft(nozzle/2, process.sliceFillAngle + 90, nozzle * 3.0, process.outputFeedrate, 2.5); raft(nozzle/2, process.sliceFillAngle + 0 , nozzle * 1.0, process.outputFeedrate, 1.5); - raft(nozzle/2, process.sliceFillAngle + 0 , nozzle * 1.0, process.outputFeedrate, 1.0); + raft(nozzle/2, process.sliceFillAngle + 90 , nozzle * 0.7, process.outputFeedrate, 0.75); // raise first layer off raft slightly to lessen adhesion firstLayerHeight += process.outputRaftSpacing || 0; diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index b918b8f9..c36cb920 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -359,6 +359,7 @@ start.down = addto; slices.splice(0,0,addto); } + addto.index = -1; addto.belt.anchor = true; let z = addto.z; let y = z - smin - (nozzleSize / 2); From 1b60290286e94bb5a95820b870054f2c88c3e1ec Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 14 Mar 2021 19:49:21 -0400 Subject: [PATCH 253/255] fix macro algebra --- src/kiri/print.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/kiri/print.js b/src/kiri/print.js index 9659b109..c856ed42 100644 --- a/src/kiri/print.js +++ b/src/kiri/print.js @@ -1230,9 +1230,9 @@ function constOp(tok, consts, opch, op) { let pos, v1, v2; if ((pos = tok.indexOf(opch)) > 0) { - v1 = consts[tok.substring(0,pos)] || 0; - v2 = parseInt(tok.substring(pos+1)) || 0; - return op(v1,v2); + v1 = parseFloat(consts[tok.substring(0,pos)] || 0); + v2 = parseFloat(tok.substring(pos+1)) || 0; + return op(v1,v2).round(4); } else { return null; } From ebd31d8dc7ba21d0c6677f0b521910af17ef2127 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 15 Mar 2021 11:00:05 -0400 Subject: [PATCH 254/255] fix linear infill density. stub in sliceFillWidth --- src/kiri/conf.js | 1 + src/kiri/init.js | 6 +++--- src/kiri/print.js | 9 +++++---- src/mode/fdm/client.js | 1 + src/mode/fdm/fill.js | 27 ++++++++++++++------------- src/mode/fdm/slice.js | 17 +++++++++++------ web/kiri/lang/en.js | 8 +++++--- 7 files changed, 40 insertions(+), 29 deletions(-) diff --git a/src/kiri/conf.js b/src/kiri/conf.js index e1b4f47c..1ea366af 100644 --- a/src/kiri/conf.js +++ b/src/kiri/conf.js @@ -289,6 +289,7 @@ sliceShellOrder: "in-out", sliceLayerStart: "last", sliceFillAngle: 45, + sliceFillWidth: 1, sliceFillOverlap: 0.3, sliceFillSparse: 0.5, sliceFillRate: 0, diff --git a/src/kiri/init.js b/src/kiri/init.js index 8e8ff20a..8bad67f0 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -1667,13 +1667,13 @@ fdmInfill: UC.newGroup(LANG.fi_menu, $('settings'), {modes:FDM}), sliceFillType: UC.newSelect(LANG.fi_type, {modes:FDM}, "infill"), - fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}), sliceFillSparse: UC.newInput(LANG.fi_pcnt_s, {title:LANG.fi_pcnt_l, convert:UC.toFloat, bound:UC.bound(0.0,1.0), modes:FDM}), fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}), sliceFillOverlap: UC.newInput(LANG.fi_over_s, {title:LANG.fi_over_l, convert:UC.toFloat, bound:UC.bound(0.0,2.0), modes:FDM}), - sliceFillAngle: UC.newInput(LANG.fi_angl_s, {title:LANG.fi_angl_l, convert:UC.toFloat, modes:FDM}), - // fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}), sliceFillRate: UC.newInput(LANG.ou_feed_s, {title:LANG.fi_rate_l, convert:UC.toInt, bound:UC.bound(0,300), modes:FDM}), + fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}), + sliceFillAngle: UC.newInput(LANG.fi_angl_s, {title:LANG.fi_angl_l, convert:UC.toFloat, modes:FDM}), + // sliceFillWidth: UC.newInput(LANG.fi_wdth_s, {title:LANG.fi_wdth_l, convert:UC.toFloat, modes:FDM}), fdmSupport: UC.newGroup(LANG.sp_menu, null, {modes:FDM, marker:false}), sliceSupportNozzle: UC.newSelect(LANG.sp_nozl_s, {title:LANG.sp_nozl_l, modes:FDM}, "extruders"), diff --git a/src/kiri/print.js b/src/kiri/print.js index c856ed42..44583264 100644 --- a/src/kiri/print.js +++ b/src/kiri/print.js @@ -515,6 +515,7 @@ firstLayer = opt.first || false, thinWall = nozzleSize * (opt.thinWall || 1.75), retractDist = opt.retractOver || 2, + solidWidth = process.sliceFillWidth || 1, fillMult = opt.mult || process.outputFillMult, shellMult = opt.mult || process.outputShellMult || (process.laserSliceHeight >= 0 ? 1 : 0), shellOrder = {"out-in":-1,"in-out":1}[process.sliceShellOrder] || -1, @@ -801,7 +802,7 @@ }); } - function outputFills(lines, options) { + function outputFills(lines, opt = {}) { if (!lines || lines.length === 0) { return; } @@ -810,10 +811,10 @@ start = 0, skip = false, lastIndex = -1, - opt = options || {}, + flow = opt.flow || 1, near = opt.near || false, fast = opt.fast || false, - fill = opt.fill >= 0 ? opt.fill : fillMult, + fill = (opt.fill >= 0 ? opt.fill : fillMult) * flow, thinDist = near ? thinWall : thinWall; while (lines && marked < lines.length) { @@ -1036,7 +1037,7 @@ outputFills(next.thin_fill, {near: true}); // then output solid and sparse fill - outputFills(next.fill_lines); + outputFills(next.fill_lines, {flow: solidWidth}); outputSparse(next.fill_sparse, sparseMult, infillSpeed); lastTop = next; diff --git a/src/mode/fdm/client.js b/src/mode/fdm/client.js index 809e745a..77464d47 100644 --- a/src/mode/fdm/client.js +++ b/src/mode/fdm/client.js @@ -33,6 +33,7 @@ // slice "sliceShells": LANG.sl_shel_s, "sliceFillType": LANG.fi_type, + "sliceFillWidth": LANG.fi_wdth_s, "sliceFillSparse": LANG.fi_pcnt_s, "sliceSolidMinArea": LANG.ad_msol_s, // prepare diff --git a/src/mode/fdm/fill.js b/src/mode/fdm/fill.js index 9a1245eb..4b73126c 100644 --- a/src/mode/fdm/fill.js +++ b/src/mode/fdm/fill.js @@ -155,27 +155,28 @@ function fillLinear(target) { let bounds = target.bounds(); let height = target.zHeight(); + + let density = target.density(); + let line = target.lineWidth(); + let span_x = bounds.max.x - bounds.min.x; let span_y = bounds.max.y - bounds.min.y; - let density = target.density(); - let offset = target.offset() / 2; - let line = target.lineWidth(); - let mf = Math.max(span_x, span_y) / line; - let tile = 1 + (1 - density); - let tile_xc = Math.ceil(span_x / tile); - let tile_yc = Math.ceil(span_y / tile); + let steps_x = (span_x / line) * density; + let steps_y = (span_y / line) * density; + let step_x = span_x / steps_x; + let step_y = span_x / steps_x; if (target.zIndex() % 2 === 1) { - for (let tx=0; tx<=tile_xc; tx++) { + for (let tx=bounds.min.x; tx<=bounds.max.x; tx += step_x) { target.newline(); - target.emit(tx * tile + bounds.min.x, bounds.min.y); - target.emit(tx * tile + bounds.min.x, bounds.max.y); + target.emit(tx, bounds.min.y); + target.emit(tx, bounds.max.y); } } else { - for (let ty=0; ty<=tile_yc; ty++) { + for (let ty=bounds.min.y; ty<=bounds.max.y; ty += step_y) { target.newline(); - target.emit(bounds.min.x, ty * tile + bounds.min.y); - target.emit(bounds.max.x, ty * tile + bounds.min.y); + target.emit(bounds.min.x, ty); + target.emit(bounds.max.x, ty); } } } diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index c36cb920..688d3c40 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -294,6 +294,7 @@ let isTop = slice.index > slices.length - spro.sliceTopLayers-1; let isDense = params.sliceFillSparse > 0.98; let solid = (isBottom || ((isTop || isDense) && !vaseMode)) && !isSynth; + let solidWidth = params.sliceFillWidth || 1; let spaceMult = first ? spro.firstLayerLineMult || 1 : 1; let offset = shellOffset * spaceMult; let fillOff = fillOffset * spaceMult; @@ -305,7 +306,7 @@ danger: ctrl.danger }); if (solid) { - let fillSpace = fillSpacing * spaceMult; + let fillSpace = fillSpacing * spaceMult * solidWidth; doSolidLayerFill(slice, fillSpace, sliceFillAngle); } sliceFillAngle += 90.0; @@ -381,9 +382,11 @@ projectBridges(slice, solidLayers); }, "solids"); forSlices(0.35, 0.5, slice => { + let params = getRangeParameters(settings, slice.index); let first = slice.index === 0; - let spaceMult = first ? spro.firstLayerLineMult || 1 : 1; - let fillSpace = fillSpacing * spaceMult; + let solidWidth = params.sliceFillWidth || 1; + let spaceMult = first ? params.firstLayerLineMult || 1 : 1; + let fillSpace = fillSpacing * spaceMult * solidWidth; doSolidsFill(slice, fillSpace, sliceFillAngle, minSolid); sliceFillAngle += 90.0; }, "solids"); @@ -439,7 +442,8 @@ // render if not explicitly disabled if (render) { forSlices(0.9, 1.0, slice => { - doRender(slice, isSynth); + let params = getRangeParameters(settings, slice.index); + doRender(slice, isSynth, params); }, "render"); } @@ -462,9 +466,10 @@ return Math.max(min,Math.min(max,v)); } - function doRender(slice, isSynth) { + function doRender(slice, isSynth, params) { const output = slice.output(); const height = slice.height / 2; + const solidWidth = params.sliceFillWidth || 1; slice.tops.forEach(top => { if (isThin) output @@ -489,7 +494,7 @@ if (top.fill_lines && top.fill_lines.length) output .setLayer("fill", isSynth ? COLOR.support : COLOR.fill) - .addLines(top.fill_lines, vopt({ offset, height })); + .addLines(top.fill_lines, vopt({ offset: offset * solidWidth, height })); if (top.fill_sparse) output .setLayer("infill", COLOR.infill) diff --git a/web/kiri/lang/en.js b/web/kiri/lang/en.js index 7244e587..4016cfe4 100644 --- a/web/kiri/lang/en.js +++ b/web/kiri/lang/en.js @@ -270,13 +270,15 @@ kiri.lang['en-us'] = { // FDM FILL fi_menu: "infill", - fi_type: "type", + fi_type: "fill type", fi_pcnt_s: "fill fraction", fi_pcnt_l: ["fill density values","0.0 - 1.0"], fi_angl_s: "solid start", fi_angl_l: ["starting angle in degrees","90 degrees added to ","each following layer","applies only to solid layers"], - fi_over_s: "overlap", - fi_over_l: ["overlap with shell and other fill","as fraction of nozzle diameter","0.0 - 1.0"], + fi_wdth_s: "solid width", + fi_wdth_l: ["line width for solid fill","as a fraction of nozzle width","values < 1 are more dense","good for surface finishes","0.0 - 1.0"], + fi_over_s: "shell overlap", + fi_over_l: ["overlap with shell and other fill","as fraction of nozzle diameter","0.0 - 2.0"], // fi_rate_s: "print speed", fi_rate_l: ["extrusion speed for infill","set to 0 to use default","output print speeds"], From 603a46e4327d65a7b59f3f1385c6960439285425 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 15 Mar 2021 15:20:50 -0400 Subject: [PATCH 255/255] fix clip to when stock not set or invalid. fix client/worker signaling for null-callbacks --- src/kiri/client.js | 16 ++++++++++++---- src/kiri/init.js | 1 - src/kiri/worker.js | 1 + src/mode/cam/ops.js | 9 +++++---- src/mode/fdm/client.js | 4 +++- 5 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/kiri/client.js b/src/kiri/client.js index d05fd738..6b475fbd 100644 --- a/src/kiri/client.js +++ b/src/kiri/client.js @@ -28,8 +28,11 @@ let KIRI = self.kiri = self.kiri || {}, function send(fn, data, onreply, zerocopy) { let seq = seqid++; - running[seq] = { fn:onreply }; - // console.log('send', data); + if (onreply) { + // track it only when we expect and can handle a reply + running[seq] = { fn:onreply }; + } + // console.log('send', {fn, data, onreply}); try { worker.postMessage({ @@ -59,6 +62,7 @@ KIRI.work = { isBusy: function() { let current = 0; + for (let rec of Object.values(running)) { if (rec.fn) current++; } @@ -92,7 +96,7 @@ KIRI.work = { let now = time(), reply = e.data, record = running[reply.seq], - onreply = record.fn; + onreply = record ? record.fn : undefined; // console.log('recv', reply.data) if (reply.done) { @@ -102,7 +106,11 @@ KIRI.work = { // calculate and replace recv time reply.time_recv = now - reply.time_recv; - onreply(reply.data, reply); + if (onreply) { + onreply(reply.data, reply); + } else { + console.log({unexpected_reply: reply}); + } }; restarting = false; diff --git a/src/kiri/init.js b/src/kiri/init.js index 8bad67f0..243baed3 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -248,7 +248,6 @@ API.dialog.hide(); // cancel slicing API.function.cancel(); - // if (KIRI.work.isSlicing()) KIRI.work.restart(); // kill any poppers in compact mode UC.hidePoppers(); // and send an event (used by FDM client) diff --git a/src/kiri/worker.js b/src/kiri/worker.js index 49995bb9..4d18136a 100644 --- a/src/kiri/worker.js +++ b/src/kiri/worker.js @@ -62,6 +62,7 @@ KIRI.worker = { } } } + send.done(data.id); return; } diff --git a/src/mode/cam/ops.js b/src/mode/cam/ops.js index 4174ae21..28884e0c 100644 --- a/src/mode/cam/ops.js +++ b/src/mode/cam/ops.js @@ -266,7 +266,7 @@ if (!offset) return; - if (process.camStockClipTo) { + if (process.camStockClipTo && stock.x && stock.y && stock.center) { let rect = newPolygon().centerRectangle(stock.center, stock.x, stock.y); offset = cutPolys([rect], offset, slice.z, true); } @@ -523,7 +523,7 @@ CAM.addDogbones(offset, toolDiam / 5); } - if (process.camStockClipTo) { + if (process.camStockClipTo && stock.x && stock.y && stock.center) { let rect = newPolygon().centerRectangle(stock.center, stock.x, stock.y); offset = cutPolys([rect], offset, slice.z, true); } @@ -719,7 +719,8 @@ let toolOver = toolDiam * op.step; let cutdir = process.camConventional; let polys = []; - let stockRect = newPolygon().centerRectangle(stock.center, stock.x, stock.y); + let stockRect = stock.center && stock.x && stock.y ? + newPolygon().centerRectangle(stock.center, stock.x, stock.y) : undefined; updateToolDiams(toolDiam); if (tabs) { tabs.forEach(tab => { @@ -746,7 +747,7 @@ } else { slice.camLines = [ poly ]; } - if (process.camStockClipTo) { + if (process.camStockClipTo && stockRect) { slice.camLines = cutPolys([stockRect], slice.camLines, z, true); } slice.output() diff --git a/src/mode/fdm/client.js b/src/mode/fdm/client.js index 77464d47..28c339a9 100644 --- a/src/mode/fdm/client.js +++ b/src/mode/fdm/client.js @@ -64,7 +64,9 @@ }; for (let key of Object.keys(rangeVars)) { - UI[key].range = true; + if (UI[key]) { + UI[key].range = true; + } } function filterSynth() {