restructure code, internalize devices

This commit is contained in:
Stewart Allen 2020-06-03 22:39:30 -04:00
commit 02feb524e6
110 changed files with 592 additions and 681 deletions

284
app.js
View file

@ -8,7 +8,7 @@ const fs = require('fs');
const uglify = require('uglify-es');
const moment = require('moment');
const agent = require('express-useragent');
const license = require_fresh('./js/license.js');
const license = require_fresh('./src/license.js');
const version = license.VERSION || "rogue";
const fileCache = {};
@ -16,12 +16,7 @@ const code_src = {};
const code = {};
const mods = {};
const load = [];
const device = {
fdm: [],
sla: [],
cam: [],
laser: []
};
const synth = {};
let level;
let cacheDir;
@ -68,9 +63,8 @@ function init(mod) {
[ "/data/", handleData ],
[ "/wasm/", handleWasm ]
]));
mod.add(fixedmap("/api/", api));
if (debug) {
mod.static("/js/", "js");
mod.static("/src/", "src");
mod.static("/mod/", "mod");
mod.sync("/reload", () => {
mod.reload();
@ -122,7 +116,7 @@ function loadModule(mod, dir) {
function initModule(mod, file, dir) {
logger.log({module: file});
require_fresh(file)({
api: api,
api: {},
adm: {
reload: prepareScripts
},
@ -208,139 +202,122 @@ function initModule(mod, file, dir) {
});
}
const api = {
"filters-fdm": (req, res, next) => {
res.setHeader("Content-Type", "application/javascript");
res.end(JSON.stringify(device.fdm));
},
"filters-sla": (req, res, next) => {
res.setHeader("Content-Type", "application/javascript");
res.end(JSON.stringify(device.sla));
},
"filters-cam": (req, res, next) => {
res.setHeader("Content-Type", "application/javascript");
res.end(JSON.stringify(device.cam));
},
"filters-laser": (req, res, next) => {
res.setHeader("Content-Type", "application/javascript");
res.end(JSON.stringify(device.laser));
}
};
const script = {
kiri : [
"ext-three",
"license",
"ext-clip2",
"ext-tween",
"ext-fsave",
"ext-earcut",
"add-array",
"add-three",
"geo",
"geo-debug",
"geo-render",
"geo-point",
"geo-slope",
"geo-line",
"geo-bounds",
"geo-polygon",
"geo-polygons",
"geo-gyroid",
"moto-kv",
"moto-ajax",
"moto-ctrl",
"moto-space",
"moto-load-stl",
"moto-db",
"moto-ui",
"kiri-icons",
"kiri-lang",
"kiri-lang-en",
"kiri-fill",
"kiri-db",
"kiri-slice",
"kiri-slicer",
"kiri-driver-fdm",
"kiri-driver-sla",
"kiri-driver-cam",
"kiri-driver-laser",
"kiri-pack",
"kiri-layer",
"kiri-widget",
"kiri-print",
"kiri-codec",
"kiri-work",
"kiri-conf",
"kiri",
"kiri-init",
"kiri-export"
].map(p => `js/${p}.js`),
"ext/three",
"license",
"ext/clip2",
"ext/tween",
"ext/fsave",
"ext/earcut",
"add/array",
"add/three",
"geo/base",
"geo/debug",
"geo/render",
"geo/point",
"geo/slope",
"geo/line",
"geo/bounds",
"geo/polygon",
"geo/polygons",
"geo/gyroid",
"moto/kv",
"moto/ajax",
"moto/ctrl",
"moto/pack",
"moto/space",
"moto/load-stl",
"moto/db",
"moto/ui",
"kiri/icons",
"kiri/lang",
"kiri/lang-en",
"kiri/fill",
"kiri/db",
"kiri/slice",
"kiri/slicer",
"mode/fdm/driver",
"mode/sla/driver",
"mode/cam/driver",
"mode/laser/driver",
"kiri/layer",
"kiri/widget",
"kiri/print",
"kiri/codec",
"kiri/work",
"kiri/conf",
"kiri/main",
"kiri/init",
"kiri/export",
"@devices"
].map(p => p.charAt(0) !== '@' ? `src/${p}.js` : p),
work : [
"ext-three",
"ext-pngjs",
"kiri",
"ext/three",
"ext/pngjs",
"license",
"ext-clip2",
"add-array",
"add-three",
"add-class",
"geo",
// "geo-wasm",
"geo-debug",
"geo-point",
"geo-slope",
"geo-line",
"geo-bounds",
"geo-polygon",
"geo-polygons",
"geo-gyroid",
"kiri-fill",
"kiri-slice",
"kiri-slicer",
"kiri-driver-fdm",
"kiri-driver-sla",
"kiri-driver-cam",
"kiri-driver-laser",
"kiri-pack",
"kiri-widget",
"kiri-print",
"kiri-codec"
].map(p => `js/${p}.js`),
"ext/clip2",
"add/array",
"add/three",
"add/class",
"geo/base",
// "geo/wasm",
"geo/debug",
"geo/point",
"geo/slope",
"geo/line",
"geo/bounds",
"geo/polygon",
"geo/polygons",
"geo/gyroid",
"moto/pack",
"kiri/fill",
"kiri/slice",
"kiri/slicer",
"mode/fdm/driver",
"mode/sla/driver",
"mode/cam/driver",
"mode/laser/driver",
"kiri/widget",
"kiri/print",
"kiri/codec"
].map(p => `src/${p}.js`),
worker : [
"kiri-worker"
].map(p => `js/${p}.js`),
meta : [
"ext-three",
"kiri",
"license",
"ext-tween",
"ext-fsave",
"ext-earcut",
"add-array",
"add-three",
"geo",
"geo-debug",
"geo-render",
"geo-point",
"geo-slope",
"geo-line",
"geo-bounds",
"geo-polygon",
"geo-polygons",
"geo-gyroid",
"kiri-layer",
"moto-kv",
"moto-ajax",
"moto-ctrl",
"moto-space",
"moto-load-stl",
"moto-db",
"moto-ui",
"kiri-db",
"kiri/worker"
].map(p => `src/${p}.js`),
meta : [
"ext/three",
"license",
"ext/tween",
"ext/fsave",
"ext/earcut",
"add/array",
"add/three",
"geo/base",
"geo/debug",
"geo/render",
"geo/point",
"geo/slope",
"geo/line",
"geo/bounds",
"geo/polygon",
"geo/polygons",
"geo/gyroid",
"kiri/layer",
"moto/kv",
"moto/ajax",
"moto/ctrl",
"moto/space",
"moto/load-stl",
"moto/db",
"moto/ui",
"kiri/db",
"meta"
].map(p => `js/${p}.js`)
].map(p => `src/${p}.js`)
};
const db = {
@ -619,22 +596,19 @@ function serveCode(req, res, code) {
}
function prepareScripts() {
let root = `${dir}/src/dev`;
let devs = {};
fs.readdirSync(root).forEach(type => {
let map = devs[type] = devs[type] || {};
fs.readdirSync(`${root}/${type}`).forEach(device => {
map[device] = JSON.parse(fs.readFileSync(`${root}/${type}/${device}`));
});
});
synth.devices = `devices = ${JSON.stringify(devs)};`;
code.meta = concatCode(script.meta);
code.kiri = concatCode(script.kiri);
code.work = concatCode(script.work);
code.worker = concatCode(script.worker);
fs.readdir(dir + "/web/kiri/filter/FDM", function(err, files) {
device.fdm = files || device.fdm;
});
fs.readdir(dir + "/web/kiri/filter/SLA", function(err, files) {
device.sla = files || device.sla;
});
fs.readdir(dir + "/web/kiri/filter/CAM", function(err, files) {
device.cam = files || device.cam;
});
fs.readdir(dir + "/web/kiri/filter/LASER", function(err, files) {
device.laser = files || device.laser;
});
}
function concatCode(array) {
@ -643,11 +617,10 @@ function concatCode(array) {
// in debug mode, the script should load dependent
// scripts instead of serving a complete bundle
if (debug) {
let direct = array.filter(f => f.charAt(0) !== '@');
let inject = array.filter(f => f.charAt(0) === '@').map(f => f.substring(1));
let code = [ `(function() { let load = [ `];
array.forEach(file => {
// if (file.indexOf(":\\") > 0) {
// file = `/${file}`;
// }
direct.forEach(file => {
code.push(`"/${file.replace(/\\/g,'/')}?${version}",`);
});
code.push([
@ -663,16 +636,23 @@ function concatCode(array) {
'}; load_next(); })();',
'self.debug=true;'
].join('\n'));
inject.forEach(key => {
code.push(synth[key]);
});
return code.join('\n');
}
array.forEach(file => {
direct.forEach(file => {
let cached = getCachedFile(file, function(path) {
return minify(`${dir}/${file}`);
});
code.push(cached);
});
inject.forEach(key => {
code.push(synth[key]);
});
return code.join('');
}

View file

@ -1 +0,0 @@
../node_modules/earcut/src/earcut.js

View file

@ -1 +0,0 @@
../node_modules/three/build/three.min.js

View file

@ -1 +0,0 @@
../node_modules/tween.js/index.js

View file

@ -1 +0,0 @@
../web/kiri/lang/en.js

View file

@ -1,7 +0,0 @@
var exports = {
COPYRIGHT:"Copyright (C) Stewart Allen <sa@grid.space> - All Rights Reserved",
LICENSE:"See the license.md file included with the source distribution",
VERSION:"3.0.0-dev"
};
if (!module) var module = {};
module.exports = exports;

View file

@ -29,6 +29,7 @@
* `F` determine start point from gcode preamble
* `F` trim support offset from layer below
* `F` option to support interior bridges when 0% infill
* `F` calculate filament use per extruder per print
* `P` refactor thin fill to use outline and inside poly normal dist to self
* `P` segment large polygons for extremely large parts / infill
* `P` implement infill clipping in wasm

View file

@ -12,11 +12,11 @@
"tool-change":[
"M6 T{tool} ; change tool to '{tool_name}'"
],
"dwell":[
"G4 P{time} ; dwell for {time}ms"
],
"settings": {
"bed_width": 400,
"bed_depth": 400
}
"dwell":[
"G4 P{time} ; dwell for {time}ms"
],
"settings": {
"bed_width": 400,
"bed_depth": 400
}
}

View file

@ -5,20 +5,20 @@
"pre":[
"G21 ; set units to MM (required)",
"G90 ; absolute position mode (required)",
"M03 S20000 ; spindle on"
"M03 S20000 ; spindle on"
],
"post":[
"M05 ; spindle off",
"M05 ; spindle off",
"M30 ; program end"
],
"tool-change":[
"M6 T{tool} ; change tool to '{tool_name}'"
],
"dwell":[
"G4 P{time} ; dwell for {time}ms"
],
"settings": {
"bed_width": 400,
"bed_depth": 400
}
"dwell":[
"G4 P{time} ; dwell for {time}ms"
],
"settings": {
"bed_width": 400,
"bed_depth": 400
}
}

View file

@ -12,11 +12,11 @@
"tool-change":[
"M6 T{tool} ; change tool to '{tool_name}'"
],
"dwell":[
"G4 P{time} ; dwell for {time}ms"
],
"settings": {
"bed_width": 200,
"bed_depth": 200
}
"dwell":[
"G4 P{time} ; dwell for {time}ms"
],
"settings": {
"bed_width": 200,
"bed_depth": 200
}
}

1
src/ext/earcut.js Symbolic link
View file

@ -0,0 +1 @@
../../node_modules/earcut/src/earcut.js

1
src/ext/three.js Symbolic link
View file

@ -0,0 +1 @@
../../node_modules/three/build/three.min.js

1
src/ext/tween.js Symbolic link
View file

@ -0,0 +1 @@
../../node_modules/tween.js/index.js

View file

@ -1,22 +1,19 @@
/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
var gs_base = exports;
(function() {
if (!self.base) self.base = {};
if (self.base.util) return;
if (self.base) return;
var BASE = self.base,
const BASE = self.base = {},
round_decimal_precision = 8;
/** ******************************************************************
* Utility Functions
******************************************************************* */
function time() { return new Date().getTime() }
function time() { return Date.now() }
/**
* call function with all combinations of a1, a2
@ -29,7 +26,7 @@ var gs_base = exports;
* @returns {Object}
*/
function doCombinations(a1, a2, arg, fn) {
var i, j;
let i, j;
for (i = 0; i < a1.length; i++) {
for (j = (a1 === a2 ? i + 1 : 0); j < a2.length; j++) {
fn(a1[i], a2[j], arg);
@ -151,7 +148,7 @@ var gs_base = exports;
* @returns {boolean}
*/
function inRange(value, min, max) {
var val = parseFloat(value);
let val = parseFloat(value);
return val >= min && val <= max;
}
@ -162,7 +159,7 @@ var gs_base = exports;
* @returns {number}
*/
function round(v, zeros) {
var pow = Math.pow(10,zeros || round_decimal_precision);
let pow = Math.pow(10,zeros || round_decimal_precision);
return Math.round(v * pow) / pow;
}
@ -178,7 +175,7 @@ var gs_base = exports;
* @returns {?Point | String}
*/
function intersect(p1, p2, p3, p4, test, parallelok) {
var keys = BASE.key,
let keys = BASE.key,
p1x = p1.x,
p1y = p1.y,
p2x = p2.x,
@ -199,7 +196,7 @@ var gs_base = exports;
return test && !parallelok ? null : keys.PARALLEL;
}
var a = p1y - p3y, // origin dy
let a = p1y - p3y, // origin dy
b = p1x - p3x, // origin dx
n1 = (d2x * a) - (d2y * b),
n2 = (d1x * a) - (d1y * b);
@ -207,7 +204,7 @@ var gs_base = exports;
a = n1 / d; // roughly distance from l1 origin to l2 intersection
b = n2 / d; // roughly distance from l2 origin to l1 intersection
var ia = a >= -0.0001 && a <= 1.0001,
let ia = a >= -0.0001 && a <= 1.0001,
ib = b >= -0.0001 && b <= 1.0001,
segint = (ia && ib),
rayint = (a >= 0 && b >= 0);
@ -215,7 +212,7 @@ var gs_base = exports;
if (test === keys.SEGINT && !segint) return null;
if (test === keys.RAYINT && !rayint) return null;
var ip = BASE.newPoint(
let ip = BASE.newPoint(
p1x + (a * d1x), // x
p1y + (a * d1y), // y
p3.z || p4.z, // z
@ -240,7 +237,7 @@ var gs_base = exports;
* @returns {?Point}
*/
function intersectRayLine(ro, s1, p1, p2, infinite) {
var keys = BASE.key,
let keys = BASE.key,
p1x = ro.x,
p1y = ro.y,
s1x = s1.dx,
@ -253,7 +250,7 @@ var gs_base = exports;
s2y = p4y - p3y,
d = (s2y * s1x) - (s2x * s1y);
var a = p1y - p3y,
let a = p1y - p3y,
b = p1x - p3x,
n1 = (s2x * a) - (s2y * b),
n2 = (s1x * a) - (s1y * b);
@ -267,7 +264,7 @@ var gs_base = exports;
b = n2 / d;
if (infinite || (inCloseRange(b,0,1) && a >= 0)) {
var ip = BASE.newPoint(
let ip = BASE.newPoint(
p1x + (a * s1x),
p1y + (a * s1y),
p2.z || ro.z,
@ -289,7 +286,7 @@ var gs_base = exports;
* @returns {number}
*/
function determinant(p1, p2, p3, p4) {
var d1x = (p2.x - p1.x),
let d1x = (p2.x - p1.x),
d1y = (p2.y - p1.y),
d2x = (p4.x - p3.x),
d2y = (p4.y - p3.y);

View file

@ -2,11 +2,8 @@
"use strict";
var gs_base_bounds = exports;
(function() {
if (!self.base) self.base = {};
if (self.base.Bounds) return;
/**
@ -21,12 +18,9 @@ var gs_base_bounds = exports;
this.leftMost = null;
}
var BASE = self.base,
const BASE = self.base,
UTIL = BASE.util,
CONF = BASE.config,
ABS = Math.abs,
MIN = Math.min,
MAX = Math.max,
PRO = Bounds.prototype;
BASE.Bounds = Bounds;
@ -40,7 +34,7 @@ var gs_base_bounds = exports;
* @returns {Bounds}
*/
PRO.clone = function() {
var b = new Bounds();
let b = new Bounds();
b.minx = this.minx;
b.miny = this.miny;
b.maxx = this.maxx;
@ -60,20 +54,20 @@ var gs_base_bounds = exports;
* @param {Bounds} b
*/
PRO.merge = function(b) {
this.minx = MIN(this.minx, b.minx);
this.maxx = MAX(this.maxx, b.maxx);
this.miny = MIN(this.miny, b.miny);
this.maxy = MAX(this.maxy, b.maxy);
this.minx = Math.min(this.minx, b.minx);
this.maxx = Math.max(this.maxx, b.maxx);
this.miny = Math.min(this.miny, b.miny);
this.maxy = Math.max(this.maxy, b.maxy);
};
/**
* @param {Point} p
*/
PRO.update = function(p) {
this.minx = MIN(this.minx, p.x);
this.maxx = MAX(this.maxx, p.x);
this.miny = MIN(this.miny, p.y);
this.maxy = MAX(this.maxy, p.y);
this.minx = Math.min(this.minx, p.x);
this.maxx = Math.max(this.maxx, p.x);
this.miny = Math.min(this.miny, p.y);
this.maxy = Math.max(this.maxy, p.y);
if (this.minx === p.x) this.leftMost = p;
};
@ -109,8 +103,8 @@ var gs_base_bounds = exports;
*/
PRO.overlaps = function(b, precision) {
return (
ABS(this.centerx() - b.centerx()) * 2 - precision < this.width() + b.width() &&
ABS(this.centery() - b.centery()) * 2 - precision < this.height() + b.height()
Math.abs(this.centerx() - b.centerx()) * 2 - precision < this.width() + b.width() &&
Math.abs(this.centery() - b.centery()) * 2 - precision < this.height() + b.height()
);
};

View file

@ -2,21 +2,19 @@
"use strict";
var gs_base_debug = exports;
(function() {
if (!self.base) self.base = {};
if (self.base.debug) return;
var base = self.base,
enabled = false,
const base = self.base,
flags = {},
stash = [],
size = 20,
next_debug_color = 0,
debug_colors = [0xff0000, 0x00ff00, 0x0000ff, 0x00ffff, 0xff00ff, 0xffff00];
let size = 20,
enabled = false,
next_debug_color = 0;
/** ******************************************************************
* Debug Functions
******************************************************************* */
@ -69,7 +67,7 @@ var gs_base_debug = exports;
function set(f, value) {
if (Array.isArray(f)) {
for (var i=0; i<f.length; i++) flags[f[i]] = (value || 1);
for (let i=0; i<f.length; i++) flags[f[i]] = (value || 1);
} else {
flags[f] = (value || 1);
}
@ -77,14 +75,14 @@ var gs_base_debug = exports;
function clear(f) {
if (Array.isArray(f)) {
for (var i = 0; i < f.length; i++) delete flags[f[i]];
for (let i = 0; i < f.length; i++) delete flags[f[i]];
} else {
delete flags[f];
}
}
function test(isSet, isNotSet) {
var i;
let i;
if (isNotSet) {
if (Array.isArray(isNotSet)) {
for (i=0; i<isNotSet.length; i++) {
@ -154,7 +152,7 @@ var gs_base_debug = exports;
* @param {boolean} [creep]
*/
function xray(poly, z, v, deep, creep) {
var colors = [
let colors = [
0xaa0000,
0x0,
0xaaaa00,

View file

@ -1,16 +1,13 @@
/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */
/** Copyright Stewart Allen -- All Rights Reserved */
"use strict";
var gs_base_gyroid = exports;
(function() {
if (!self.base) self.base = {};
if (self.base.gyroid) return;
var base = self.base;
let PI2 = Math.PI * 2;
const base = self.base,
PI2 = Math.PI * 2;
/**
* @param off {number} z offset value from 0-1

View file

@ -1,14 +1,17 @@
/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
var gs_base_line = exports;
(function() {
if (!self.base) self.base = {};
if (self.base.Line) return;
const BASE = self.base, PRO = Line.prototype;
BASE.Line = Line;
BASE.newLine = newLine;
BASE.newOrderedLine = newOrderedLine;
/**
*
* @param {Point} p1
@ -26,13 +29,6 @@ var gs_base_line = exports;
this.del = false;
}
var BASE = self.base,
PRO = Line.prototype;
BASE.Line = Line;
BASE.newLine = newLine;
BASE.newOrderedLine = newOrderedLine;
/** ******************************************************************
* Line Prototype Functions
******************************************************************* */
@ -62,7 +58,7 @@ var gs_base_line = exports;
* @returns {Line}
*/
PRO.reverse = function() {
var t = this.p1;
let t = this.p1;
this.p1 = this.p2;
this.p2 = t;
return this;
@ -80,7 +76,7 @@ var gs_base_line = exports;
* @returns {boolean}
*/
PRO.isCollinear = function(line) {
var p1 = this.p1,
let p1 = this.p1,
p2 = this.p2,
p3 = line.p1,
p4 = line.p2,

View file

@ -1,14 +1,21 @@
/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
var gs_base_point = exports;
(function() {
if (!self.base) self.base = {};
if (self.base.Point) return;
const BASE = self.base,
UTIL = BASE.util,
CONF = BASE.config,
KEYS = BASE.key,
ROUND = UTIL.round,
PRO = Point.prototype;
BASE.Point = Point;
BASE.newPoint = newPoint;
/**
*
* @param {number} x
@ -44,16 +51,6 @@ var gs_base_point = exports;
this.group = null; // for grouping in slice intersect, offset lines in trace
}
var BASE = self.base,
UTIL = BASE.util,
CONF = BASE.config,
KEYS = BASE.key,
ROUND = UTIL.round,
PRO = Point.prototype;
BASE.Point = Point;
BASE.newPoint = newPoint;
/** ******************************************************************
* Point Prototype Functions
******************************************************************* */
@ -64,14 +61,14 @@ var gs_base_point = exports;
}
PRO.swapXZ = function() {
var p = this,
let p = this,
t = p.x;
p.x = p.z;
p.z = t;
};
PRO.swapYZ = function() {
var p = this,
let p = this,
t = p.y;
p.y = p.z;
p.z = t;
@ -163,10 +160,10 @@ var gs_base_point = exports;
* @returns {number}
*/
PRO.distToLineSq = function(p1, p2) {
var p = this,
let p = this,
d = UTIL.distSq(p1, p2);
var t = ((p.x - p1.x) * (p2.x - p1.x) + (p.y - p1.y) * (p2.y - p1.y)) / d;
let t = ((p.x - p1.x) * (p2.x - p1.x) + (p.y - p1.y) * (p2.y - p1.y)) / d;
if (t < 0) return UTIL.distSq(p, p1);
if (t > 1) return UTIL.distSq(p, p2);
@ -189,16 +186,16 @@ var gs_base_point = exports;
}
function p2l(p, l1, l2) {
var v = {x: l2.x - l1.x, y: l2.y - l1.y};
var w = {x: p.x - l1.x, y: p.y - l1.y};
var c1 = dot(w, v);
var c2 = dot(v, v);
var b = c1 / c2;
let v = {x: l2.x - l1.x, y: l2.y - l1.y};
let w = {x: p.x - l1.x, y: p.y - l1.y};
let c1 = dot(w, v);
let c2 = dot(v, v);
let b = c1 / c2;
if (isNaN(b)) {
// console.log('nan', {p, l1, l2, v, w, c1, c2});
b = 0;
}
var pb = {x: l1.x + b * v.x, y: l1.y + b * v.y};
let pb = {x: l1.x + b * v.x, y: l1.y + b * v.y};
return d(p, pb);
}
@ -212,7 +209,7 @@ var gs_base_point = exports;
* @returns {boolean}
*/
PRO.withinDist2 = function(p1, p2, dist2) {
var ll2 = p1.distToSq2D(p2),
let ll2 = p1.distToSq2D(p2),
dp1 = this.distToSq2D(p1),
dp2 = this.distToSq2D(p2);
// if the line segment described is less than dist2
@ -277,7 +274,7 @@ var gs_base_point = exports;
* @param dist
*/
PRO.offsetPointFrom = function(p2, dist) {
var p1 = this,
let p1 = this,
dx = p2.x - p1.x,
dy = p2.y - p1.y,
ls = dist / Math.sqrt(dx * dx + dy * dy),
@ -313,7 +310,7 @@ var gs_base_point = exports;
* @returns {Line}
*/
PRO.offsetLineTo = function(p2, offset) {
var p1 = this,
let p1 = this,
dx = p2.x - p1.x,
dy = p2.y - p1.y,
ls = offset / Math.sqrt(dx * dx + dy * dy),
@ -340,7 +337,7 @@ var gs_base_point = exports;
PRO.inPolygon = function(poly) {
if (!poly.bounds.containsXY(this.x, this.y)) return false;
var p = poly.points, pl = p.length, p1, p2, i, inside = false;
let p = poly.points, pl = p.length, p1, p2, i, inside = false;
for (i=0; i<pl; i++) {
p1 = p[i];
@ -363,14 +360,14 @@ var gs_base_point = exports;
* @return {boolean} true if inside outer but not inner
*/
PRO.isInPolygon = function(poly) {
var point = this, i;
let point = this, i;
if (Array.isArray(poly)) {
for (i=0; i<poly.length; i++) {
if (point.isInPolygon(poly[i])) return true;
}
return false;
}
var holes = poly.inner;
let holes = poly.inner;
if (point.inPolygon(poly) || point.nearPolygon(poly, CONF.precision_merge_sq)) {
for (i=0; holes && i < holes.length; i++) {
if (point.inPolygon(holes[i]) && !point.nearPolygon(holes[i], CONF.precision_merge_sq)) return false;
@ -388,14 +385,14 @@ var gs_base_point = exports;
* @return {boolean} true if inside outer but not inner
*/
PRO.isInPolygonOnly = function(poly) {
var point = this, i;
let point = this, i;
if (Array.isArray(poly)) {
for (i=0; i<poly.length; i++) {
if (point.isInPolygonOnly(poly[i])) return true;
}
return false;
}
var holes = poly.inner;
let holes = poly.inner;
if (point.inPolygon(poly)) {
for (i=0; holes && i < holes.length; i++) {
if (point.inPolygon(holes[i])) return false;
@ -415,13 +412,13 @@ var gs_base_point = exports;
*/
PRO.nearPolygon = function(poly, dist2, inner) {
// throw new Error("nearPolygon");
for (var i=0, p=poly.points, pl=p.length ; i<pl; i++) {
for (let i=0, p=poly.points, pl=p.length ; i<pl; i++) {
if (this.withinDist2(p[i], p[(i+1)%pl], dist2)) {
return true;
}
}
if (inner && poly.inner) {
for (var i=0; i<poly.inner.length; i++) {
for (let i=0; i<poly.inner.length; i++) {
if (this.nearPolygon(poly.inner[i], dist2)) return true;
}
}
@ -449,7 +446,7 @@ var gs_base_point = exports;
* @returns {Point}
*/
PRO.follow = function(slope, distance) {
var ls = distance / Math.sqrt(slope.dx * slope.dx + slope.dy * slope.dy);
let ls = distance / Math.sqrt(slope.dx * slope.dx + slope.dy * slope.dy);
return newPoint(this.x + slope.dx * ls, this.y + slope.dy * ls, this.z);
};
@ -461,7 +458,7 @@ var gs_base_point = exports;
* @returns {Point}
*/
PRO.intersectZ = function(p, z) {
var dx = p.x - this.x,
let dx = p.x - this.x,
dy = p.y - this.y,
dz = p.z - this.z,
pct = 1 - ((p.z - z) / dz);
@ -525,7 +522,7 @@ var gs_base_point = exports;
* @param {number} [threshold] stop looking if under threshold
*/
PRO.distToPolySegments = function(poly, threshold) {
var point = this,
let point = this,
mindist = Infinity;
poly.forEachSegment(function(p1, p2) {
const nextdist = Math.min(mindist, point.distToLine(p1, p2));
@ -541,7 +538,7 @@ var gs_base_point = exports;
* @param {number} [threshold] stop looking if under threshold
*/
PRO.distToPolyPoints = function(poly, threshold) {
var point = this, mindist = Infinity;
let point = this, mindist = Infinity;
poly.forEachPoint(function(pp) {
mindist = Math.min(mindist, point.distTo2D(pp));
if (mindist < threshold) return true;
@ -556,7 +553,7 @@ var gs_base_point = exports;
*/
PRO.nearestTo = function(points, max) {
if (!max) throw "missing max";
var mind = Infinity,
let mind = Infinity,
minp = null,
i, p, d;
for (i=0; i<points.length; i++) {
@ -576,7 +573,7 @@ var gs_base_point = exports;
* @return {number} average square dist to cloud of points
*/
PRO.averageDistTo = function(points) {
var sum = 0.0, count = 0, i;
let sum = 0.0, count = 0, i;
for (i = 0; i < points.length; i++) {
if (points[i] != this) {
sum += this.distToSq2D(points[i]);
@ -593,7 +590,7 @@ var gs_base_point = exports;
* @returns {number}
*/
PRO.distTo2D = function(p) {
var dx = this.x - p.x,
let dx = this.x - p.x,
dy = this.y - p.y;
return Math.sqrt(dx * dx + dy * dy);
};
@ -605,13 +602,13 @@ var gs_base_point = exports;
* @returns {number}
*/
PRO.distToSq2D = function(p) {
var dx = this.x - p.x,
let dx = this.x - p.x,
dy = this.y - p.y;
return dx * dx + dy * dy;
};
PRO.distTo3D = function(p) {
var dx = this.x - p.x,
let dx = this.x - p.x,
dy = this.y - p.y,
dz = this.z - p.z;
return Math.sqrt(dx * dx + dy * dy + dz * dz);
@ -624,7 +621,7 @@ var gs_base_point = exports;
* @returns {number}
*/
PRO.distToSq3D = function(p) {
var dx = this.x - p.x,
let dx = this.x - p.x,
dy = this.y - p.y,
dz = this.z - p.z;
return dx * dx + dy * dy + dz * dz;
@ -639,7 +636,7 @@ var gs_base_point = exports;
* @returns {boolean}
*/
PRO.inTriangle = function(a, b, c) {
var as_x = this.x - a.x,
let as_x = this.x - a.x,
as_y = this.y - a.y,
s_ab = (b.x - a.x) * as_y - (b.y - a.y) * as_x > 0;
if ((c.x - a.x) * as_y - (c.y - a.y) * as_x > 0 == s_ab) return false;

View file

@ -1,15 +1,12 @@
/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
var gs_base_polygon = exports;
(function() {
if (!self.base) self.base = {};
if (self.base.Polygon) return;
var BASE = self.base,
const BASE = self.base,
CONF = BASE.config,
UTIL = BASE.util,
DBUG = BASE.debug,
@ -21,12 +18,11 @@ var gs_base_polygon = exports;
MAX = Math.max,
PI = Math.PI,
DEG2RAD = PI / 180,
Bounds = BASE.Bounds,
newPoint = BASE.newPoint,
PRO = Polygon.prototype,
nest_test_slope = BASE.newSlope(newPoint(0,0,0,KEYS.NONE), newPoint(1,0,0,KEYS.NONE)),
min_area_mult = 2.0,
seqid = 1;
Bounds = BASE.Bounds,
PRO = Polygon.prototype;
let seqid = 1;
BASE.Polygon = Polygon;
BASE.newPolygon = newPolygon;
@ -97,9 +93,9 @@ var gs_base_polygon = exports;
Polygon.filterChain = function(filters) {
return function() {
var f = filters;
let f = filters;
return function(p) {
var len = f.length,
let len = f.length,
idx = 0;
while (idx < len && (p = f[idx++](p)))
;
@ -213,8 +209,8 @@ var gs_base_polygon = exports;
PRO.createConvexHull = function(points) {
function removeMiddle(a, b, c) {
var cross = (a.x - b.x) * (c.y - b.y) - (a.y - b.y) * (c.x - b.x);
var dot = (a.x - b.x) * (c.x - b.x) + (a.y - b.y) * (c.y - b.y);
let cross = (a.x - b.x) * (c.y - b.y) - (a.y - b.y) * (c.x - b.x);
let dot = (a.x - b.x) * (c.x - b.x) + (a.y - b.y) * (c.y - b.y);
return cross < 0 || cross == 0 && dot <= 0;
}
@ -222,11 +218,11 @@ var gs_base_polygon = exports;
return a.x != b.x ? a.x - b.x : a.y - b.y;
});
var n = points.length;
var hull = [];
let n = points.length;
let hull = [];
for (var i = 0; i < 2 * n; i++) {
var j = i < n ? i : 2 * n - 1 - i;
for (let i = 0; i < 2 * n; i++) {
let j = i < n ? i : 2 * n - 1 - i;
while (hull.length >= 2 && removeMiddle(hull[hull.length - 2], hull[hull.length - 1], points[j]))
hull.pop();
hull.push(points[j]);
@ -239,7 +235,7 @@ var gs_base_polygon = exports;
};
PRO.stepsFromRoot = function() {
var p = this.parent, steps = 0;
let p = this.parent, steps = 0;
while (p) {
if (p.inner && p.inner.length > 1) steps++;
p = p.parent;
@ -256,11 +252,11 @@ var gs_base_polygon = exports;
};
PRO.swap = function(x,y) {
var poly = this,
let poly = this,
points = poly.points,
length = points.length;
poly.bounds = new Bounds();
for (var i=0; i<length; i++) {
for (let i=0; i<length; i++) {
let p = points[i];
if (x) p.swapXZ();
else if (y) p.swapYZ();
@ -291,7 +287,7 @@ var gs_base_polygon = exports;
* @returns {Polygon|Point} a new polygon centered on x=0, y=0, z=0
*/
PRO.center = function(point) {
var ap = newPoint(0,0,0,null), np = newPolygon(), pa = this.points;
let ap = newPoint(0,0,0,null), np = newPolygon(), pa = this.points;
pa.forEach(function(p) {
ap.x += p.x;
ap.y += p.y;
@ -315,7 +311,7 @@ var gs_base_polygon = exports;
* @returns {Point} center of a polygon assuming it's a circle
*/
PRO.circleCenter = function() {
var points = this.points,
let points = this.points,
length = points.length,
incr = Math.floor(length / 3),
A = points[0],
@ -387,7 +383,7 @@ var gs_base_polygon = exports;
* @param {boolean} clockwise
*/
PRO.centerCircle = function(center, radius, points, clockwise) {
var angle = 0, add = 360 / points;
let angle = 0, add = 360 / points;
if (clockwise) add = -add;
while (points-- > 0) {
this.push(newPoint(
@ -406,7 +402,7 @@ var gs_base_polygon = exports;
* @returns {Polygon}
*/
PRO.move = function(offset) {
var scope = this,
let scope = this,
bounds = scope.bounds = new Bounds();
scope.points.forEach(function(p) {
p.move(offset);
@ -417,7 +413,7 @@ var gs_base_polygon = exports;
};
PRO.scale = function(scale, round) {
var scope = this,
let scope = this,
bounds = scope.bounds = new Bounds();
scope.points.forEach(function(p) {
p.x *= scale;
@ -437,7 +433,7 @@ var gs_base_polygon = exports;
* hint fill angle hinting from longest segment
*/
PRO.hintFillAngle = function() {
var index = 0,
let index = 0,
points = this.points,
length = points.length,
prev,
@ -471,7 +467,7 @@ var gs_base_polygon = exports;
* @returns {Polygon}
*/
PRO.clone = function(deep) {
var np = newPolygon(),
let np = newPolygon(),
ln = this.length,
i = 0;
@ -495,7 +491,7 @@ var gs_base_polygon = exports;
* @returns {Polygon} this
*/
PRO.setZ = function(z) {
var ar = this.points,
let ar = this.points,
ln = ar.length,
i = 0;
while (i < ln) ar[i++].z = z;
@ -545,7 +541,7 @@ var gs_base_polygon = exports;
* @returns {Polygon}
*/
PRO.addPoints = function(points) {
var poly = this,
let poly = this,
length = points.length,
i = 0;
while (i < length) {
@ -667,7 +663,7 @@ var gs_base_polygon = exports;
*/
PRO.isNested = function(parent) {
if (parent.bounds.contains(this.bounds)) {
//var int = POLY().rayIntersect(this.bounds.leftMost, nest_test_slope, [parent], false);
//let int = POLY().rayIntersect(this.bounds.leftMost, nest_test_slope, [parent], false);
//return int.length % 2 === 1 || this.isInside(parent, CONF.precision_nested_sq);
return this.isInside(parent, CONF.precision_nested_sq);
}
@ -675,7 +671,7 @@ var gs_base_polygon = exports;
};
PRO.forEachPointEaseDown = function(fn, fromPoint) {
var index = this.findClosestPointTo(fromPoint).index,
let index = this.findClosestPointTo(fromPoint).index,
fromZ = fromPoint.z,
offset = 0,
points = this.points,
@ -690,7 +686,7 @@ var gs_base_polygon = exports;
while (true) {
next = points[index % length];
if (last && next.z < fromZ) {
var deltaZ = fromZ - next.z;
let deltaZ = fromZ - next.z;
dist2next = last.distTo2D(next);
if (dist2next > deltaZ * 2) {
// too long: synth intermediate
@ -716,7 +712,7 @@ var gs_base_polygon = exports;
};
PRO.forEachPoint = function(fn, close, start) {
var index = start || 0,
let index = start || 0,
points = this.points,
length = points.length,
count = close ? length + 1 : length,
@ -731,7 +727,7 @@ var gs_base_polygon = exports;
};
PRO.forEachSegment = function(fn, open, start) {
var index = start || 0,
let index = start || 0,
points = this.points,
length = points.length,
count = open ? length - 1 : length,
@ -749,9 +745,9 @@ var gs_base_polygon = exports;
* returns intersections sorted by closest to lp1
*/
PRO.intersections = function(lp1, lp2) {
var list = [];
let list = [];
this.forEachSegment(function(pp1, pp2, ip1, ip2) {
var int = UTIL.intersect(lp1, lp2, pp1, pp2, BASE.key.SEGINT, false);
let int = UTIL.intersect(lp1, lp2, pp1, pp2, BASE.key.SEGINT, false);
if (int) {
list.push(int);
pp1.pos = ip1;
@ -771,9 +767,9 @@ var gs_base_polygon = exports;
PRO.bisect = function(p1, p2) {
if (this.isOpen()) return null;
var copy = this.clone().setClockwise();
let copy = this.clone().setClockwise();
var int = copy.intersections(p1, p2);
let int = copy.intersections(p1, p2);
if (!int || int.length !== 2) return null;
return [ copy.emitSegment(int[0], int[1]), copy.emitSegment(int[1], int[0]).reverse() ];
@ -784,7 +780,7 @@ var gs_base_polygon = exports;
* used in cam tabs and fdm output perimeter traces on infill
*/
PRO.emitSegment = function(i1, i2) {
var poly = newPolygon(),
let poly = newPolygon(),
start = i1.p2.pos,
end = i2.p1.pos;
poly.setOpen();
@ -805,7 +801,7 @@ var gs_base_polygon = exports;
PRO.hasPointsInside = function(poly, tolerance) {
if (!poly.overlaps(this)) return false;
var mid, exit = false;
let mid, exit = false;
this.forEachSegment(function(prev, next) {
// check midpoint on long lines
@ -837,7 +833,7 @@ var gs_base_polygon = exports;
this.bounds.isNested(poly.bounds)
)) return false;
var mid,
let mid,
midcheck,
exit = true;
@ -875,7 +871,7 @@ var gs_base_polygon = exports;
*/
PRO.containedBySet = function(polys) {
if (!polys) return false;
for (var i=0; i<polys.length; i++) {
for (let i=0; i<polys.length; i++) {
if (polys[i].contains(this)) return true;
}
return false;
@ -919,7 +915,7 @@ var gs_base_polygon = exports;
};
PRO.newUndeleted = function() {
var poly = newPolygon();
let poly = newPolygon();
this.forEachPoint(function(p) {
if (!p.del) poly.push(p);
});
@ -946,7 +942,7 @@ var gs_base_polygon = exports;
return this.perim;
}
var len = 0.0;
let len = 0.0;
this.forEachSegment(function(prev,next) {
len += SQRT(prev.distToSq2D(next));
@ -956,7 +952,7 @@ var gs_base_polygon = exports;
};
PRO.perimeterDeep = function() {
var len = this.perimeter();
let len = this.perimeter();
if (this.inner) this.inner.forEach(function(p) { len += p.perimeter() });
return len;
};
@ -972,7 +968,7 @@ var gs_base_polygon = exports;
PRO.area = function(raw) {
if (this.length < 3) return 0;
if (this.area2 === 0.0) {
for (var p=this.points,pl=p.length,pi=0,p1,p2; pi<pl; pi++) {
for (let p=this.points,pl=p.length,pi=0,p1,p2; pi<pl; pi++) {
p1 = p[pi];
p2 = p[(pi+1)%pl];
this.area2 += (p2.x - p1.x) * (p2.y + p1.y);
@ -989,7 +985,7 @@ var gs_base_polygon = exports;
*/
PRO.areaDeep = function() {
if (!this.inner) return this.area();
var i, c = this.inner, a = this.area();
let i, c = this.inner, a = this.area();
for (i=0; i<c.length; i++) {
a -= c[i].area();
}
@ -1011,7 +1007,7 @@ var gs_base_polygon = exports;
* @param {number} [z]
*/
PRO.fromXYArray = function(arr,z) {
var i = 0;
let i = 0;
while (i < arr.length) {
this.add(arr[i++], arr[i++], z || 0);
}
@ -1019,7 +1015,7 @@ var gs_base_polygon = exports;
};
function fromClipperPath(path,z) {
var poly = newPolygon(), i = 0, l = path.length;
let poly = newPolygon(), i = 0, l = path.length;
while (i < l) poly.push(newPoint(null,null,z,null,path[i++]));
return poly;
};
@ -1042,11 +1038,11 @@ var gs_base_polygon = exports;
};
PRO.toClipper = function(inout,debug) {
var poly = this,
let poly = this,
cur = [],
out = inout || [];
if (debug) {
var d = [],
let d = [],
points = poly.points,
len = points.length,
i = 0,
@ -1101,14 +1097,14 @@ var gs_base_polygon = exports;
this.bounds.equals(poly.bounds, precision || CONF.precision_poly_bounds))
{
// use circularity near 1 to eliminate the extensive check below
var c1 = this.circularity(),
let c1 = this.circularity(),
c2 = poly.circularity();
if (ABS(c1-c2) < CONF.precision_circularity && ((1-c1) < CONF.precision_circularity)) {
return true;
}
if (recurse) {
var i, ai = this.inner, bi = poly.inner;
let i, ai = this.inner, bi = poly.inner;
if (ai !== bi) {
if (ai === null || bi === null || ai.length != bi.length) return false;
for (i=0; i < ai.length; i++) {
@ -1117,7 +1113,7 @@ var gs_base_polygon = exports;
}
}
var exit = true,
let exit = true,
pointok,
dist,
min;
@ -1153,7 +1149,7 @@ var gs_base_polygon = exports;
* @return {Object} {point:point, distance:distance}
*/
PRO.findClosestPointTo = function(target) {
var dist,
let dist,
index,
closest,
mindist = Infinity;
@ -1181,7 +1177,7 @@ var gs_base_polygon = exports;
};
PRO.shortestSegmentLength = function() {
var len = Infinity;
let len = Infinity;
this.forEachSegment(function(p1, p2) {
len = Math.min(len, p1.distTo2D(p2));
});
@ -1193,7 +1189,7 @@ var gs_base_polygon = exports;
* @returns {?Polygon[]}
*/
PRO.diff = function(poly) {
var fillang = this.fillang && this.area() > poly.area() ? this.fillang : poly.fillang,
let fillang = this.fillang && this.area() > poly.area() ? this.fillang : poly.fillang,
clib = self.ClipperLib,
ctyp = clib.ClipType,
ptyp = clib.PolyType,
@ -1222,7 +1218,7 @@ var gs_base_polygon = exports;
* @returns {?Polygon[]}
*/
PRO.mask = function(poly) {
var fillang = this.fillang && this.area() > poly.area() ? this.fillang : poly.fillang,
let fillang = this.fillang && this.area() > poly.area() ? this.fillang : poly.fillang,
clib = self.ClipperLib,
ctyp = clib.ClipType,
ptyp = clib.PolyType,
@ -1287,7 +1283,7 @@ var gs_base_polygon = exports;
PRO.union = function(poly, min) {
if (!this.overlaps(poly)) return null;
var fillang = this.fillang && this.area() > poly.area() ? this.fillang : poly.fillang,
let fillang = this.fillang && this.area() > poly.area() ? this.fillang : poly.fillang,
clib = self.ClipperLib,
ctyp = clib.ClipType,
ptyp = clib.PolyType,
@ -1318,7 +1314,7 @@ var gs_base_polygon = exports;
* furthest apart and lowest when there is a tie breaker
*/
PRO.spread = function() {
var poly = this,
let poly = this,
points = poly.points,
plen = points.length,
i, pp, np, p, mdelta, newmax, max, shift, maxd;

View file

@ -1,15 +1,13 @@
/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
var gs_base_polygons = exports;
(function() {
if (!self.base) self.base = {};
if (self.base.polygons) return;
var BASE = self.base,
const BASE = self.base,
UTIL = BASE.util,
CONF = BASE.config,
DEG2RAD = Math.PI / 180,
@ -48,13 +46,13 @@ var gs_base_polygons = exports;
******************************************************************* */
function toClipper(polys,debug) {
var out = [];
let out = [];
polys.forEach(function(poly) { poly.toClipper(out,debug) });
return out;
}
function fromClipperNode(tnode, z) {
var poly = BASE.newPolygon();
let poly = BASE.newPolygon();
tnode.m_polygon.forEach(function(p) {
poly.push(newPoint(null, null, z, null, p));
});
@ -63,7 +61,7 @@ var gs_base_polygons = exports;
};
function fromClipperTree(tnode, z, tops, parent, minarea) {
var polys = tops || [],
let polys = tops || [],
poly,
min = minarea || 0.1;
@ -108,7 +106,7 @@ var gs_base_polygons = exports;
};
function cleanClipperTree(tree) {
var clib = self.ClipperLib,
let clib = self.ClipperLib,
clip = clib.Clipper;
if (tree.m_Childs) tree.m_Childs.forEach(function(child) {
@ -151,7 +149,7 @@ var gs_base_polygons = exports;
polygons.sort(function (a, b) {
return a.area() - b.area();
});
var i, poly;
let i, poly;
// clear parent/child links if they exist
for (i = 0; i < polygons.length; i++) {
poly = polygons[i];
@ -162,8 +160,8 @@ var gs_base_polygons = exports;
for (i = 0; i < polygons.length - 1; i++) {
poly = polygons[i];
// find the smallest suitable parent
for (var j = i + 1; j < polygons.length; j++) {
var parent = polygons[j];
for (let j = i + 1; j < polygons.length; j++) {
let parent = polygons[j];
// prevent open polys from having inners
if (opentop && parent.isOpen()) continue;
if (poly.isNested(parent)) {
@ -173,7 +171,7 @@ var gs_base_polygons = exports;
}
}
// tops have an even # depth
var tops = [],
let tops = [],
p;
// assign a depth level to each group
for (i = 0; i < polygons.length; i++) {
@ -207,7 +205,7 @@ var gs_base_polygons = exports;
*/
function setWinding(array, CW, recurse) {
if (!array) return;
var poly, i = 0;
let poly, i = 0;
while (i < array.length) {
poly = array[i++];
if (poly.isClockwise() !== CW) poly.reverse();
@ -223,7 +221,7 @@ var gs_base_polygons = exports;
* @return {boolean} true if aligned clockwise
*/
function alignWindings(polys) {
var len = polys.length,
let len = polys.length,
fwd = 0,
pts = 0,
i = 0,
@ -244,7 +242,7 @@ var gs_base_polygons = exports;
}
function setContains(setA, poly) {
for (var i=0; i<setA.length; i++) {
for (let i=0; i<setA.length; i++) {
if (setA[i].contains(poly)) return true;
}
return false;
@ -272,7 +270,7 @@ var gs_base_polygons = exports;
* @returns {Polygon[]} out
*/
function subtract(setA, setB, outA, outB, z, minArea) {
var clib = self.ClipperLib,
let clib = self.ClipperLib,
ctyp = clib.ClipType,
ptyp = clib.PolyType,
cfil = clib.PolyFillType,
@ -333,7 +331,7 @@ var gs_base_polygons = exports;
function union(polys, minarea) {
if (polys.length < 2) return polys;
var out = polys.slice(), i, j, union, uset = [];
let out = polys.slice(), i, j, union, uset = [];
outer: for (i=0; i<out.length; i++) {
if (!out[i]) continue;
@ -361,7 +359,7 @@ var gs_base_polygons = exports;
* @returns {?Polygon[]}
*/
function doDiff(setA, setB, z) {
var clib = self.ClipperLib,
let clib = self.ClipperLib,
ctyp = clib.ClipType,
ptyp = clib.PolyType,
cfil = clib.PolyFillType,
@ -391,7 +389,7 @@ var gs_base_polygons = exports;
// handle null/empty slices
if (setA === setB || setA === null || setB === null) return null;
var out = [], tmp;
let out = [], tmp;
UTIL.doCombinations(setA, setB, {}, function(a, b) {
if (tmp = a.mask(b)) {
out.appendAll(tmp);
@ -402,7 +400,7 @@ var gs_base_polygons = exports;
}
function sumCirc(polys) {
var sum = 0.0;
let sum = 0.0;
polys.forEach(function(poly) {
sum += poly.circularityDeep();
});
@ -426,7 +424,7 @@ var gs_base_polygons = exports;
if (poly.inner) setWinding(poly.inner, !poly.isClockwise());
});
var fact = CONF.clipper,
let fact = CONF.clipper,
clib = self.ClipperLib,
clip = clib.Clipper,
cpft = clib.PolyFillType,
@ -437,8 +435,8 @@ var gs_base_polygons = exports;
circ = sumCirc(polys);
polys.forEach(function(poly) {
var clean = clip.CleanPolygons(poly.toClipper(), CONF.clipperClean);
var simple = clip.SimplifyPolygons(clean, cpft.pftNonZero);
let clean = clip.CleanPolygons(poly.toClipper(), CONF.clipperClean);
let simple = clip.SimplifyPolygons(clean, cpft.pftNonZero);
coff.AddPaths(simple, cjnt.jtMiter, cety.etClosedPolygon);
});
@ -476,7 +474,7 @@ var gs_base_polygons = exports;
if (poly.inner) setWinding(poly.inner, !poly.isClockwise());
});
var fact = CONF.clipper,
let fact = CONF.clipper,
clib = self.ClipperLib,
clip = clib.Clipper,
cpft = clib.PolyFillType,
@ -489,8 +487,8 @@ var gs_base_polygons = exports;
// inset
polys.forEach(function(poly) {
var clean = clip.CleanPolygons(poly.toClipper(), CONF.clipperClean);
var simple = clip.SimplifyPolygons(clean, cpft.pftNonZero);
let clean = clip.CleanPolygons(poly.toClipper(), CONF.clipperClean);
let simple = clip.SimplifyPolygons(clean, cpft.pftNonZero);
coff.AddPaths(simple, cjnt.jtMiter, cety.etClosedPolygon);
});
@ -501,8 +499,8 @@ var gs_base_polygons = exports;
coff = new clib.ClipperOffset();
ctre = new clib.PolyTree();
polys.forEach(function(poly) {
var clean = clip.CleanPolygons(poly.toClipper(), CONF.clipperClean);
var simple = clip.SimplifyPolygons(clean, cpft.pftNonZero);
let clean = clip.CleanPolygons(poly.toClipper(), CONF.clipperClean);
let simple = clip.SimplifyPolygons(clean, cpft.pftNonZero);
coff.AddPaths(simple, cjnt.jtMiter, cety.etClosedPolygon);
});
coff.Execute(ctre, -over * fact);
@ -510,7 +508,7 @@ var gs_base_polygons = exports;
// detect possible thin walls
if (thins) {
var circ1 = sumCirc(orig),
let circ1 = sumCirc(orig),
circ2 = sumCirc(polys),
diff = Math.abs(1 - (circ1 / circ2));
@ -545,7 +543,7 @@ var gs_base_polygons = exports;
}
// offset polygon to outer traces array
var calcoff = depth === 0 && last ? offset / 2 : offset,
let calcoff = depth === 0 && last ? offset / 2 : offset,
outer = poly.offset(calcoff, []),
inner = [],
j;
@ -563,7 +561,7 @@ var gs_base_polygons = exports;
});
}
var newouter = [], newinner = [];
let newouter = [], newinner = [];
subtract(outer, inner, newouter, newinner, poly.getZ());
if (newouter.length > 0) {
@ -596,7 +594,7 @@ var gs_base_polygons = exports;
function fillArea(polys, angle, spacing, output, minLen, maxLen) {
if (polys.length === 0) return;
var i = 1,
let i = 1,
p0 = polys[0],
zpos = p0.getZ(),
bounds = p0.bounds.clone(),
@ -616,7 +614,7 @@ var gs_base_polygons = exports;
while (i < polys.length) bounds.merge(polys[i++].bounds);
// ray stepping is an axis from the line perpendicular to the ray
var rayint = output || [],
let rayint = output || [],
stepX = -raySlope.dy,
stepY = raySlope.dx,
iterX = ABS(ABS(stepX) > 0 ? bounds.width() / stepX : 0),
@ -639,7 +637,7 @@ var gs_base_polygons = exports;
rayint.origin = newPoint(start.x, start.y, start.z);
for (i = 0; i < steps; i++) {
var p1 = newPoint(start.x - raySlope.dx * 1000, start.y - raySlope.dy * 1000, zpos, NOKEY),
let p1 = newPoint(start.x - raySlope.dx * 1000, start.y - raySlope.dy * 1000, zpos, NOKEY),
p2 = newPoint(start.x + raySlope.dx * 1000, start.y + raySlope.dy * 1000, zpos, NOKEY);
lines.push([p1,p2]);
@ -655,13 +653,13 @@ var gs_base_polygons = exports;
if (clip.Execute(ctyp.ctIntersection, ctre, cfil.pftNonZero, cfil.pftEvenOdd)) {
ctre.m_AllPolys.forEach(function(poly) {
if (minlen || maxlen) {
var plen = clib.JS.PerimeterOfPath(poly.m_polygon, false, 1);
let plen = clib.JS.PerimeterOfPath(poly.m_polygon, false, 1);
if (minlen && plen < minlen) return;
if (maxlen && plen > maxlen) return;
}
var p1 = newPoint(null,null,zpos,null,poly.m_polygon[0]);
var p2 = newPoint(null,null,zpos,null,poly.m_polygon[1]);
var od = rayint.origin.distToLineNew(p1,p2) / spacing;
let p1 = newPoint(null,null,zpos,null,poly.m_polygon[0]);
let p2 = newPoint(null,null,zpos,null,poly.m_polygon[1]);
let od = rayint.origin.distToLineNew(p1,p2) / spacing;
lines.push([p1, p2, od]);
});
}
@ -671,7 +669,7 @@ var gs_base_polygons = exports;
})
lines.forEach(function(line) {
var dist = Math.round(line[2]);
let dist = Math.round(line[2]);
line[0].index = dist;
line[1].index = dist;
rayint.push(line[0]);
@ -692,7 +690,7 @@ var gs_base_polygons = exports;
* @returns {Point[]}
*/
function rayIntersect(start, slope, polygons, for_fill) {
var i = 0,
let i = 0,
flat = [],
points = [],
conf = BASE.config,
@ -703,13 +701,13 @@ var gs_base_polygons = exports;
});
polygons = flat;
while (i < polygons.length) {
var polygon = polygons[i++],
let polygon = polygons[i++],
pp = polygon.points,
pl = pp.length,
dbug = BASE.debug,
debug = false;
for (var j = 0; j < pl; j++) {
var j2 = (j + 1) % pl,
for (let j = 0; j < pl; j++) {
let j2 = (j + 1) % pl,
ip = UTIL.intersectRayLine(start, slope, pp[j], pp[j2]);
if (ip) {
// add group object to point for cull detection
@ -732,12 +730,12 @@ var gs_base_polygons = exports;
}
}
if (points.length > 0) {
var del = false;
let del = false;
// sort on distance from ray origin
points.sort(function (p1, p2) {
// handle passing through line-common end points
if (!(p1.del || p2.del) && p1.isNear(p2, merge_dist)) {
var line = [];
let line = [];
if (!p1.isNear(p1.p1, merge_dist)) line.push(p1.p1);
if (!p1.isNear(p1.p2, merge_dist)) line.push(p1.p2);
if (!p2.isNear(p2.p1, merge_dist)) line.push(p2.p1);
@ -780,7 +778,7 @@ var gs_base_polygons = exports;
* ok = diff level (even-odd)
*/
if (for_fill) {
var p1, p2;
let p1, p2;
i = 0;
pl = points.length;
while (i < pl) {
@ -789,7 +787,7 @@ var gs_base_polygons = exports;
p2 = points[i++];
while (p2 && p2.del && i < pl) p2 = points[i++];
if (p1 && p2 && p1.group && p1.group) {
var p1g = p1.group,
let p1g = p1.group,
p2g = p2.group,
even = (p1g.depth % 2 === 0), // point is on an even depth group
same = (p1g === p2g); // points intersect same group
@ -803,7 +801,7 @@ var gs_base_polygons = exports;
//}
// check cull co-linear with group edge
if (same && p1.mod && p2.mod) {
var diff = ABS(p1.pos - p2.pos);
let diff = ABS(p1.pos - p2.pos);
if (diff === 1 || diff === p1.mod - 1) {
p1.del = true;
p2.del = true;
@ -817,9 +815,9 @@ var gs_base_polygons = exports;
}
// handle deletions, if found
if (del) {
var np = [];
let np = [];
for (i = 0; i < points.length; i++) {
var p = points[i];
let p = points[i];
if (!p.del) {
np.push(p);
}

View file

@ -1,17 +1,15 @@
/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
var gs_base_render = exports;
(function() {
if (!self.base) self.base = {};
if (self.base.render) return;
var BASE = self.base,
line_width = 1,
materialCache = {};
const BASE = self.base,
materialCache = {},
line_width = 1;
BASE.render = {
wireframe : wireframe
@ -32,11 +30,11 @@ var gs_base_render = exports;
*/
function wireframe(group, points, color) {
if (points.length % 3 != 0) throw "invalid line : "+points.length;
var lines = new THREE.Geometry(),
let lines = new THREE.Geometry(),
hash = {},
added = 0;
for (var i = 0; i < points.length; i += 3) {
var p1 = points[i],
for (let i = 0; i < points.length; i += 3) {
let p1 = points[i],
p2 = points[i + 1],
p3 = points[i + 2],
l1 = newOrderedLine(p1, p2),
@ -59,7 +57,7 @@ var gs_base_render = exports;
}
}
lines.verticesNeedUpdate = true;
var mesh = new THREE.LineSegments(lines, getMaterial(color));
let mesh = new THREE.LineSegments(lines, getMaterial(color));
group.add(mesh);
return mesh;
}
@ -73,7 +71,7 @@ var gs_base_render = exports;
* @returns {THREE.LineBasicMaterial}
*/
function getMaterial(color) {
var material = materialCache[color];
let material = materialCache[color];
if (!material) {
material = new THREE.LineBasicMaterial({
fog:false,

View file

@ -1,14 +1,27 @@
/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
var gs_base_slope = exports;
(function() {
if (!self.base) self.base = {};
if (self.base.Slope) return;
const BASE = self.base,
CONF = BASE.config,
ABS = Math.abs,
PRO = Slope.prototype,
DEG2RAD = Math.PI / 180,
RAD2DEG = 180 / Math.PI;
BASE.Slope = Slope;
BASE.newSlope = newSlope;
BASE.newSlopeFromAngle = function(angle) {
return newSlope(0,0,
Math.cos(angle * DEG2RAD),
Math.sin(angle * DEG2RAD)
);
};
/**
*
* @param p1
@ -23,23 +36,6 @@ var gs_base_slope = exports;
this.angle = Math.atan2(this.dy, this.dx) * RAD2DEG;
}
var BASE = self.base,
CONF = BASE.config,
ABS = Math.abs,
PRO = Slope.prototype,
DEG2RAD = Math.PI / 180,
RAD2DEG = 180 / Math.PI;
BASE.Slope = Slope;
BASE.newSlope = newSlope;
BASE.newSlopeFromAngle = function(angle) {
return newSlope(0,0,
Math.cos(angle * DEG2RAD),
Math.sin(angle * DEG2RAD)
);
};
/** ******************************************************************
* Slope Prototype Functions
******************************************************************* */
@ -57,7 +53,7 @@ var gs_base_slope = exports;
if (ABS(this.dx) <= CONF.precision_merge && ABS(s.dx) <= CONF.precision_merge) return true;
if (ABS(this.dy) <= CONF.precision_merge && ABS(s.dy) <= CONF.precision_merge) return true;
// check angle within a range
var prec = Math.min(1/Math.sqrt(this.dx * this.dx + this.dy * this.dy), CONF.precision_slope_merge);
let prec = Math.min(1/Math.sqrt(this.dx * this.dx + this.dy * this.dy), CONF.precision_slope_merge);
return angleWithinDelta(this.angle, s.angle, prec || CONF.precision_slope);
};
@ -67,7 +63,7 @@ var gs_base_slope = exports;
* @returns {Slope}
*/
PRO.normal = function() {
var t = this.dx;
let t = this.dx;
this.dx = -this.dy;
this.dy = t;
this.angle = Math.atan2(this.dy, this.dx) * RAD2DEG;
@ -75,7 +71,7 @@ var gs_base_slope = exports;
};
PRO.toUnit = function() {
var max = Math.max(ABS(this.dx), ABS(this.dy));
let max = Math.max(ABS(this.dx), ABS(this.dy));
this.dx = this.dx / max;
this.dy = this.dy / max;
return this;

View file

@ -1,10 +1,9 @@
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
var gs_wasm = exports;
// only active in workers
if (!self.window)
(function() {
if (!self.window) (function() {
if (!self.geo) self.geo = {};

11
src/kiri.js Normal file
View file

@ -0,0 +1,11 @@
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
(function () {
if (self.kiri) return;
self.kiri = { };
})();

View file

@ -1,19 +1,14 @@
/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
var gs_kiri_codec = exports;
(function() {
if (!self.kiri) self.kiri = {};
if (self.kiri.codec) return;
var base = self.base,
kiri = self.kiri,
handlers = {};
const BASE = self.base, KIRI = self.kiri, handlers = {};
kiri.codec = {
KIRI.codec = {
encode: encode,
decode: decode,
registerDecoder: registerDecoder
@ -24,7 +19,7 @@ var gs_kiri_codec = exports;
if (o === null) return null;
if (o === undefined) return undefined;
if (Array.isArray(o)) {
var arr = new Array(o.length), i=0;
let arr = new Array(o.length), i=0;
while (i < o.length) arr[i] = encode(o[i++], state);
return arr;
}
@ -44,7 +39,7 @@ var gs_kiri_codec = exports;
if (o === null) return null;
if (o === undefined) return undefined;
if (Array.isArray(o)) {
for (var i=0; i < o.length; i++) o[i] = decode(o[i],state);
for (let i=0; i < o.length; i++) o[i] = decode(o[i],state);
return o;
}
switch (typeof(o)) {
@ -64,8 +59,8 @@ var gs_kiri_codec = exports;
function genOEncode(o, state) {
if (o instanceof Float32Array) return o;
var out = {};
for (var k in o) {
let out = {};
for (let k in o) {
if (o.hasOwnProperty(k)) out[k] = encode(o[k], state);
}
return out;
@ -73,8 +68,8 @@ var gs_kiri_codec = exports;
function genODecode(o, state) {
if (o instanceof Float32Array) return o;
var out = {};
for (var k in o) {
let out = {};
for (let k in o) {
if (o.hasOwnProperty(k)) out[k] = decode(o[k], state);
}
return out;
@ -84,7 +79,7 @@ var gs_kiri_codec = exports;
* Object CODEC Functions
******************************************************************* */
kiri.Slice.prototype.encode = function(state) {
KIRI.Slice.prototype.encode = function(state) {
return {
type: 'slice',
z: this.z,
@ -100,7 +95,7 @@ var gs_kiri_codec = exports;
};
registerDecoder('slice', function(v, state) {
var slice = kiri.newSlice(v.z, state.mesh ? state.mesh.newGroup() : null);
let slice = KIRI.newSlice(v.z, state.mesh ? state.mesh.newGroup() : null);
slice.index = v.index;
slice.camMode = v.camMode;
@ -114,7 +109,7 @@ var gs_kiri_codec = exports;
return slice;
});
kiri.Top.prototype.encode = function(state) {
KIRI.Top.prototype.encode = function(state) {
return {
type: 'top',
poly: encode(this.poly, state),
@ -129,7 +124,7 @@ var gs_kiri_codec = exports;
};
registerDecoder('top', function(v, state) {
var top = kiri.newTop(decode(v.poly, state));
let top = KIRI.newTop(decode(v.poly, state));
top.traces = decode(v.traces, state);
top.inner = decode(v.inner, state);
@ -145,7 +140,7 @@ var gs_kiri_codec = exports;
function encodePointArray(points, state) {
if (!points) return null;
var array = new Float32Array(points.length * 3),
let array = new Float32Array(points.length * 3),
pos = 0;
points.forEach(function(point) {
@ -174,21 +169,21 @@ var gs_kiri_codec = exports;
function decodePointArray(array) {
if (!array) return null;
var vid = 0,
let vid = 0,
pid = 0,
points = new Array(array.length/3);
while (vid < array.length) {
points[pid++] = base.newPoint(array[vid++], array[vid++], array[vid++]);
points[pid++] = BASE.newPoint(array[vid++], array[vid++], array[vid++]);
}
return points;
}
base.Polygon.prototype.encode = function(state) {
BASE.Polygon.prototype.encode = function(state) {
if (!state.poly) state.poly = {};
var cached = state.poly[this.id];
let cached = state.poly[this.id];
if (cached) {
return {
@ -216,11 +211,11 @@ var gs_kiri_codec = exports;
if (v.ref) return state.poly[v.ref];
var poly = base.newPolygon(),
let poly = BASE.newPolygon(),
vid = 0;
while (vid < v.array.length) {
poly.push(base.newPoint(v.array[vid++], v.array[vid++], v.array[vid++]));
poly.push(BASE.newPoint(v.array[vid++], v.array[vid++], v.array[vid++]));
}
poly.id = v.id;

View file

@ -1,17 +1,12 @@
/** Copyright Stewart Allen -- All Rights Reserved */
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
let gs_kiri_conf = exports;
(function() {
if (!self.kiri) self.kiri = {};
if (self.kiri.conf) return;
let KIRI = self.kiri,
CVER = 185,
clone = Object.clone;
const KIRI = self.kiri, CVER = 185, clone = Object.clone;
function genID() {
while (true) {

View file

@ -1,18 +1,16 @@
/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
var gs_kiri_db = exports;
(function() {
if (!self.kiri) self.kiri = { };
const KIRI = self.kiri, DP = Catalog.prototype;
/**
* @constructor
*/
function Catalog(motodb, decimate) {
var store = this;
let store = this;
store.db = motodb;
store.files = {};
store.listeners = [];
@ -21,15 +19,12 @@ var gs_kiri_db = exports;
store.refresh();
}
var kiri = self.kiri,
DP = Catalog.prototype;
kiri.openCatalog = function(motodb,decimate) {
KIRI.openCatalog = function(motodb,decimate) {
return new Catalog(motodb,decimate);
};
DP.refresh = function() {
var store = this;
let store = this;
store.db.get('files', function(files) {
if (files) {
store.files = files;
@ -39,7 +34,7 @@ var gs_kiri_db = exports;
};
DP.wipe = function() {
var key, files = this.files;
let key, files = this.files;
for (key in files) {
if (files.hasOwnProperty(key)) this.deleteFile(key);
}
@ -66,14 +61,14 @@ var gs_kiri_db = exports;
}
function notifyFileListeners(store) {
for (var i=0; i<store.listeners.length; i++) {
for (let i=0; i<store.listeners.length; i++) {
store.listeners[i](store.files);
}
}
DP.decimate = function(vertices, callback) {
if (vertices.length < 500000) return callback(vertices);
kiri.work.decimate(vertices, function(reply) {
KIRI.work.decimate(vertices, function(reply) {
callback(reply);
});
};
@ -96,7 +91,7 @@ var gs_kiri_db = exports;
* @param {Function} [callback]
*/
DP.putFile = function(name, vertices, callback) {
var store = this;
let store = this;
store.db.put('file-'+name, vertices, function(ok) {
if (ok) {
store.files[name] = {
@ -119,7 +114,7 @@ var gs_kiri_db = exports;
* @param {Function} callback
*/
DP.getFile = function(name, callback) {
var store = this,
let store = this,
rec = store.files[name];
if (rec && rec.deferred) {
if (store.deferredHandler) return store.deferredHandler(rec.deferred, name, callback);
@ -152,7 +147,7 @@ var gs_kiri_db = exports;
* @param {Function} callback
*/
DP.deleteFile = function(name, callback) {
var store = this;
let store = this;
if (store.files[name]) {
delete store.files[name];
store.db.remove('fdec-'+name);

View file

@ -1,26 +1,24 @@
/** Copyright Stewart Allen -- All Rights Reserved */
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
let gs_kiri_export = exports;
(function() {
if (!self.kiri) self.kiri = { };
if (self.kiri.export) return;
let KIRI = self.kiri,
const KIRI = self.kiri,
BASE = self.base,
UTIL = BASE.util,
API = KIRI.api,
SDB = API.sdb,
UI = API.ui,
STATS = API.stats,
MODES = API.const.MODES,
printSeq = parseInt(SDB['kiri-print-seq'] || SDB['print-seq'] || "0") + 1;
MODES = API.const.MODES;
KIRI.export = exportPrint;
let printSeq = parseInt(SDB['kiri-print-seq'] || SDB['print-seq'] || "0") + 1;
function exportPrint() {
let currentPrint = API.print.get();
if (currentPrint) {

View file

@ -1,15 +1,12 @@
/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
var gs_kiri_fill = exports;
(function() {
if (!self.kiri) self.kiri = {};
if (self.kiri.fill) return;
let KIRI = self.kiri,
const KIRI = self.kiri,
BASE = self.base,
UTIL = BASE.util,
ROUND = UTIL.round,

View file

@ -1,10 +1,9 @@
"use strict";
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
let gs_kiri_ico = exports;
"use strict";
(function() {
if (!self.kiri) self.kiri = { };
if (!self.kiri.icon) self.kiri.icons = {
fdm:atob('PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCBtZWV0IiB2aWV3Qm94PSIwIDAgMTcwIDE3MCIgd2lkdGg9Ijc1cHgiIGhlaWdodD0iNzVweCI+PGRlZnM+PHBhdGggZD0iTTE1IDM4LjMzQzE1IDM4LjMzIDE1IDM4LjMzIDE1IDM4LjMzQzE1IDI1LjQ1IDI1LjQ1IDE1IDM4LjMzIDE1QzQ0LjU2IDE1IDc1LjY3IDE1IDEzMS42NyAxNUMxMzEuNjcgMTUgMTMxLjY3IDE1IDEzMS42NyAxNUMxMzcuODUgMTUgMTQzLjc5IDE3LjQ2IDE0OC4xNyAyMS44M0MxNTIuNTQgMjYuMjEgMTU1IDMyLjE1IDE1NSAzOC4zM0MxNTUgNDcuNjcgMTU1IDEyMi4zMyAxNTUgMTMxLjY3QzE1NSAxNDQuNTUgMTQ0LjU1IDE1NSAxMzEuNjcgMTU1QzEyMi4zMyAxNTUgNDcuNjcgMTU1IDM4LjMzIDE1NUMyNS40NSAxNTUgMTUgMTQ0LjU1IDE1IDEzMS42N0MxNSAxMTkuMjIgMTUgODguMTEgMTUgMzguMzNaIiBpZD0iYTE0R2FsdjlVRiI+PC9wYXRoPjxwYXRoIGQ9Ik00NSAxNUwxMjUgMTVMMTI1IDc1TDQ1IDc1TDQ1IDE1WiIgaWQ9ImMzcTgzOUxVMyI+PC9wYXRoPjxwYXRoIGQ9Ik0zNSAxNDEuNDhDNTMuMTEgMTQxLjQ4IDY0LjQzIDE0MS40OCA2OC45NiAxNDEuNDhDNzcuODIgMTQxLjQ4IDg1IDEzNC4zIDg1IDEyNS40NUM4NSAxMjUuNDUgODUgMTI1LjQ1IDg1IDEyNS40NSIgaWQ9ImNoRTB0MXhmTCI+PC9wYXRoPjxwYXRoIGQ9Ik0xMDUgOTVMODUgMTE1TDY1IDk1TDEwNSA5NVoiIGlkPSJhNks5OThGM0dUIj48L3BhdGg+PHBhdGggZD0iTTc1IDc1TDk1IDc1TDk1IDk1TDc1IDk1TDc1IDc1WiIgaWQ9ImUxaWlNRVJxQWgiPjwvcGF0aD48L2RlZnM+PGc+PGc+PGc+PGc+PHVzZSB4bGluazpocmVmPSIjYTE0R2FsdjlVRiIgb3BhY2l0eT0iMSIgZmlsbD0iIzAwMDAwMCIgZmlsbC1vcGFjaXR5PSIwIj48L3VzZT48Zz48dXNlIHhsaW5rOmhyZWY9IiNhMTRHYWx2OVVGIiBvcGFjaXR5PSIxIiBmaWxsLW9wYWNpdHk9IjAiIHN0cm9rZT0iIzc3Nzc3NyIgc3Ryb2tlLXdpZHRoPSI4IiBzdHJva2Utb3BhY2l0eT0iMSI+PC91c2U+PC9nPjwvZz48Zz48dXNlIHhsaW5rOmhyZWY9IiNjM3E4MzlMVTMiIG9wYWNpdHk9IjEiIGZpbGw9IiMwMDAwMDAiIGZpbGwtb3BhY2l0eT0iMCI+PC91c2U+PGc+PHVzZSB4bGluazpocmVmPSIjYzNxODM5TFUzIiBvcGFjaXR5PSIxIiBmaWxsLW9wYWNpdHk9IjAiIHN0cm9rZT0iIzc3Nzc3NyIgc3Ryb2tlLXdpZHRoPSI4IiBzdHJva2Utb3BhY2l0eT0iMSI+PC91c2U+PC9nPjwvZz48Zz48Zz48dXNlIHhsaW5rOmhyZWY9IiNjaEUwdDF4ZkwiIG9wYWNpdHk9IjEiIGZpbGwtb3BhY2l0eT0iMCIgc3Ryb2tlPSIjNzc3Nzc3IiBzdHJva2Utd2lkdGg9IjguMDEiIHN0cm9rZS1vcGFjaXR5PSIxIj48L3VzZT48L2c+PC9nPjxnPjxnPjx1c2UgeGxpbms6aHJlZj0iI2E2Szk5OEYzR1QiIG9wYWNpdHk9IjEiIGZpbGwtb3BhY2l0eT0iMCIgc3Ryb2tlPSIjNzc3Nzc3IiBzdHJva2Utd2lkdGg9IjguMDEiIHN0cm9rZS1vcGFjaXR5PSIxIj48L3VzZT48L2c+PC9nPjxnPjx1c2UgeGxpbms6aHJlZj0iI2UxaWlNRVJxQWgiIG9wYWNpdHk9IjEiIGZpbGw9IiMwMDAwMDAiIGZpbGwtb3BhY2l0eT0iMCI+PC91c2U+PGc+PHVzZSB4bGluazpocmVmPSIjZTFpaU1FUnFBaCIgb3BhY2l0eT0iMSIgZmlsbC1vcGFjaXR5PSIwIiBzdHJva2U9IiM3Nzc3NzciIHN0cm9rZS13aWR0aD0iOCIgc3Ryb2tlLW9wYWNpdHk9IjEiPjwvdXNlPjwvZz48L2c+PC9nPjwvZz48L2c+PC9zdmc+Cg=='),

View file

@ -1,15 +1,12 @@
/** Copyright Stewart Allen -- All Rights Reserved */
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
var gs_kiri_init = exports;
(function() {
if (!self.kiri) self.kiri = { };
if (self.kiri.init) return;
let KIRI = self.kiri,
const KIRI = self.kiri,
MOTO = self.moto,
CONF = KIRI.conf,
WIN = self.window,
@ -42,11 +39,12 @@ var gs_kiri_init = exports;
GCODE = [MODES.FDM, MODES.LASER, MODES.CAM],
LASER = [MODES.LASER],
CATALOG = API.catalog,
platform = API.platform,
selection = API.selection,
deviceLock = false,
js2o = API.js2o,
o2js = API.o2js,
platform = API.platform,
selection = API.selection;
let deviceLock = false,
selectedTool = null,
editTools = null,
maxTool = 0,
@ -521,9 +519,8 @@ var gs_kiri_init = exports;
if (isLocalDevice(devicename)) {
setDeviceCode(settings().devices[devicename], devicename);
} else {
API.ajax("/kiri/filter/"+API.mode.get()+"/"+devicename, function(code) {
setDeviceCode(code, devicename);
});
let code = devices[API.mode.get_lower()][devicename];
setDeviceCode(code, devicename);
}
$('selected-device').innerHTML = devicename;
}
@ -973,10 +970,7 @@ var gs_kiri_init = exports;
function showDevices() {
if (deviceLock) return;
API.modal.hide();
API.ajax("/api/filters-"+API.mode.get_lower(), function(flvalue) {
if (!flvalue) return;
renderDevices(js2o(flvalue));
});
renderDevices(Object.keys(devices[API.mode.get_lower()]).sort());
}
function dragOverHandler(evt) {

1
src/kiri/lang-en.js Symbolic link
View file

@ -0,0 +1 @@
../../web/kiri/lang/en.js

View file

@ -1,17 +1,14 @@
/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
let gs_kiri_lang = exports;
(function() {
if (!self.kiri) self.kiri = {};
if (self.kiri.lang) return;
let KIRI = self.kiri,
LANG = self.kiri.lang = { current: {} },
lset = navigator.language.toLocaleLowerCase();
const KIRI = self.kiri, LANG = self.kiri.lang = { current: {} };
let lset = navigator.language.toLocaleLowerCase();
LANG.get = function() {
return lset;

View file

@ -1,15 +1,12 @@
/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
let gs_kiri_layer = exports;
(function() {
if (!self.kiri) self.kiri = {};
if (self.kiri.Layer) return;
let KIRI = self.kiri,
const KIRI = self.kiri,
POLY = self.base.polygons,
LP = Layer.prototype,
mcache = {};

View file

@ -1,10 +1,6 @@
/** Copyright Stewart Allen -- All Rights Reserved */
"use strict";
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
self.kiri = (self.kiri || {});
self.kiri.version = exports.VERSION;
self.kiri.license = exports.LICENSE;
self.kiri.copyright = exports.COPYRIGHT;
"use strict";
(function () {

View file

@ -1,14 +1,12 @@
/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
let gs_kiri_print = exports;
(function() {
if (!self.kiri) self.kiri = {};
if (self.kiri.newPrint) return;
let KIRI = self.kiri,
const KIRI = self.kiri,
DRIVERS = KIRI.driver,
LASER = DRIVERS.LASER,
CAM = DRIVERS.CAM,
@ -22,8 +20,9 @@ let gs_kiri_print = exports;
PI = Math.PI,
PRO = Print.prototype,
Polygon = BASE.Polygon,
newPoint = BASE.newPoint,
lastPoint = null,
newPoint = BASE.newPoint;
let lastPoint = null,
lastEmit = null;
KIRI.newPrint = function(settings, widgets, id) {

View file

@ -1,26 +1,21 @@
/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
let gs_kiri_slice = exports;
(function() {
if (!self.kiri) self.kiri = {};
if (self.kiri.Slice) return;
let KIRI = self.kiri,
const KIRI = self.kiri,
FILL = KIRI.fill,
FILLFIXED = KIRI.fill_fixed,
PRO = Slice.prototype,
BASE = self.base,
UTIL = BASE.util,
POLY = BASE.polygons,
PRO = Slice.prototype,
NOKEY = BASE.key.NONE,
fillArea = POLY.fillArea,
newPoint = BASE.newPoint,
MIN = Math.min,
MAX = Math.max,
NOKEY = BASE.key.NONE,
outline_colors = [
0xeeee00,
0xeebb00,

View file

@ -1,15 +1,12 @@
/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
let gs_kiri_slicer = exports;
(function() {
if (!self.kiri) self.kiri = {};
if (self.kiri.slicer) return;
let slicer = self.kiri.slicer = {
self.kiri.slicer = {
slice: slice,
sliceWidget: sliceWidget,
connectLines: connectLines

View file

@ -1,15 +1,12 @@
/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
let gs_kiri_widget = exports;
(function() {
if (!self.kiri) self.kiri = {};
if (self.kiri.Widget) return;
let KIRI = self.kiri,
const KIRI = self.kiri,
DRIVERS = KIRI.driver,
BASE = self.base,
CONF = BASE.config,
@ -20,8 +17,9 @@ let gs_kiri_widget = exports;
SQRT = MATH.sqrt,
PRO = Widget.prototype,
time = UTIL.time,
solid_opacity = 1.0,
nextId = 0,
solid_opacity = 1.0;
let nextId = 0,
groups = [];
KIRI.Widget = Widget;

View file

@ -1,4 +1,5 @@
/** Copyright Stewart Allen -- All Rights Reserved */
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
// this code runs in kiri's main loop
@ -49,7 +50,7 @@ KIRI.work = {
slicing = {};
running = {};
worker = new Worker(`/code/worker.js?${exports.VERSION}`);
worker = new Worker(`/code/worker.js?${self.kiri.version}`);
worker.onmessage = function(e) {
let now = time(),

View file

@ -1,16 +1,17 @@
/** Copyright Stewart Allen -- All Rights Reserved */
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
importScripts(`/code/work.js${location.search}`);
let ver = exports.VERSION,
base = self.base,
moto = self.moto,
const base = self.base,
util = base.util,
time = util.time,
kiri = self.kiri,
Widget = kiri.Widget,
currentPrint,
ver = kiri.version,
Widget = kiri.Widget;
let currentPrint,
currentSnap,
cache = {};

19
src/license.js Normal file
View file

@ -0,0 +1,19 @@
(function() {
let terms = {
COPYRIGHT: "Copyright (C) Stewart Allen <sa@grid.space> - All Rights Reserved",
LICENSE: "See the license.md file included with the source distribution",
VERSION: "3.0.0-dev"
};
if (typeof(module) === 'object') {
module.exports = terms;
} else if (self.kiri) {
// self.exports = terms;
self.kiri.license = terms.LICENSE;
self.kiri.version = terms.VERSION;
self.kiri.copyright = terms.COPYRIGHT;
self.module = { exports: terms };
}
})();

View file

@ -1,16 +1,13 @@
/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
var gs_kiri_cam = exports;
(function() {
if (!self.kiri) self.kiri = { };
if (!self.kiri.driver) self.kiri.driver = { };
if (self.kiri.driver.CAM) return;
let KIRI = self.kiri,
const KIRI = self.kiri,
BASE = self.base,
UTIL = BASE.util,
POLY = BASE.polygons,

View file

@ -1,16 +1,13 @@
/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
let gs_kiri_fdm = exports;
(function() {
if (!self.kiri) self.kiri = { };
if (!self.kiri.driver) self.kiri.driver = { };
if (self.kiri.driver.FDM) return;
let KIRI = self.kiri,
const KIRI = self.kiri,
BASE = self.base,
DBUG = BASE.debug,
UTIL = BASE.util,

View file

@ -1,16 +1,13 @@
/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
let gs_kiri_laser = exports;
(function() {
if (!self.kiri) self.kiri = { };
if (!self.kiri.driver) self.kiri.driver = { };
if (self.kiri.driver.LASER) return;
let KIRI = self.kiri,
const KIRI = self.kiri,
BASE = self.base,
UTIL = BASE.util,
POLY = BASE.polygons,

Some files were not shown because too many files have changed in this diff Show more