update code style, use gapp.register() for cam driver

This commit is contained in:
Stewart Allen 2022-02-21 10:01:19 -05:00
commit 836d53aad5
10 changed files with 4881 additions and 4862 deletions

View file

@ -2,12 +2,15 @@
"use strict";
self.kiri.load(function() {
// dep: kiri.api
// dep: kiri-mode.cam.driver
gapp.register("kiri-mode.cam.animate", [], (root, exports) => {
let KIRI = self.kiri,
CAM = KIRI.driver.CAM,
API, WORLD, SPACE,
meshes = {},
const { kiri } = root;
const { api, driver } = kiri;
const { CAM } = driver;
let meshes = {},
unitScale = 1,
progress, toolPosX, toolPosY, toolPosZ,
speedValues = [ 25, 12, 6, 3 ],
@ -23,28 +26,29 @@ self.kiri.load(function() {
// ---( CLIENT FUNCTIONS )---
if (KIRI.client)
CAM.animate_clear = function(api) {
API = api;
KIRI.client.animate_cleanup();
SPACE = KIRI.space;
WORLD = SPACE.world;
kiri.load(() => {
if (!kiri.client) {
return;
}
const { moto } = root;
const { space } = moto;
const { world } = space;
function animate_clear(api) {
kiri.client.animate_cleanup();
$('layer-animate').innerHTML = '';
$('layer-toolpos').innerHTML = '';
Object.keys(meshes).forEach(id => deleteMesh(id));
}
if (KIRI.client)
CAM.animate = function(api, delay) {
API = api;
SPACE = KIRI.space;
WORLD = SPACE.world;
KIRI.client.animate_setup(API.conf.get(), data => {
function animate(api, delay) {
kiri.client.animate_setup(api.conf.get(), data => {
checkMeshCommands(data);
if (!(data && data.mesh_add)) {
return;
}
const UC = API.uc;
const UC = api.uc;
const layer = $('layer-animate');
layer.innerHTML = '';
UC.setGroup(layer);
@ -70,9 +74,109 @@ self.kiri.load(function() {
toolPosZ = UC.newInput('z', {disabled: true, size: 7});
playButton.style.display = '';
pauseButton.style.display = 'none';
API.event.emit('animate', 'CAM');
api.event.emit('animate', 'CAM');
});
};
}
gapp.overlay(kiri.client, {
animate(data, ondone) {
kiri.client.send("animate", data, ondone);
},
animate_setup(settings, ondone) {
color = settings.controller.dark ? 0x888888 : 0;
unitScale = settings.controller.units === 'in' ? 1/25.4 : 1;
kiri.client.send("animate_setup", {settings}, ondone);
},
animate_cleanup(data, ondone) {
kiri.client.send("animate_cleanup", data, ondone);
}
});
gapp.overlay(CAM, {
animate,
animate_clear
});
function meshAdd(id, ind, pos) {
const geo = new THREE.BufferGeometry();
geo.setAttribute('position', new THREE.BufferAttribute(pos, 3));
geo.setIndex(new THREE.BufferAttribute(new Uint32Array(ind), 1));
const mat = new THREE.LineBasicMaterial({
transparent: true,
opacity: 0.75,
color
});
const mesh = new THREE.LineSegments(geo, mat);
world.add(mesh);
meshes[id] = mesh;
}
function meshUpdates(id, updates) {
const mesh = meshes[id];
if (!mesh) {
return; // animate cancelled
}
const mpos = mesh.geometry.attributes.position;
for (let i=0, il=updates.length; i<il; ) {
const pos = updates[i++];
const val = updates[i++];
mpos.array[pos] = val;
}
mpos.needsUpdate = true;
space.update();
}
function deleteMesh(id) {
world.remove(meshes[id]);
delete meshes[id];
}
function step(opts) {
const { steps } = opts;
updateSpeed();
kiri.client.animate({speed, steps: 1}, handleGridUpdate);
}
function play(opts) {
const { steps } = opts;
updateSpeed();
if (steps !== 1) {
playButton.style.display = 'none';
pauseButton.style.display = '';
}
kiri.client.animate({speed, steps: steps || Infinity}, handleGridUpdate);
}
function fast(opts) {
const { steps } = opts;
updateSpeed(1);
playButton.style.display = 'none';
pauseButton.style.display = '';
kiri.client.animate({speed, steps: steps || Infinity}, handleGridUpdate);
}
function pause() {
playButton.style.display = '';
pauseButton.style.display = 'none';
kiri.client.animate({speed: 0}, handleGridUpdate);
}
function skip() {
api.show.alert('fast fowarding without animation');
playButton.style.display = 'none';
pauseButton.style.display = '';
updateSpeed(Infinity);
kiri.client.animate({speed, steps: Infinity, toend: true}, handleGridUpdate);
}
function handleGridUpdate(data) {
checkMeshCommands(data);
if (data && data.progress) {
progress.value = (data.progress * 100).toFixed(1)
}
}
function updateSpeed(inc = 0) {
if (inc === Infinity) {
@ -85,9 +189,9 @@ self.kiri.load(function() {
}
function replay() {
CAM.animate_clear(API);
CAM.animate_clear(api);
setTimeout(() => {
CAM.animate(API, 50);
CAM.animate(api, 50);
}, 250);
}
@ -112,7 +216,7 @@ self.kiri.load(function() {
mesh.position.x = pos.x;
mesh.position.y = pos.y;
mesh.position.z = pos.z;
SPACE.update();
space.update();
if (id !== 0) {
toolPosX.value = ((pos.x + posOffset.x) * unitScale).toFixed(2);
toolPosY.value = ((pos.y + posOffset.y) * unitScale).toFixed(2);
@ -125,109 +229,19 @@ self.kiri.load(function() {
}
}
function meshAdd(id, ind, pos) {
const geo = new THREE.BufferGeometry();
geo.setAttribute('position', new THREE.BufferAttribute(pos, 3));
geo.setIndex(new THREE.BufferAttribute(new Uint32Array(ind), 1));
const mat = new THREE.LineBasicMaterial({
transparent: true,
opacity: 0.75,
color
});
const mesh = new THREE.LineSegments(geo, mat);
WORLD.add(mesh);
meshes[id] = mesh;
}
function meshUpdates(id, updates) {
const mesh = meshes[id];
if (!mesh) {
return; // animate cancelled
}
const mpos = mesh.geometry.attributes.position;
for (let i=0, il=updates.length; i<il; ) {
const pos = updates[i++];
const val = updates[i++];
mpos.array[pos] = val;
}
mpos.needsUpdate = true;
SPACE.update();
}
function deleteMesh(id) {
WORLD.remove(meshes[id]);
delete meshes[id];
}
function step(opts) {
const { steps } = opts;
updateSpeed();
KIRI.client.animate({speed, steps: 1}, handleGridUpdate);
}
function play(opts) {
const { steps } = opts;
updateSpeed();
if (steps !== 1) {
playButton.style.display = 'none';
pauseButton.style.display = '';
}
KIRI.client.animate({speed, steps: steps || Infinity}, handleGridUpdate);
}
function fast(opts) {
const { steps } = opts;
updateSpeed(1);
playButton.style.display = 'none';
pauseButton.style.display = '';
KIRI.client.animate({speed, steps: steps || Infinity}, handleGridUpdate);
}
function pause() {
playButton.style.display = '';
pauseButton.style.display = 'none';
KIRI.client.animate({speed: 0}, handleGridUpdate);
}
function skip() {
API.show.alert('fast fowarding without animation');
playButton.style.display = 'none';
pauseButton.style.display = '';
updateSpeed(Infinity);
KIRI.client.animate({speed, steps: Infinity, toend: true}, handleGridUpdate);
}
function handleGridUpdate(data) {
checkMeshCommands(data);
if (data && data.progress) {
progress.value = (data.progress * 100).toFixed(1)
}
}
if (KIRI.client)
KIRI.client.animate_setup = function(settings, ondone) {
color = settings.controller.dark ? 0x888888 : 0;
unitScale = settings.controller.units === 'in' ? 1/25.4 : 1;
KIRI.client.send("animate_setup", {settings}, ondone);
};
if (KIRI.client)
KIRI.client.animate = function(data, ondone) {
KIRI.client.send("animate", data, ondone);
};
if (KIRI.client)
KIRI.client.animate_cleanup = function(data, ondone) {
KIRI.client.send("animate_cleanup", data, ondone);
};
// ---( WORKER FUNCTIONS )---
kiri.load(() => {
if (!kiri.worker) {
return;
}
let stock, center, grid, gridX, gridY, rez;
let path, pathIndex, tool, tools, last, toolID = 1;
if (KIRI.worker)
KIRI.worker.animate_setup = function(data, send) {
kiri.worker.animate_setup = function(data, send) {
const { settings } = data;
const { process } = settings;
const print = current.print;
@ -267,6 +281,31 @@ self.kiri.load(function() {
send.done();
};
kiri.worker.animate = function(data, send) {
if (data.speed >= 0) {
renderSpeed = data.speed;
}
if (data.steps > 0) {
stepsRemain = data.steps;
}
if (data.toend) {
skipMode = !skipMode;
} else {
skipMode = false;
}
checkStash(send);
if (animating) {
return send.done();
}
renderPath(send);
};
kiri.worker.animate_cleanup = function(data, send) {
if (animating) {
animateClear = true;
}
};
function createGrid(stepsX, stepsY, size, step) {
const gridPoints = stepsX * stepsY;
const pos = new Float32Array(gridPoints * 3);
@ -300,33 +339,6 @@ self.kiri.load(function() {
return { pos, ind };
}
if (KIRI.worker)
KIRI.worker.animate = function(data, send) {
if (data.speed >= 0) {
renderSpeed = data.speed;
}
if (data.steps > 0) {
stepsRemain = data.steps;
}
if (data.toend) {
skipMode = !skipMode;
} else {
skipMode = false;
}
checkStash(send);
if (animating) {
return send.done();
}
renderPath(send);
};
if (KIRI.worker)
KIRI.worker.animate_cleanup = function(data, send) {
if (animating) {
animateClear = true;
}
};
let animateClear = false;
let animating = false;
let renderSpeed = 25;
@ -510,7 +522,7 @@ self.kiri.load(function() {
}
// load renderer code in worker context only
if (KIRI.worker && false)
if (kiri.worker && false)
fetch('/wasm/kiri-ani.wasm')
.then(response => response.arrayBuffer())
.then(bytes => WebAssembly.instantiate(bytes, {
@ -535,3 +547,5 @@ self.kiri.load(function() {
});
});
});

View file

@ -2,14 +2,14 @@
"use strict";
(function() {
gapp.register("kiri-mode.cam.client", [], (root, exports) => {
let KIRI = self.kiri,
BASE = self.base,
CAM = KIRI.driver.CAM,
PRO = CAM.process,
newPolygon = BASE.newPolygon,
newPoint = BASE.newPoint,
const { base, kiri } = root;
const { newPoint, newPolygon } = base;
const { driver } = kiri;
const { CAM } = driver;
let PRO = CAM.process,
isAnimate,
isArrange,
isCamMode,
@ -31,7 +31,7 @@
CAM.restoreTabs = restoreTabs;
CAM.init = function(kiri, api) {
FDM = KIRI.driver.FDM;
FDM = kiri.driver.FDM;
// console.log({kiri,api})
SPACE = kiri.space;
@ -563,8 +563,8 @@
CAM.traces((ids) => {
api.hide.alert(alert);
alert = api.show.alert("[esc] cancels trace editing");
KIRI.api.widgets.opacity(0.8);
KIRI.api.widgets.for(widget => {
kiri.api.widgets.opacity(0.8);
kiri.api.widgets.for(widget => {
if (ids.indexOf(widget.id) >= 0) {
unselectTraces(widget, true);
widget.trace_stack = null;
@ -575,11 +575,11 @@
return;
}
let areas = (poppedRec.areas[widget.id] || []);
let stack = new KIRI.Stack(widget.mesh);
let stack = new kiri.Stack(widget.mesh);
widget.trace_stack = stack;
widget.traces.forEach(poly => {
let match = areas.filter(arr => poly.matches(arr));
let layers = new KIRI.Layers();
let layers = new kiri.Layers();
layers.setLayer("trace", {line: 0xaaaa55}, false).addPoly(poly);
stack.addLayers(layers);
stack.new_meshes.forEach(mesh => {
@ -595,7 +595,7 @@
});
});
// ensure appropriate traces are toggled matching current record
KIRI.api.widgets.for(widget => {
kiri.api.widgets.for(widget => {
let areas = (poppedRec.areas[widget.id] || []);
let stack = widget.trace_stack;
stack.meshes.forEach(mesh => {
@ -623,11 +623,11 @@
func.unpop();
traceOn.classList.remove("editing");
traceOn = false;
KIRI.api.widgets.opacity(1);
kiri.api.widgets.opacity(1);
api.hide.alert(alert);
api.feature.hover = false;
api.feature.hoverAdds = false;
KIRI.api.widgets.for(widget => {
kiri.api.widgets.for(widget => {
if (widget.trace_stack) {
widget.trace_stack.hide();
widget.adds.removeAll(widget.trace_stack.meshes);
@ -1254,7 +1254,7 @@
const {x, y, z} = stock;
if (x && y && z && !STACKS.getStack('bounds')) {
const render = new KIRI.Layers().setLayer('bounds', { face: 0xaaaaaa, line: 0xaaaaaa });
const render = new kiri.Layers().setLayer('bounds', { face: 0xaaaaaa, line: 0xaaaaaa });
const stack = STACKS.setFreeMem(false).create('bounds', SPACE.world);
stack.add(render.addPolys([
newPolygon().centerRectangle({x:csox, y:csoy, z:0}, x, y),
@ -1276,4 +1276,4 @@
SPACE.update();
}
})();
});

View file

@ -2,16 +2,17 @@
"use strict";
(function() {
// dep: main.kiri
// use: kiri.api
// use: kiri.widgets
gapp.register("kiri-mode.cam.driver", [], (root, exports) => {
const KIRI = self.kiri,
CAM = KIRI.driver.CAM = {
// init, // src/mode/cam/client.js
// slice, // src/mode/cam/slice.js
// prepare, // src/mode/cam/prepare.js
// export // src/mode/cam/export.js
},
CPRO = CAM.process = {
const { kiri } = root;
const { driver } = kiri;
const CAM = driver.CAM = {};
CAM.process = {
LEVEL: 1,
ROUGH: 2,
OUTLINE: 3,
@ -21,17 +22,17 @@
DRILL: 7
};
// defer loading until KIRI.client and KIRI.worker exist
KIRI.load(function(API) {
// defer loading until kiri.client and kiri.worker exist
kiri.load(api => {
if (KIRI.client)
if (kiri.client)
CAM.traces = function(ondone, single) {
KIRI.client.sync();
let settings = API.conf.get();
let widgets = API.widgets.map();
KIRI.client.send("cam_traces", { settings, single }, output => {
let ids = [];
KIRI.codec.decode(output).forEach(rec => {
kiri.client.sync();
const settings = api.conf.get();
const widgets = api.widgets.map();
kiri.client.send("cam_traces", { settings, single }, output => {
const ids = [];
kiri.codec.decode(output).forEach(rec => {
ids.push(rec.id);
widgets[rec.id].traces = rec.traces;
});
@ -39,12 +40,12 @@
});
};
if (KIRI.worker)
KIRI.worker.cam_traces = function(data, send) {
if (kiri.worker)
kiri.worker.cam_traces = function(data, send) {
const { settings, single } = data;
const widgets = Object.values(wcache);
const fresh = widgets.filter(widget => CAM.traces(settings, widget, single));
send.done(KIRI.codec.encode(fresh.map(widget => { return {
send.done(kiri.codec.encode(fresh.map(widget => { return {
id: widget.id,
traces: widget.traces,
} } )));
@ -52,4 +53,4 @@
});
})();
});

View file

@ -2,22 +2,28 @@
"use strict";
(function() {
// dep: geo.base
// dep: geo.polygons
gapp.register("kiri-mode.cam.export", [], (root, exports) => {
let KIRI = self.kiri,
BASE = self.base,
POLY = BASE.polygons,
UTIL = BASE.util,
CAM = KIRI.driver.CAM,
PRO = CAM.process;
const { base, kiri } = root;
const { polygons, util } = base;
const { driver } = kiri;
const { CAM } = driver;
const POLY = polygons;
const PRO = CAM.process;
/**
* @returns {Array} gcode lines
*/
CAM.export = function(print, online) {
let widget = print.widgets[0];
const widget = print.widgets[0];
if (!widget) return;
const { settings } = print;
const { device, tools } = settings;
let i,
time = 0,
lines = 0,
@ -26,22 +32,18 @@
factor = 1,
output = [],
spindle = 0,
settings = print.settings,
device = settings.device,
gcodes = settings.device || {},
origin = settings.origin || { x: 0, y: 0, z: 0 },
tools = settings.tools,
space = gcodes.gcodeSpace ? ' ' : '',
space = device.gcodeSpace ? ' ' : '',
isRML = device.gcodeFExt.toLowerCase() === 'rml',
stripComments = gcodes.gcodeStrip || false,
cmdToolChange = gcodes.gcodeChange || [ "M6 T{tool}" ],
cmdSpindle = gcodes.gcodeSpindle || [ "M3 S{speed}" ],
cmdDwell = gcodes.gcodeDwell || [ "G4 P{time}" ],
stripComments = device.gcodeStrip || false,
cmdToolChange = device.gcodeChange || [ "M6 T{tool}" ],
cmdSpindle = device.gcodeSpindle || [ "M3 S{speed}" ],
cmdDwell = device.gcodeDwell || [ "G4 P{time}" ],
dev = settings.device,
spro = settings.process,
maxZd = spro.camFastFeedZ,
maxXYd = spro.camFastFeed,
decimals = BASE.config.gcode_decimals || 4,
decimals = base.config.gcode_decimals || 4,
pos = { x:null, y:null, z:null, f:null, t:null },
line,
cidx,
@ -149,9 +151,9 @@
return;
}
newpos.x = UTIL.round(newpos.x, decimals);
newpos.y = UTIL.round(newpos.y, decimals);
newpos.z = UTIL.round(newpos.z, decimals);
newpos.x = util.round(newpos.x, decimals);
newpos.y = util.round(newpos.y, decimals);
newpos.z = util.round(newpos.z, decimals);
// on tool change
if (out.tool != pos.t) {
@ -241,7 +243,7 @@
section('header');
if (!stripComments) {
append(`; Generated by Kiri:Moto ${KIRI.version}`);
append(`; Generated by Kiri:Moto ${kiri.version}`);
append(`; ${new Date().toString()}`);
filterEmit(["; Bed left:{left} right:{right} top:{top} bottom:{bottom}"], consts);
if (hasStock) {
@ -290,7 +292,7 @@
}
// emit gcode preamble
filterEmit(gcodes.gcodePre, consts);
filterEmit(device.gcodePre, consts);
// emit all points in layer/point order
print.output.forEach(function (layerout) {
@ -320,7 +322,7 @@
// emit gcode post
section('footer');
filterEmit(gcodes.gcodePost, consts);
filterEmit(device.gcodePost, consts);
// flush buffered gcode
append();
@ -331,4 +333,4 @@
print.bounds = runbox;
};
})();
});

View file

@ -2,17 +2,20 @@
"use strict";
(function() {
// dep: geo.base
// dep: geo.paths
// dep: geo.point
// dep: geo.polygons
// dep: kiri.slice
gapp.register("kiri-mode.cam.ops", [], (root, exports) => {
let KIRI = self.kiri,
BASE = self.base,
UTIL = BASE.util,
CAM = KIRI.driver.CAM,
PRO = CAM.process,
POLY = BASE.polygons,
newSlice = KIRI.newSlice,
newPoint = BASE.newPoint,
newPolygon = BASE.newPolygon;
const { base, kiri } = root;
const { paths, polygons, newPoint, newPolygon } = base;
const { poly2polyEmit, tip2tipEmit } = paths;
const { driver, newSlice } = kiri;
const { CAM } = driver;
const POLY = polygons;
class CamOp {
constructor(state, op) {
@ -320,7 +323,7 @@
prepare(ops, progress) {
let { op, state, sliceOut, camFaces } = this;
let { setTool, setSpindle, setPrintPoint } = ops;
let { polyEmit, poly2polyEmit, depthRoughPath } = ops;
let { polyEmit, depthRoughPath } = ops;
let { camOut, newLayer, printPoint } = ops;
let { settings, widget } = state;
let { process, controller } = settings;
@ -467,7 +470,7 @@
// extend cut thru (only when z bottom is 0)
if (zThru) {
let last = slices[slices.length-1];
for (let zneg of BASE.util.lerp(0, zThru, op.down)) {
for (let zneg of base.util.lerp(0, zThru, op.down)) {
let add = last.clone(true);
add.tops.forEach(top => top.poly.setZ(add.z));
add.shadow = last.shadow.clone(true);
@ -566,7 +569,7 @@
prepare(ops, progress) {
let { op, state, sliceOut } = this;
let { setTool, setSpindle, setPrintPoint } = ops;
let { polyEmit, poly2polyEmit, depthOutlinePath } = ops;
let { polyEmit, depthOutlinePath } = ops;
let { camOut, newLayer, printPoint } = ops;
let { settings, widget } = state;
let { process, controller } = settings;
@ -662,7 +665,7 @@
prepare(ops, progress) {
let { op, state, sliceOut } = this;
let { setTolerance, setTool, setSpindle, setPrintPoint } = ops;
let { polyEmit, poly2polyEmit, tip2tipEmit } = ops;
let { polyEmit } = ops;
let { camOut, newLayer, printPoint, lastPoint } = ops;
let { bounds, zmax } = ops;
let { settings, widget } = state;
@ -732,7 +735,6 @@
let { settings, widget, sliceAll, zMax, zTop, zThru, tabs } = state;
let { updateToolDiams, cutTabs, cutPolys, healPolys } = state;
let { process, stock } = settings;
let poly2polyEmit = BASE.util.poly2polyEmit;
// generate tracing offsets from chosen features
let sliceOut = this.sliceOut = [];
let areas = op.areas[widget.id] || [];
@ -776,7 +778,7 @@
.addPolys(slice.camLines)
}
function clearZ(polys, z, down) {
let zs = down ? BASE.util.lerp(zTop, z, down) : [ z ];
let zs = down ? base.util.lerp(zTop, z, down) : [ z ];
let nested = POLY.nest(polys);
for (let poly of nested) {
for (let z of zs) {
@ -881,7 +883,7 @@
if (zThru && similar(zto,0)) {
zto -= zThru;
}
for (let z of BASE.util.lerp(zTop, zto, down)) {
for (let z of base.util.lerp(zTop, zto, down)) {
followZ(pi.clone().setZ(z));
}
} else {
@ -1089,7 +1091,7 @@
tv = -tv;
}
}
for (let z of BASE.util.lerp(z1, z2, op.down)) {
for (let z of base.util.lerp(z1, z2, op.down)) {
let slice = newSlice(z);
sliceAll.push(slice);
sliceOut.push(slice);
@ -1163,7 +1165,7 @@
slice(progress) {
let { widget, sliceAll } = this.state;
let slicer = new KIRI.cam_slicer(widget.getPoints(), {
let slicer = new kiri.cam_slicer(widget.getPoints(), {
zlist: true,
zline: true
});
@ -1344,4 +1346,4 @@
"flip": CamOp
};
})();
});

View file

@ -2,15 +2,18 @@
"use strict";
(function() {
// dep: geo.paths
// dep: geo.point
// dep: geo.polygons
gapp.register("kiri-mode.cam.prepare", [], (root, exports) => {
let KIRI = self.kiri,
BASE = self.base,
POLY = BASE.polygons,
PATH = BASE.paths,
CAM = KIRI.driver.CAM,
{ newPoint } = BASE,
{ tip2tipEmit, poly2polyEmit } = PATH;
const { base, kiri } = root;
const { paths, polygons, newPoint } = base;
const { tip2tipEmit, poly2polyEmit } = paths;
const { driver } = kiri;
const { CAM } = driver;
const POLY = polygons;
/**
* DRIVER PRINT CONTRACT
@ -25,7 +28,7 @@
const count = widgets.length;
const weight = 1/count;
const print = self.worker.print = KIRI.newPrint(settings, widgets);
const print = self.worker.print = kiri.newPrint(settings, widgets);
print.output = [];
let point;
@ -35,7 +38,7 @@
});
});
print.render = KIRI.driver.FDM.prepareRender(print.output, (progress, layer) => {
print.render = kiri.driver.FDM.prepareRender(print.output, (progress, layer) => {
update(0.75 + progress * 0.25, "render", layer);
}, {
thin: true,
@ -551,4 +554,4 @@
return maxz;
}
})();
});

View file

@ -2,18 +2,19 @@
"use strict";
(function() {
// dep: geo.point
// dep: geo.polygons
// dep: kiri.slice
gapp.register("kiri-mode.cam.slice", [], (root, exports) => {
let KIRI = self.kiri,
BASE = self.base,
UTIL = BASE.util,
CAM = KIRI.driver.CAM,
OPS = CAM.OPS,
PRO = CAM.process,
POLY = BASE.polygons,
newSlice = KIRI.newSlice,
newPoint = BASE.newPoint,
newPolygon = BASE.newPolygon;
const { base, kiri } = root;
const { driver, newSlice } = kiri;
const { polygons, newPoint, newPolygon } = base;
const { CAM } = driver;
const { OPS } = CAM;
const PRO = CAM.process;
const POLY = polygons;
/**
* DRIVER SLICE CONTRACT
@ -93,7 +94,7 @@
}
let mark = Date.now();
let slicer = new KIRI.cam_slicer(widget.getPoints(), {
let slicer = new kiri.cam_slicer(widget.getPoints(), {
zlist: true,
zline: true
});
@ -208,11 +209,11 @@
let adiff = lastsl.angleDiff(nextsl, true);
let bdiff = ((adiff < 0 ? (180 - adiff) : (180 + adiff)) / 2) + 180;
if (isCW && adiff > 45) {
let newa = BASE.newSlopeFromAngle(lastsl.angle + bdiff);
let newa = base.newSlopeFromAngle(lastsl.angle + bdiff);
newpts.push(lastpt.projectOnSlope(newa, dist));
newpts.push(lastpt.clone());
} else if (!isCW && adiff < -45) {
let newa = BASE.newSlopeFromAngle(lastsl.angle - bdiff);
let newa = base.newSlopeFromAngle(lastsl.angle - bdiff);
newpts.push(lastpt.projectOnSlope(newa, dist));
newpts.push(lastpt.clone());
}
@ -233,7 +234,7 @@
// do no work if cached
return false;
}
let slicer = new KIRI.cam_slicer(widget.getPoints(), {
let slicer = new kiri.cam_slicer(widget.getPoints(), {
zlist: true,
zline: true
});
@ -256,7 +257,7 @@
}
}
} else
BASE.polygons.flatten(data.tops,null,true).forEach(poly => {
base.polygons.flatten(data.tops,null,true).forEach(poly => {
poly.inner = null;
poly.parent = null;
let z = poly.getZ();
@ -352,4 +353,4 @@
return noff;
}
})();
});

View file

@ -5,15 +5,13 @@
/**
* Slicing engine used by CAM
*/
(function() {
gapp.register("kiri-mode.cam.slicer", [], (root, exports) => {
let KIRI = self.kiri,
BASE = self.base,
CONF = BASE.config,
UTIL = BASE.util,
POLY = BASE.polygons,
newSlice = KIRI.newSlice,
newOrderedLine = BASE.newOrderedLine;
const { base, kiri } = root;
const { config, util, polygons, newOrderedLine } = base;
const { newSlice } = kiri;
const POLY = polygons;
class Slicer {
constructor(points, options) {
@ -92,7 +90,7 @@
if (p1.z === p2.z && p2.z === p3.z) {
// detect zFlat faces to avoid slicing directly on them
let zkey = p1.z.toFixed(5),
area = Math.abs(UTIL.area2(p1,p2,p3)) / 2;
area = Math.abs(util.area2(p1,p2,p3)) / 2;
if (!zFlat[zkey]) {
zFlat[zkey] = area;
} else {
@ -165,7 +163,7 @@
// if Z is supplied as an array, iterate and collect
if (Array.isArray(z)) {
const mark = UTIL.time();
const mark = util.time();
const rarr = [];
z.forEach((zv,zi) => {
const data = this.slice(zv, opt, zi, z.length, mark);
@ -177,7 +175,7 @@
}
let znorm = z.toFixed(5),
flatoff = UTIL.numOrDefault(opt.flatoff, 0.01),
flatoff = util.numOrDefault(opt.flatoff, 0.01),
onflat = this.zFlat[znorm],
edges = opt.edges || false,
over = opt.over || false,
@ -258,7 +256,7 @@
const hastops = !opt.genso || opt.notopok || (retn.tops && retn.tops.length) || edges;
if (opt.each && haslines && hastops) {
opt.each(retn, index, total, UTIL.time() - mark);
opt.each(retn, index, total, util.time() - mark);
}
return haslines && hastops ? retn : null;
@ -411,7 +409,7 @@
*/
function checkOverUnderOn(p, z, where) {
let delta = p.z - z;
if (Math.abs(delta) < CONF.precision_slice_z) { // on
if (Math.abs(delta) < config.precision_slice_z) { // on
where.on.push(p);
} else if (delta < 0) { // under
where.under.push(p);
@ -485,14 +483,14 @@
*/
function connectLines(input, opt = {}, debug) {
// map points to all other points they're connected to
let CONF = BASE.config,
let config = base.config,
pmap = {},
points = [],
output = [],
connect = [],
search = 1,
nextMod = 1,
bridge = CONF.bridgeLineGapDistance,
bridge = config.bridgeLineGapDistance,
minPoly = opt.openok ? 2 : 3,
p1, p2;
@ -611,7 +609,7 @@
// it gets more complicated with multiple possible output paths
if (closed > 1 && open === 0) {
// add polygon to path (for area sorting)
paths.forEach(function(path) { path.poly = BASE.newPolygon().addPoints(path) });
paths.forEach(function(path) { path.poly = base.newPolygon().addPoints(path) });
// sort descending by area VS (length below -- better in most cases)
// paths.sort(function(a,b) { return b.poly.area() - a.poly.area() });
@ -633,7 +631,7 @@
if (longest.open) {
connect.push(longest);
} else {
emit(BASE.newPolygon().addPoints(longest));
emit(base.newPolygon().addPoints(longest));
}
}
}
@ -685,7 +683,7 @@
if (!bridge) {
if (opt.openok) {
emit(BASE.newPolygon().addPoints(array).setOpen());
emit(base.newPolygon().addPoints(array).setOpen());
}
continue;
}
@ -722,15 +720,15 @@
merged++;
// tail meets head (closed)
if (close(array[0], last)) {
emit(BASE.newPolygon().addPoints(array));
emit(base.newPolygon().addPoints(array));
break loop;
}
} else {
// no more closest polys (open set)
if (opt.openok) {
emit(BASE.newPolygon().addPoints(array).setOpen());
emit(base.newPolygon().addPoints(array).setOpen());
} else {
emit(BASE.newPolygon().addPoints(array));
emit(base.newPolygon().addPoints(array));
}
break loop;
}
@ -804,7 +802,7 @@
// find new endpoints that are not shared point
let p1 = l1.p1 != point ? l1.p1 : l1.p2,
p2 = l2.p1 != point ? l2.p1 : l2.p2,
newline = BASE.newOrderedLine(p1,p2);
newline = base.newOrderedLine(p1,p2);
// remove deleted lines from associated points
p1.group.remove(l1);
p1.group.remove(l2);
@ -845,6 +843,6 @@
Slicer.checkOverUnderOn = checkOverUnderOn;
Slicer.intersectPoints = intersectPoints;
self.kiri.cam_slicer = Slicer;
kiri.cam_slicer = Slicer;
})();
});

View file

@ -2,13 +2,13 @@
"use strict";
(function() {
gapp.register("kiri-mode.cam.tools", [], (root, exports) => {
let KIRI = self.kiri,
BASE = self.base,
UTIL = BASE.util,
HPI = Math.PI/2,
CAM = KIRI.driver.CAM;
const { kiri } = root;
const { driver } = kiri;
const { CAM } = driver;
const HPI = Math.PI/2;
class Tool {
constructor(settings, id, number) {
@ -128,8 +128,9 @@
}
CAM.Tool = Tool;
CAM.getToolDiameter = function(settings, id) {
return new CAM.Tool(settings, id).fluteDiameter();
};
})();
});

View file

@ -2,19 +2,16 @@
"use strict";
(function() {
gapp.register("kiri-mode.cam.tools", [], (root, exports) => {
let KIRI = self.kiri,
BASE = self.base,
CAM = KIRI.driver.CAM,
PRO = CAM.process,
POLY = BASE.polygons,
RAD2DEG = 180 / Math.PI,
newSlice = KIRI.newSlice,
newLine = BASE.newLine,
newSlope = BASE.newSlope,
newPoint = BASE.newPoint,
newPolygon = BASE.newPolygon;
const { base, kiri } = root;
const { driver, newSlice } = kiri;
const { CAM } = driver;
const { polygons, newLine, newSlope, newPoint, newPolygon } = base;
const PRO = CAM.process;
const POLY = polygons;
const RAD2DEG = 180 / Math.PI;
class Topo {
constructor(opt = {}) {
@ -384,7 +381,7 @@
ondone(newslices);
}
let slicer = new KIRI.cam_slicer(widget.getPoints(), {
let slicer = new kiri.cam_slicer(widget.getPoints(), {
swapX: true, emptyok: true, notopok: true
});
let sindex = slicer.interval(resolution);
@ -402,4 +399,4 @@
CAM.Topo = Topo;
})();
});