From 1d53376fc7ff91b76c28a70f4abd01bdff5ec67d Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 31 May 2020 21:34:04 -0400 Subject: [PATCH 01/61] separate kiri and meta css. remove web-server --- js/license.js | 2 +- js/web-server.js | 1427 ------------------------ notes.md | 1 - web/kiri/{style.css => index.css} | 460 +++++++- web/kiri/index.html | 3 +- web/{moto/style.css => meta/index.css} | 55 + web/meta/index.html | 3 +- web/meta/style.css | 54 - 8 files changed, 511 insertions(+), 1494 deletions(-) delete mode 100644 js/web-server.js rename web/kiri/{style.css => index.css} (62%) rename web/{moto/style.css => meta/index.css} (90%) delete mode 100644 web/meta/style.css diff --git a/js/license.js b/js/license.js index f5dd8e9e..cd7f6c4f 100644 --- a/js/license.js +++ b/js/license.js @@ -1,7 +1,7 @@ var exports = { COPYRIGHT:"Copyright (C) Stewart Allen - All Rights Reserved", LICENSE:"See the license.md file included with the source distribution", - VERSION:"2.0.5" + VERSION:"3.0.0-dev" }; if (!module) var module = {}; module.exports = exports; diff --git a/js/web-server.js b/js/web-server.js deleted file mode 100644 index f5cc08ba..00000000 --- a/js/web-server.js +++ /dev/null @@ -1,1427 +0,0 @@ -/** Copyright Stewart Allen -- All Rights Reserved */ - -Array.prototype.contains = function(v) { - return this.indexOf(v) >= 0; -}; - -Array.prototype.appendAll = function(a) { - this.push.apply(this,a); - return this; -}; - -const helper = { - log: function() { - console.log( - moment().format('YYMMDD.HHmmss'), - [...arguments] - .map(v => util.inspect(v, { - maxArrayLength: null, - breakLength: Infinity, - colors: debug, - compact: true, - sorted: true, - depth: null - })) - .join(' ') - ); - } -}; - -function log(o) { - helper.log(o); -} - -function promise(resolve, reject) { - return new Promise(resolve, reject); -} - -function rval() { - return (Math.round(Math.random()*0xffffffff)).toString(36); -} - -function guid() { - return time().toString(36)+rval()+rval()+rval(); -} - -function time() { - return Date.now(); -} - -/** - * @param {String[]} path - */ -function mkdirs(path) { - let root = ""; - path.forEach(seg => { - if (root) { - root = root + "/" + seg; - } else { - root = seg; - } - lastmod(root) || fs.mkdirSync(root); - }); -} - -/** - * @param {String} o - */ -function obj2string(o) { - return JSON.stringify(o); -} - -function string2obj(s) { - return JSON.parse(s); -} - -/** - * sync return mtime for file or 0 for no such file - * @param {String} path - * @returns {number} - */ -function lastmod(path) { - try { - return fs.statSync(path).mtime.getTime(); - } catch (e) { - return 0; - } -} - -/** - * @param {String} filePath - * @param {Function} fn - * @returns {*} - */ -function getCachedFile(filePath, cpath, fn) { - let cachePath = ".cache/" + cpath - .replace(/\//g,'_') - .replace(/\\/g,'_') - .replace(/:/g,'_'), - cached = fileCache[filePath], - now = time(); - - if (cached) { - if (now - cached.lastcheck > 60000) { - let smod = lastmod(filePath), - cmod = cached.mtime; - - if (!smod) throw "missing source file"; - if (smod > cmod) cached = null; - - cached.lastcheck = now; - } - } - - if (!cached) { - let smod = lastmod(filePath), - cmod = lastmod(cachePath), - cacheData; - - if (cmod >= smod) { - cacheData = fs.readFileSync(cachePath); - } else { - helper.log({update_cache:filePath}); - cacheData = fn(filePath); - fs.writeFileSync(cachePath, cacheData); - } - - cached = { - data: cacheData, - mtime: cmod || now, - lastcheck: now - }; - - fileCache[filePath] = cached; - } - - return cached.data; -} - -/** - * mangle, cache and concatenate scripts - */ -function prepareScripts() { - code.kiri = concatCode(script.kiri); - code.meta = concatCode(script.meta); - code.work = concatCode(script.work); - code.worker = concatCode(script.worker); - fs.readdir("./web/kiri/filter/FDM", function(err, files) { - filters_fdm = files || filters_fdm; - }); - fs.readdir("./web/kiri/filter/SLA", function(err, files) { - filters_sla = files || filters_sla; - }); - fs.readdir("./web/kiri/filter/CAM", function(err, files) { - filters_cam = files || filters_cam; - }); - fs.readdir("./web/kiri/filter/LASER", function(err, files) { - filters_laser = files || filters_laser; - }); -} - -/** - * @param {Array} array - * @returns {String} - */ -function concatCode(array) { - let code = [], - cached, - cachepath, - filepath; - - // in debug mode, the script should load dependent - // scripts instead of serving a complete bundle - if (debug) { - let code = [ `(function() { let load = [ `]; - array.forEach(file => { - if (file.indexOf(".js") < 0) { - file = `/js/${file}.js?${ver.VERSION}`; - } - if (file.indexOf(":\\") > 0) { - file = `/${file}`; - } - code.push(`"${file.replace(/\\/g,'/')}",`); - }); - code.push([ - ']; function load_next() {', - 'let file = load.shift();', - 'if (!file) return;', - 'if (!self.document) { importScripts(file); return load_next() }', - 'let s = document.createElement("script");', - 's.type = "text/javascript";', - 's.src = file;', - 's.onload = load_next;', - 'document.head.appendChild(s);', - '}; load_next(); })();', - 'self.debug=true;' - ].join('\n')); - return code.join('\n'); - } - - array.forEach((file, index) => { - if (file.charAt(0) === "/" || file.indexOf("\\") > 0) { - filepath = file; - cachepath = "js_mod" + file - .replace(/\//g,'_') - .replace(/\\/g,'_') - .replace(/:/g,'_'), - array[index] = cachepath.substring(3).replace('.js',''); - fileMap[cachepath.replace("js_","js/")] = filepath; - } else { - filepath = codePrefix + file + ".js"; - cachepath = filepath; - } - cached = getCachedFile(filepath, cachepath, function(path) { - return minify(filepath); - }); - code.push(cached); - }); - - return code.join(''); -} - -/** - * @param {String} cookie - * @param {String} [key] - * @returns {String | null} - */ -function getCookieValue(cookie,key) { - if (!cookie) return null; - key = (key || "key") + "="; - let kpos = cookie.lastIndexOf(key); - if (kpos >= 0) { - return cookie.substring(kpos+key.length).split(';')[0]; - } else { - return null; - } -} - -/** - * @param {String} ip - */ -function isNotLocal(ip) { - return ipLocal.contains(ip) ? null : ip; -} - -/** - * @param {Object} req - * @returns {String} - */ -function remoteIP(req) { - let fwd = req.headers['x-forwarded-for'], - sra = req.socket.remoteAddress, - cra = req.connection.remoteAddress, - ip = isNotLocal(fwd) || sra || cra || '', - ipa = ip.split(','); - if (ip === '' || ipa.length > 1) { - helper.log({remote:ipa, fwd, sra, cra}); - } - return ipa[0]; -} - -/** - * @param {Object} res - * @param {number} code - * @param {String} msg - */ -function quickReply(res, code, msg) { - res.writeHead(code); - res.end(msg+"\n"); -} - -/** - * @param {Object} req - * @param {Object} res - */ -function reply404(req, res) { - logger.emit([ - '404', - req.url, - req.socket.remoteAddress, - req.headers - ]); - res.writeHead(404); - res.end("[404]"); -} - -/** - * @param {Object} res - * @param {String} url - */ -function redirect(res, url) { - res.writeHead(302, { "Location": url }); - res.end(); -} - -/** - * @param {Array} array - * @param {number} length - * @param {number} timespan - * @returns {number} - */ -function limit(array, length, timespan, inc) { - let now = time(), - add = inc || 1, - limit = 0; - // age out entries older than timespan - while (array.length > 0 && now-array[0] > timespan) { - array.shift(); - } - // count elements over the limit - while (array.length > length) { - limit += add; - array.shift(); - } - return limit; -} - -function rewrite(req, res, next) { - if (req.url.indexOf(".html") > 0) { - let real_write = res.write; - let real_end = res.end; - - res.write = function() { - arguments[0] = arguments[0].toString().replace(/{{version}}/g,ver.VERSION); - real_write.apply(res, arguments); - }; - res.end = function() { - if (arguments[0]) { - arguments[0] = arguments[0].toString().replace(/{{version}}/g,ver.VERSION); - } - real_end.apply(res, arguments); - }; - } - - next(); -} - -/** - * @param {Object} req - * @param {Object} res - * @param {Function} next - */ -function setup(req, res, next) { - let host = req.headers['host'] || '', - beta = getCookieValue(req.headers['cookie'],'beta'); - - if (beta === 'true' && req.url.indexOf('?prod') > 0) { - res.setHeader('Set-Cookie', 'beta=false; path=/;'); - beta = 'false'; - } else if (beta !== 'true' && req.url.indexOf('?beta') > 0) { - res.setHeader('Set-Cookie', 'beta=true; path=/;'); - beta = 'true'; - } - - if (beta === 'true' && host.indexOf('beta.') !== 0) { - return redirect(res, `//beta.${host}${req.url}`); - } - - let parsed = url.parse(req.url, true), - ipaddr = remoteIP(req), - dbikey = db.key(["ip",ipaddr]), - path = parsed.pathname, - time = new Date().getTime(), - rec = ipCache[ipaddr] || { - saved : 0, - first: time, - last: [], - hits: 0, - api: [], - ip: ipaddr, - }, - ua = 'unknown'; - - try { - ua = agent.parse(req.headers['user-agent'] || ''); - } catch (e) { - helper.log("ua parse error on : "+req.headers['user-agent']); - } - - // cache it - if (rec.saved === 0) { - ipCache[ipaddr] = rec; - if (!rec.host) { - // prevent overlapping lookups for the same address - rec.host = 'unknown'; - try { - dns.reverse(ipaddr, (err,addr) => { - rec.host = addr; - }); - } catch (e) { - helper.log({dns_err: ipaddr}) - } - } - } - - // grid.space request state - req.gs = { - ua: ua, - ip: ipaddr, - iprec: rec, - local: ipLocal.contains(ipaddr), - port: req.socket.address().port, - url: parsed, - path: parsed.pathname, - query: parsed.query, - }; - - // fixup local addrs - if (req.gs.local) req.gs.ip = "::1"; - - // track clients & show first instance of IP - rec.last.push(time); - rec.hits++; - - // log request - logger.emit([ - req.method, - req.headers['host'] || '', - req.url, - req.socket.remoteAddress, - req.headers['origin'] || '', - req.headers['user-agent'] || '' - // m: req.method, - // u: req.url, - // i: ipaddr, - // h: req.headers['host'], - // o: req.headers['origin'], - // a: req.headers['user-agent'] - ]); - - // update db ip record - if (time - rec.saved > ipSaveDelay) db.get(dbikey) - .then(dbrec => { - // only on the first pull from disk - if (dbrec && rec.saved === 0) { - rec.first = dbrec.first; - rec.hits += dbrec.hits; - rec.last = dbrec.last.appendAll(rec.last); - rec.api = dbrec.api.appendAll(rec.api); - } - rec.saved = time; - return rec; - }) - .then(dbrec => { - if (rec.putTO) clearTimeout(rec.putTO); - rec.putTO = setTimeout(() => { - rec.putTO = null; - db.put(dbikey, dbrec); - }, ipSaveDelay); - }) - .catch(error => { - helper.log({dbikey, error}); - }); - - // absolute limit on client requests per minute - let rateinc = req.headers.host ? 1 : 50; - if (limit(rec.last, 300, 60000, rateinc) && !req.gs.local) { - res.writeHead(503); - res.end("rate limited"); - return log({rate_limit:ipaddr, len:rec.last.length}); - } - - if (req.method === 'OPTIONS') { - addCorsHeaders(req, res); - res.end(); - } else { - next(); - } -} - -function addCorsHeaders(req, res) { - res.setHeader('Access-Control-Allow-Credentials', 'true'); - res.setHeader('Access-Control-Allow-Headers', 'X-Moto-Ajax, Content-Type'); - res.setHeader("Access-Control-Allow-Origin", req.headers['origin'] || '*'); - res.setHeader("Allow", "GET,POST,OPTIONS"); -} - -/** - * in debug mode only, serve ANY file path beginning with / that exists - */ -function handleDebug(req, res, next) { - if (debug) { - let ext = req.url.split('.').pop(); - let type = { - 'html': 'text/html', - 'js': 'application/javascript' - }[ext] || 'application/unknown'; - if (lastmod(req.url)) { - res.setHeader('Content-Type',type); - return res.end(fs.readFileSync(req.url)); - } else if (lastmod(req.url.substring(1))) { - res.setHeader('Content-Type','application/javascript'); - return res.end(fs.readFileSync(req.url.substring(1))); - } - } - return next(); -} - -/** - * meta:moto data storage and retrieval url - * - * @param {Object} req - * @param {Object} res - * @param {Function} next - */ -function handleData(req, res, next) { - addCorsHeaders(req, res); - res.setHeader('Cache-Control', 'private, no-cache, max-age=0'); - - let tok = req.gs.url.path.split('/'), - muid = req.headers['x-moto-ajax'], - space = tok[2] || null, - version = tok[3], - valid = space && space.length >= 4 && space.length <= 8; - - function genKey() { - while (true) { - let k = Math.round(Math.random() * 9999999999).toString(36); - if (k.length >= 4 && k.length <= 8) return k; - } - } - - function countKey(space) { - return db.key(['meta/counter',space]); - } - - function ownerKey(space) { - return db.key(['meta/owner',muid,'space',space]); - } - - function recordKey(space, version) { - return db.key(["meta/space",space,version]); - } - - // retrieve latest space data - if (valid && req.method === 'GET' && valid) { - function send(rec, version) { - if (rec) { - res.write(obj2string({space:space,ver:version,rec:rec})); - res.end(); - } else { - res.end(); - } - } - - function retrieve(version) { - return db.get(recordKey(space,version)) - .then(record => { - send(record || null, version); - }) - } - - if (version) { - retrieve(version) - } else { - db.get(countKey(space)).then(version => retrieve(version)); - } - - return; - - } else if (valid && req.method === 'POST') { - - let dbOwner = null, - dbVersion = null, - postBody = null, - iprec = req.gs.iprec, - spacein = space, - version = 0, - body = ''; - - function checkDone() { - if (!(dbVersion && postBody)) return; - // if not owner, assign new space id - if (dbVersion > 1) { - if (!dbOwner) { - space = genKey(); - version = 1; - log({forked:space,from:spacein,by:muid}); - } - } - // log what we have - log({ - space: space, - ver: dbVersion, - uid: muid, - ip: iprec.ip, - hits: iprec.hits, - size: postBody.length - }); - if (muid && muid.length > 0) { - level.put(recordKey(space, dbVersion), body); - level.put(ownerKey(space), {ip: iprec.ip, time: time(), ver: dbVersion}); - level.put(countKey(space), dbVersion); - } - res.end(obj2string({space: space, ver: dbVersion})); - } - - // accumulate post body - req.on('data', data => { body += data }); - req.on('end', () => { - postBody = body; - checkDone(); - }); - - // fetch owner and version information - db.get(ownerKey(space)) - .then(owner => { - dbOwner = owner; - return db.get(countKey(space)); - }) - .then(version => { - dbVersion = parseInt(version || "0") + 1; - checkDone(); - }); - - return; - } -} - -function minify(path) { - let code = fs.readFileSync(path); - if (skip_minify.indexOf(path) >= 0) { - return code; - } - let mini = uglify.minify(code.toString()); - if (mini.error) { - console.trace(mini.error); - throw mini.error; - } - return mini.code; -} - -const clearok = [ - 'js/add-three.js', - 'js/ext-three.js', - 'js/ext-tween.js', - 'js/moto-load-stl.js', -]; - -/** - * @param {Object} req - * @param {Object} res - * @param {Function} next - */ -function handleJS(req, res, next) { - let spath = req.gs.path.substring(1), - jspos = spath.indexOf(".js"), - fpath = jspos > 0 ? spath.substring(0,jspos+3) : spath, - cached = fileCache[fpath]; - - if (!(req.gs.local || debug || clearok.indexOf(fpath) >= 0)) { - return reply404(req, res); - } - - if (fileMap[fpath]) { - fpath = fileMap[fpath]; - } - - fs.stat(fpath, (err, f) => { - if (err || !f) { - return reply404(req, res); - } - - let mtime = f.mtime.getTime(); - - if (!cached || cached.mtime != mtime) { - if (debug) { - fs.readFile(fpath, null, function(err, code) { - if (err) { - return reply404(req,res); - } - serveCode(req, res, fileCache[fpath] = { - clear: true, - mtime: mtime, - code: code - }); - }); - return; - } else { - let start = new Date().getTime(), - code = minify(fpath), - end = new Date().getTime(); - - log({minify:fpath, in:f.size, out:code.length, time:(end-start)}); - - cached = fileCache[fpath] = { - clear: false, - mtime: mtime, - code: code - }; - } - } - - serveCode(req, res, cached); - }); -} - -/** - * @param {Object} req - * @param {Object} res - * @param {Function} next - * - * expects paths in the format "/code/[token]/the/rest/is/ignored" - */ -function handleCode(req, res, next) { - let key = req.gs.path.split('/')[2].split('.')[0], - ck = code_src[key], - js = code[key]; - - if (!js) { - return reply404(req, res); - } - - if (ck) { - let mod = lastmod(ck.path); - if (mod > ck.mod) { - if (debug) { - js = code[ck.endpoint] = fs.readFileSync(ck.path); - } else { - js = code[ck.endpoint] = minify(ck.path); - } - ck.mod = mod; - } - } - - addCorsHeaders(req, res); - serveCode(req, res, { - code: js, - mtime: startTime - }); -} - -function handleWasm(req, res, next) { - let [root, file] = req.gs.path.split('/').slice(1); - let ext = (file || '').split('.')[1]; - let path = `wasm/${file}`; - let mod = lastmod(path); - - if (root === 'wasm' && ext === 'wasm' && mod) { - let imd = ifModifiedDate(req); - if (imd && mod <= imd) { - res.writeHead(304, "Not Modified"); - return res.end(); - } - res.writeHead(200, { - 'Content-Type': 'application/wasm', - 'Cache-Control': 'public, max-age=600', - 'Last-Modified': new Date(mod).toGMTString(), - }); - res.end(fs.readFileSync(path)); - } else { - next(); - } -} - -function ifModifiedDate(req) { - let ims = req.headers['if-modified-since']; - if (ims) { - // because sys time has a higher resolution than - // seconds converted from IMS header. so give it - // an extra second - return new Date(ims).getTime() + 1000; - } - return 0; -} - -/** - * @param {Object} req - * @param {Object} res - * @param {Obejct} code - */ -function serveCode(req, res, code) { - if (code.deny) { - return reply404(req, res); - } - - let imd = ifModifiedDate(req); - if (imd && code.mtime <= imd && !code.nocache) { - res.writeHead(304, "Not Modified"); - res.end(); - return; - } - - let cacheControl = code.nocache ? - 'private, max-age=0' : - 'public, max-age=600'; - - res.writeHead(200, { - 'Content-Type': 'application/javascript', - 'Cache-Control': cacheControl, - 'Last-Modified': new Date(code.mtime).toGMTString(), - }); - res.end(code.code); -} - -/* ********************************************* - * Setup / Global - ********************************************* */ - -let debug = false, - nolocal = false, - procexit = false, - port = 8080, - args = process.argv.slice(2); - -args.forEach((arg, index) => { - switch (arg) { - case 'nolocal': nolocal = true; break; - case 'debug': debug = true; break; - case 'port': port = process.argv[index+3]; break; - } -}); - -let ver = require('../js/license.js'), - fs = require('fs'), - url = require('url'), - dns = require('dns'), - util = require('util'), - path = require('path'), - valid = require('validator'), - agent = require('express-useragent'), - spawn = require('child_process').spawn, - level = require('level')('./persist', {valueEncoding:"json"}), - https = require('https'), - moment = require('moment'), - uglify = require('uglify-es'), - connect = require('connect'), - serveStatic = require('serve-static'), - compression = require('compression')(), - querystring = require('querystring'), - ipLocal = nolocal ? [] : ["127.0.0.1", "::1", "::ffff:127.0.0.1"], - currentDir = process.cwd(), - ipSaveDelay = 2000, - startTime = time(), - codePrefix = "js/", - fileCache = {}, - fileMap = {}, - filters_fdm = [], - filters_sla = [], - filters_cam = [], - filters_laser = [], - modPaths = [], - ipCache = {}, - skip_minify = [ - "js/ext-three.js" - ], - 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" - ], - meta : [ - "ext-three", - "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", - "meta" - ], - work : [ - "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" - ], - worker : [ - "kiri-worker" - ] - }, - code_src = {}, - code = {}, - WS = require('ws'), - wss = new WS.Server({ noServer: true }), - wss_roots = {}, - loads = [], - exits = [], - mods = {}, - logger = open_logger({dir: ".log-main"}) - ; - -/* ********************************************* - * Promises-based leveldb interface - ********************************************* */ -const db = { - // -------- - key: arr => arr.join("/"), - // -------- - get: key => { - if (Array.isArray(key)) key = db.key(key); - return promise((resolve,reject) => { - level.get(key,(err,record) => { - resolve(record,err); - }); - }); - }, - - // -------- - put: (key, value) => { - if (Array.isArray(key)) key = db.key(key); - return promise((resolve,reject) => { - level.put(key,value,(err) => { - if (err) reject(err); - else resolve(); - }); - }); - }, - // -------- - del: key => { - return promise((resolve,reject) => { - level.del(key, (err) => { - if (err) reject(err); - else resolve(); - }); - }); - } -}; - -/* ********************************************* - * REST API (extensible in modules) - ********************************************* */ -const api = { - - rateLimit: (req, res, next) => { - req.gs.iprec.api.push(time()); - - // allow 60 calls in 60 seconds - if (limit(req.gs.iprec.api, 60, 60000) && !req.gs.local) { - quickReply(res, 503, "rate limited"); - try { log({rate_limit_api: req.gs.ip, url: req.gs.url}); } catch (e) { helper.log(e) } - } else { - next(); - } - }, - - "filters-fdm": (req, res, next) => { - res.setHeader("Content-Type", "application/javascript"); - res.end(obj2string(filters_fdm)); - }, - - "filters-sla": (req, res, next) => { - res.setHeader("Content-Type", "application/javascript"); - res.end(obj2string(filters_sla)); - }, - - "filters-cam": (req, res, next) => { - res.setHeader("Content-Type", "application/javascript"); - res.end(obj2string(filters_cam)); - }, - - "filters-laser": (req, res, next) => { - res.setHeader("Content-Type", "application/javascript"); - res.end(obj2string(filters_laser)); - } - -}; - -/* ********************************************* - * Dispatch Helpers - ********************************************* */ - -// dispatch for path prefixs -function prepath(pre) { - - function handle(req, res, next) { - pre.uid = pre.uid || guid(); - req.ppi = req.ppi || {}; - - let path = req.gs.path, - key, fn, i = req.ppi[pre.uid] || 0; - - while (i < pre.length) { - key = pre[i][0]; - fn = pre[i++][1]; - if (path.indexOf(key) === 0) { - return fn(req, res, () => { - req.ppi[pre.uid] = i; - handle(req, res, next); - }); - } - } - - next(); - } - - return handle; -} - -// dispatch full fixed paths -function fullpath(map) { - return (req, res, next) => { - let fn = map[req.gs.path]; - if (fn) fn(req, res, next); - else next(); - }; -} - -// dispatch full paths based on a prefix and a function map -function fixedmap(prefix, map) { - return (req, res, next) => { - let path = req.gs.path; - if (path.indexOf(prefix) != 0) return next(); - let fn = map[path.substring(prefix.length)]; - if (fn) fn(req, res, next); - else next(); - }; -} - -// HTTP 302 redirect -function redir(path) { - return (req, res, next) => redirect(res, path); -} - -// mangle request path -function remap(path) { - return (req, res, next) => { - req.url = req.gs.path = path; - next(); - } -} - -// load module and call returned function with helper object -function initModule(file, dir) { - helper.log({module:file}); - require(file)({ - api: api, - adm: { - reload: prepareScripts - }, - const: { - args: args, - debug: debug, - script: script, - moddir: dir, - rootdir: currentDir, - version: ver.VERSION - }, - pkg: { - agent, - moment - }, - mod: mods, - util: { - log: helper.log, - time: time, - guid: guid, - mkdirs: mkdirs, - lastmod: lastmod, - obj2string: obj2string, - string2obj: string2obj, - getCookieValue: getCookieValue, - logger: open_logger - }, - db: { - api: db, - level: level - }, - inject: (code, file, options) => { - let opt = options || {}; - if (opt.end) { - script[code].push(dir + "/" + file); - } else { - script[code].splice(0, 0, dir + "/" + file); - } - }, - path: { - any: arg => { modPaths.push(arg) }, - pre: arg => { modPaths.push(prepath(arg)) }, - map: arg => { modPaths.push(fixedmap(arg)) }, - full: arg => { modPaths.push(fullpath(arg)) }, - static: (root, pre) => { modPaths.push(handleStatic(root, pre)) }, - code: (endpoint, path) => { - if (debug) { - code[endpoint] = fs.readFileSync(path); - } else { - code[endpoint] = minify(path); - } - code_src[endpoint] = { - endpoint, - path, - mod: lastmod(path) - }; - }, - redir: redir, - remap: remap - }, - handler: { - addCORS: addCorsHeaders, - static: handleStatic, - redirect: redirect, - reply404: reply404, - reply: quickReply - }, - ws: { - register: ws_register_root - }, - onload: (fn) => { - loads.push(fn); - }, - onexit: (fn) => { - exits.push(fn) - } - }); -} - -function handleStatic(root, pre) { - let statServe = serveStatic(root); - return function(req, res, next) { - if (pre) { - if (req.url.indexOf(pre) === 0) { - if (req.url === pre) { - req.url = "/"; - } else { - req.url = req.url.substring(pre.length); - } - return statServe(req, res, next); - } - return next(); - } - statServe(req, res, next); - }; -} - -// add static assets to be served -function addStatic(dir, pre) { - helper.log({static:dir}); - modPaths.push(handleStatic(dir, pre)); -} - -// either add module assets to path or require(init.js) -function loadModule(dir) { - if (dir.indexOf('node_modules') >= 0) { - return; - } - if (lastmod(dir + "/.ignore")) { - return; - } - const modjs = dir + "/init.js"; - lastmod(modjs) ? initModule(modjs, dir) : addStatic(dir); -} - -function ws_delete_root(path) { - ws_register_root(path); -} - -function ws_register_root(path, handler) { - if (handler) { - wss_roots[path] = handler; - } else { - delete wss_roots[path]; - } -} - -function open_logger(options) { - let opt = options || { - dir: "logs" - } - let exiting = false; - let logfile = null; - let logstream = null; - let pattern = opt.pattern || 'YY-MM-DD-HH'; - let last_pattern; - let count_min = opt.min || 1000; - let count = 0; - - try { - fs.mkdirSync(opt.dir); - } catch (e) { } - - // create file write stream - function open_file_stream() { - close_file_stream(); - logfile = path.join(opt.dir, last_pattern = moment().format(pattern)); - logstream = fs.createWriteStream(logfile, {flags: 'a'}); - let cur = path.join(opt.dir, "current"); - try { fs.unlinkSync(cur) } catch (e) { } - try { fs.symlinkSync(last_pattern, cur) } catch (e) { } - count = 0; - } - - function close_file_stream() { - if (logstream) { - logstream.end(); - logstream = null; - } - } - - function emit_log(obj) { - helper.log(obj); - emit(obj); - } - - function emit(obj) { - if (exiting) { - // console.log({dir: opt.dir, exiting_skip_log: obj}) - return; - } - let next_pattern = moment().format(pattern); - if (++count > count_min && next_pattern !== last_pattern) { - open_file_stream(); - } - let output = [moment().format('YYMMDD-HHmmss'),' ',JSON.stringify(obj),'\n'].join(''); - logstream.write(output); - } - - function exit() { - exiting = true; - close_file_stream(); - } - - open_file_stream(); - - exits.push(exit); - - return { emit, log: emit_log, close: close_file_stream }; -} - -function processLoad() { - while (loads.length) { - try { - loads.shift()(); - } catch (e) { - log({on_load_fail: e}); - } - } -} - -function processExit(code) { - if (procexit) { - return; - } - procexit = true; - logger.log({proc_exit: code, registered: exits.length, uptime: time() - startTime}); - while (exits.length) { - try { - exits.shift()(code); - } catch (e) { - log({on_exit_fail: e}); - } - } - setTimeout(() => { - process.exit(); - }, 500); -} - -/* ********************************************* - * Start it up - ********************************************* */ - -// load modules -lastmod("mod") && fs.readdirSync(currentDir + "/mod").forEach(dir => { - const fullpath = currentDir + "/mod/" + dir; - if (dir.charAt(0) === '.') return; - const stats = fs.lstatSync(fullpath); - if (!(stats.isDirectory() || stats.isSymbolicLink())) return; - loadModule(fullpath); -}); - -// create cache dir if missing -lastmod(".cache") || mkdirs([".cache"]); - -// precache responses -prepareScripts(); - -// create web handler chain -let handler = connect().use(setup); - -// add path handlers registered by modules -modPaths.forEach(fn => { - handler = handler.use(fn); -}); - -// add the rest of the handler chain -handler.use(fullpath({ - "/kiri/index.html" : redir("/kiri/"), - "/kiri" : redir("/kiri/"), - "/kiri/" : remap("/kiri/index.html"), - "/meta/index.html" : redir("/meta/"), - "/meta" : redir("/meta/"), - "/meta/" : remap("/meta/index.html") - })) - .use(prepath([ - [ "/space", redir("/meta/")], - [ "/api/", api.rateLimit ], - [ "/data/", handleData ], - [ "/code/", handleCode ], - [ "/wasm/", handleWasm ], - [ "/js/", handleJS ] - ])) - .use(handleDebug) - .use(fixedmap("/api/", api)) - .use(compression) - .use(rewrite) - .use(handleStatic(currentDir + "/web/")) - .use(reply404) - .listen(port) - .on('upgrade', (request, socket, head) => { - let handler = wss_roots[request.url]; - if (handler) { - wss.handleUpgrade(request, socket, head, ws => { - try { - handler(ws, request); - } catch (err) { - log({wss_handler_error: err}); - ws_delete_root(request.url); - socket.destroy(); - } - }); - } else { - socket.destroy(); - } - }); - -helper.log("------------------------------------------"); -helper.log({port, debug, nolocal, version: ver.VERSION}); -logger.emit({port, debug, nolocal, version: ver.VERSION}); - -process.on('beforeExit', processExit); - -process.on('exit', processExit); - -process.on('SIGINT', function(sig, code) { - logger.log({exit: code, signal: sig}); - processExit(code); -}); - -process.on('SIGHUP', function(sig, code) { - logger.log({exit: code, signal: sig}); - processExit(code); -}); - -process.on('unhandledRejection', (reason, p) => { - logger.log({unhandled_rejection: reason, promise: p}); -}); - -process.on('uncaughtException', (err) => { - logger.log({uncaught_exception: err}); -}); - -processLoad(); diff --git a/notes.md b/notes.md index 36ed0fdc..08a63444 100644 --- a/notes.md +++ b/notes.md @@ -44,7 +44,6 @@ * `B` linear finishing should extend beyond part boundaries by tool radius * `B` outside cutting direction in roughing mode inverted * `F` z bounded slices (extension of z bottom offset feature) -* `F` do not mill out thru-pockets. cut outline only. * `F` use arcs to connect hard angles * `F` do not rough areas that go all the way through the part https://github.com/GridSpace/grid-apps/issues/20 diff --git a/web/kiri/style.css b/web/kiri/index.css similarity index 62% rename from web/kiri/style.css rename to web/kiri/index.css index 9d31cc2e..10360edd 100644 --- a/web/kiri/style.css +++ b/web/kiri/index.css @@ -1,3 +1,456 @@ +a, a:hover, a:visited { + border: none; + outline: none; + color: inherit; + text-decoration: none; +} +body { + overflow: hidden; +} +body,div { + margin: 0px; + padding: 0px; + border: 0px; + font-weight: normal; + font-family: sans-serif; +} +label { + font-size: 14px; + margin-right: 2px; +} +canvas { + width: 100%; + height: 100%; + overflow: hidden; +} +button { + outline: none; + max-width: 25ex; + border: 1px solid #ccc; + border-radius: 3px; + background-color: #eee; + padding: 2px 7px 3px 7px; + margin-bottom: 2px !important; +} +button:hover { + background-color: #aaa; + color: black; +} +button[load] { + width: 100%; + text-align: left; +} +button[del] { + margin-left: 5px; +} +select { + outline: none; +} +th, tr, td, span, div, label, button { + user-select: none; +} +.noselect { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.title { + text-align:center; + border-radius: 4px; + border-bottom: 2px; + color: #222; + padding: 4px 5px 3px 5px; + margin-bottom: 2px; + background-color: rgba(170,221,255,0.75); + border: 1px solid rgba(255,255,255,0.5); + font-size: 12pt !important; + font-weight: bold !important; +} +.tablerow { + -webkit-flex-direction: row; + -webkit-justify-content: center; + -webkit-align-items: center; + display: -webkit-flex; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.tablerow button { + -webkit-flex-basis: auto; + -webkit-flex-grow: 1; + flex-grow: 1; + flex-basis: auto; + width: 33.33%; +} +.grouphead:first-of-type { + margin-top: 0; +} +.dark .grouphead { + background-color: rgba(100,120,150,0.75); + border: 1px solid #555; + color: #eee; + font-weight: normal; +} +.grouphead { + color: black; + background-color: rgba(170,221,255,0.7); + border: 1px solid #ccc; + border-radius: 3px; + margin-top: 5px; + margin-bottom: 3px; + padding: 3px 2px 2px 3px; + font-size: 12px; + font-weight: bold; + text-align: center; +} +.grouphead > a { + text-transform: uppercase; +} +.grouphead:hover { + cursor: default; +} +.ck_catalog { + padding-top: 2px; +} +.ck_catalog div { + -webkit-flex-direction: row; + -webkit-justify-content: center; + -webkit-align-items: center; + display: -webkit-flex; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + margin-bottom: 1px; +} +.ck_catalog button { + margin: 0px 0px 1px 2px !important; +} +.buton { + font-weight: bold; + background-color: #bbb; +} +.flow-row { + position: relative; + -webkit-flex-direction: row; + -webkit-justify-content: flex-end; + display: -webkit-flex; + display: flex; + flex-direction: row; + justify-content: flex-end; +} +.flow-row label { + -webkit-flex-basis: auto; + -webkit-flex-grow: 1; + flex-basis: auto; + flex-grow: 1; +} +.flow-col { + position: relative; + -webkit-flex-direction: column; + -webkit-justify-content: flex-start; + display: -webkit-flex; + display: flex; + flex-direction: column; + justify-content: flex-start; +} +.flow-left { + -webkit-justify-content: flex-start; + justify-content: flex-start; +} +.flow-grow { + -webkit-flex-grow: 1; + flex-grow: 1 +} +.flow-space-between { + -webkit-justify-content: space-between; + justify-content: space-between; +} + +:-moz-any(#control-left) { + overflow-x: hidden !important; + overflow-y: hidden !important; +} +:-moz-any(#control-right) { + overflow-x: scroll !important; + overflow-y: scroll !important; + margin-right: -14px !important; + margin-bottom: -14px !important; +} +.dark .control { + border: 0 !important; + background-color: rgba(255,255,255,0.5); +} +.dark .control button { + border: 1px solid rgba(128,128,128,0.5); +} +.control { + background-color: rgba(255,255,255,0.75); +} +.control label { + padding: 2px; +} +.control input { + background-color: #eee; + margin-bottom: 1px; + text-align: right; + border: 1px solid #bbb; +} +.control input:focus { + background-color: #fec; + outline: none; +} +.control input[disabled] { + background-color: #ccc; + color: #000; + border-width: 1px; +} +.control input[type="range"] { + width: 85px; + background-color: transparent; +} +.control select { + border: 1px solid #bbb; + background-color: #eee; + margin-bottom: 1px !important; + border-radius: 3px; +} +.control button { + margin: 1px; +} +.control .flow-row { + align-items: center; + justify-content: center; +} +.dark #appid span { + border-color: #555; + background-color: rgba(100,120,150,0.75); + color: #eee; +} +.dark #appid a { + color: #eee; +} +.dark #appid a:hover { + color: #eee; +} +.dark #appid span:hover { + background-color: rgba(80,100,230,0.75); +} +.dark #langpop { + color: black; +} +#appid { + text-align: center; + position: fixed; + width: 100%; + top: 3px; +} +#appid span { + border: 1px solid #ccc; + border-radius: 5px; + padding: 5px 8px 3px 8px; + background-color: rgba(170,221,255,0.75); + color: rgba(0,0,0,0.5); +} +#appid span:hover { + background-color: rgba(170,221,255,0.5); +} +#appid a { + color: rgba(0,0,0,0.75); + font-weight: bold; +} +#appid a:hover { + color: rgba(0,50,50,0.75); +} +#apphelp { + margin-left: 5px; + font-weight: bold; +} +#applang { + position: relative; + margin-right: 5px; + font-weight: bold; +} +#langpop { + display: none; + position: absolute; + white-space: nowrap; + top: 105%; + left: 0; + border-radius: 5px; + border: 1px solid #ddd; + background-color: rgba(255,255,255,0.75); + padding: 5px; +} +#langpop > div { + padding: 5px; +} +#langpop > div:hover { + background-color: rgba(255,128,128,0.5); + border-radius: 5px; +} +#applang:hover #langpop { + display: block; +} +#container { + width: 100%; + height: 100%; +} +#control > div:hover label { + text-decoration: underline; + text-decoration-color: #aaa; +} +#control-left { + display: none; + position: fixed; + z-index: 10000; + color: black; + top: 5px; + left: 0px; + padding: 5px; + border-top: 2px solid #ddd; + border-right: 2px solid #ddd; + border-bottom: 2px solid #ddd; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; + overflow-x: visible; + overflow-y: scroll; +} +#control-right { + display: none; + position: fixed; + z-index: 10000; + top: 5px; + right: 0px; + bottom: 5px; + padding: 5px; + border-top: 2px solid #ddd; + border-left: 2px solid #ddd; + border-bottom: 2px solid #ddd; + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; + color: #222; + overflow-y: scroll; + overflow-x: visible; +} +.dark .compact .grouphead { + background-color: rgba(100,120,150,0.75); + border: 1px solid #555; + color: #eee; +} +.dark .compact .grouphead:hover { + background-color: rgba(80,100,230,0.75); +} +.dark .compact.control { + background-color: rgba(128,128,128,0.2) !important; +} +.compact { + overflow: visible !important; + bottom: auto !important; + border: 0 !important; + background-color: rgba(255,255,255,0.5) !important; +} +.compact .grouphead { + padding: 10px 5px 10px 5px !important; + background-color: rgba(170,221,255,0.25); +} +.compact .grouphead:hover { + background-color: rgba(170,221,255,0.9); +} +.compact .grouphead a { + font-size: larger !important; + margin: 5px !important; +} +.compact .flow-row label { + font-size: 18px !important; +} +.compact .flow-row input { + font-size: 18px !important; +} +.compact .flow-row select { + font-size: 18px !important; +} +.compact .flow-row { + margin: 3px 0 3px 0; +} +.compact .asym { + width: auto !important; +} +.compact button { + font-size: larger !important; + padding: 5px 10px 5px 10px; +} +:-moz-any(#control-left.compact) { + overflow-x: display !important; + overflow-y: display !important; +} +:-moz-any(#control-right.compact) { + overflow-x: display !important; + overflow-y: display !important; + margin-right: auto !important; + margin-bottom: auto !important; +} +#control-left::-webkit-scrollbar, #control-right::-webkit-scrollbar { + display: none; +} +.dark #control-left:hover, .dark #control-right:hover { + background-color: rgba(255,255,255,0.6); +} +#control-left:hover, #control-right:hover { + background-color: #ffffff; +} +#loading { + position: fixed; + top: 5px; + left: 20%; + right: 20%; + border: 1px solid white; + margin: 2px; + background-color: #ddd; + text-align: center; + display: none; +} +#modal { + display: none; + position: fixed; + z-index: 20000; + top: 0px; + left: 0px; + right: 0px; + bottom: 0px; + background-color: rgba(0,0,0,0); +} +#progress { + position: relative; + width: 1%; + height: 100%; + background-color: #f00; +} +#welcome { + color: white; + padding: 10px; + border: 10px solid white; + background-color: rgba(20,20,20,0.75); + position: fixed; + top: 50px; + left: 0; + right: 0; + bottom: 100px; + margin: 0 auto; + width: 50%; + max-width: 800px; + min-width: 500px; + display: block; + unicode-bidi: embed; + font-family: monospace; + white-space: pre; + overflow-y: scroll +} + input[type=range]::-moz-focus-outer { border: 0; } @@ -648,9 +1101,6 @@ button.selected { overflow: hidden; font-family: monospace; } - -/** file catalog */ - #import { width: 100%; } @@ -690,7 +1140,6 @@ button[import="1"] { text-overflow: ellipsis; } -/** saved settings list */ #settings button { margin: 1px; } @@ -700,9 +1149,6 @@ button[import="1"] { padding-bottom: 10px; border: 0; } - -/** layer slider and controls */ - #layer-view { display: none; position: fixed; diff --git a/web/kiri/index.html b/web/kiri/index.html index 1e3daeaf..4239bcc0 100644 --- a/web/kiri/index.html +++ b/web/kiri/index.html @@ -14,8 +14,7 @@ Kiri:Moto - - + diff --git a/web/moto/style.css b/web/meta/index.css similarity index 90% rename from web/moto/style.css rename to web/meta/index.css index 2d574022..ef406e25 100644 --- a/web/moto/style.css +++ b/web/meta/index.css @@ -464,3 +464,58 @@ th, tr, td, span, div, label, button { white-space: pre; overflow-y: scroll } + +.ck_space button { + margin: 2px 0px 1px 2px !important; +} +.ck_spaces { + padding-top: 2px; +} +.ck_spaces div { + -webkit-flex-direction: row; + -webkit-justify-content: flex-start; + -webkit-align-items: center; + display: -webkit-flex; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + margin-bottom: 1px; +} +.ck_spaces button { + margin: 0px 0px 1px 2px !important; +} +.ck_library { + padding-top: 2px; +} +.ck_library div { + -webkit-flex-direction: row; + -webkit-justify-content: flex-start; + -webkit-align-items: center; + display: -webkit-flex; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + margin-bottom: 1px; +} +.ck_library button { + margin: 0px 0px 1px 2px !important; +} + +button.load { + -webkit-flex-basis: 1px; + -webkit-flex-grow: 1; + flex-basis: 1px; + flex-grow: 1; + text-align: left; +} +button.del { +} + +#dropbutton { + width: 100%; + height: 50px; + background-color: #ccc; + border-width: 1px; +} diff --git a/web/meta/index.html b/web/meta/index.html index c63e5baa..cd6491c9 100644 --- a/web/meta/index.html +++ b/web/meta/index.html @@ -10,8 +10,7 @@ Meta:Moto - - + diff --git a/web/meta/style.css b/web/meta/style.css deleted file mode 100644 index 9bf0869c..00000000 --- a/web/meta/style.css +++ /dev/null @@ -1,54 +0,0 @@ -.ck_space button { - margin: 2px 0px 1px 2px !important; -} -.ck_spaces { - padding-top: 2px; -} -.ck_spaces div { - -webkit-flex-direction: row; - -webkit-justify-content: flex-start; - -webkit-align-items: center; - display: -webkit-flex; - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: center; - margin-bottom: 1px; -} -.ck_spaces button { - margin: 0px 0px 1px 2px !important; -} -.ck_library { - padding-top: 2px; -} -.ck_library div { - -webkit-flex-direction: row; - -webkit-justify-content: flex-start; - -webkit-align-items: center; - display: -webkit-flex; - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: center; - margin-bottom: 1px; -} -.ck_library button { - margin: 0px 0px 1px 2px !important; -} - -button.load { - -webkit-flex-basis: 1px; - -webkit-flex-grow: 1; - flex-basis: 1px; - flex-grow: 1; - text-align: left; -} -button.del { -} - -#dropbutton { - width: 100%; - height: 50px; - background-color: #ccc; - border-width: 1px; -} From 637e36c40b031be2b7b3c182de935eb32ac0990f Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 1 Jun 2020 21:35:19 -0400 Subject: [PATCH 02/61] remove non-compact mode --- js/kiri-conf.js | 1 - js/kiri-init.js | 16 +--------------- js/moto-ui.js | 41 ++++++++++------------------------------- 3 files changed, 11 insertions(+), 47 deletions(-) diff --git a/js/kiri-conf.js b/js/kiri-conf.js index b3bb2859..566f46c4 100644 --- a/js/kiri-conf.js +++ b/js/kiri-conf.js @@ -542,7 +542,6 @@ let gs_kiri_conf = exports; view: null, dark: false, expert: false, - compact: false, zoomSpeed: 1.0, reverseZoom: true, showOrigin: false, diff --git a/js/kiri-init.js b/js/kiri-init.js index 173a740e..a784ff3e 100644 --- a/js/kiri-init.js +++ b/js/kiri-init.js @@ -81,7 +81,6 @@ var gs_kiri_init = exports; function booleanSave() { let control = settings().controller; - let isCompact = control.compact; let isDark = control.dark; let isReload = false; control.expert = UI.expert.checked; @@ -90,17 +89,11 @@ var gs_kiri_init = exports; control.freeLayout = UI.freeLayout.checked; control.alignTop = UI.alignTop.checked; control.reverseZoom = UI.reverseZoom.checked; - control.compact = UI.compact.checked; control.dark = UI.dark.checked; SPACE.view.setZoom(control.reverseZoom, control.zoomSpeed); platform.layout(); platform.update_stock(); API.conf.save(); - // if compact mode changed, reload UI - if (isCompact !== control.compact) { - UC.setDefaults(isCompact); - isReload = true; - } // if dark mode changed, reload UI if (isDark !== control.dark) { isReload = true; @@ -1071,7 +1064,6 @@ var gs_kiri_init = exports; container = $('container'), welcome = $('welcome'), controller = settings().controller, - compact = SETUP.compact || controller.compact, dark = controller.dark; WIN.addEventListener("resize", API.dialog.update); @@ -1089,8 +1081,6 @@ var gs_kiri_init = exports; SPACE.platform.setRound(true); SPACE.useDefaultKeys(API.feature.on_key === undefined || API.feature.on_key_defaults); - UC.setCompact(compact); - Object.assign(UI, { // from static HTML alert: { @@ -1282,7 +1272,6 @@ var gs_kiri_init = exports; layout: UC.newGroup(LANG.op_menu), expert: UC.newBoolean(LANG.op_xprt_s, booleanSave, {title:LANG.op_xprt_l}), - compact: UC.newBoolean(LANG.op_comp_s, booleanSave, {title:LANG.op_comp_l}), dark: UC.newBoolean(LANG.op_dark_s, booleanSave, {title:LANG.op_dark_l}), showOrigin: UC.newBoolean(LANG.op_show_s, booleanSave, {title:LANG.op_show_l, modes:GCODE}), alignTop: UC.newBoolean(LANG.op_alig_s, booleanSave, {title:LANG.op_alig_l, modes:CAM}), @@ -1651,9 +1640,7 @@ var gs_kiri_init = exports; settings().device.bedHeight ); - if (compact) { - UI.selection.classList.add('compact'); - } + UI.selection.classList.add('compact'); if (dark) { SPACE.platform.setGrid(25, 5, 0x999999, 0x333333); @@ -1749,7 +1736,6 @@ var gs_kiri_init = exports; UI.autoLayout.checked = control.autoLayout; UI.alignTop.checked = control.alignTop; UI.reverseZoom.checked = control.reverseZoom; - UI.compact.checked = control.compact; // load script extensions if (SETUP.s) SETUP.s.forEach(function(lib) { diff --git a/js/moto-ui.js b/js/moto-ui.js index f325b7e2..6848820b 100644 --- a/js/moto-ui.js +++ b/js/moto-ui.js @@ -28,7 +28,6 @@ var gs_moto_ui = exports; DOC = SELF.document, prefix = "tab", NOMODE = "nomode", - compact = false, exitimer = undefined; SELF.$ = (SELF.$ || function (id) { return DOC.getElementById(id) } ); @@ -57,35 +56,17 @@ var gs_moto_ui = exports; newBlank: newBlank, newGroup: newGroup, setGroup: setGroup, - setCompact: setCompact, - setDefaults: setDefaults, hidePoppers: hidePoppers, checkpoint, restore }; - function setDefaults(bool) { - Object.keys(localStorage).forEach(name => { - let namepre = `${prefix}-show-`; - if (name.indexOf(namepre) === 0) { - localStorage[name] = bool; - } - }); - } - - function setCompact(bool) { - compact = bool; - return this; - } - function setMode(mode) { - if (compact) { - $('control-left').classList.add('compact'); - $('control-right').classList.add('compact'); - Object.keys(groupShow).forEach(group => { - updateGroupShow(group); - }); - } + $('control-left').classList.add('compact'); + $('control-right').classList.add('compact'); + Object.keys(groupShow).forEach(group => { + updateGroupShow(group); + }); letMode = mode; hasModes.forEach(function(div) { div.setMode(div._group && !groupShow[div._group] ? NOMODE : mode); @@ -132,8 +113,8 @@ var gs_moto_ui = exports; let row = DOC.createElement('div'), a = DOC.createElement('a'), - dbkey = `${prefix}-show-${group}`, - popper = compact && !opt.nocompact; + dbkey = `beta-${prefix}-show-${group}`, + popper = !opt.nocompact; if (popper) { let pop = DOC.createElement('div'); @@ -185,9 +166,7 @@ var gs_moto_ui = exports; } function hidePoppers() { - if (compact) { - showGroup(undefined); - } + showGroup(undefined); } function showGroup(groupname) { @@ -543,13 +522,13 @@ var gs_moto_ui = exports; t = DOC.createTextNode(label); b.onclick = function() { - if (compact) hidePoppers(); + hidePoppers(); if (action) action(); }; if (options) { if (options.class) b.classList.add(options.class); - if (compact && options.icon) { + if (options.icon) { let d = DOC.createElement('div'); d.innerHTML = options.icon; b.appendChild(d); From b01b2be8183653570196da818bf1bf9ce4dec581 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 1 Jun 2020 21:53:14 -0400 Subject: [PATCH 03/61] tweak compact menu order and titles --- js/kiri-init.js | 81 +++++++++++---------------------------------- js/moto-space.js | 24 +++++++------- web/kiri/lang/en.js | 8 +++-- 3 files changed, 38 insertions(+), 75 deletions(-) diff --git a/js/kiri-init.js b/js/kiri-init.js index a784ff3e..e92525cf 100644 --- a/js/kiri-init.js +++ b/js/kiri-init.js @@ -1192,72 +1192,35 @@ var gs_kiri_init = exports; mode: UC.newGroup(LANG.mo_menu, assets, {region:"left", poprow:false}), modeTable: UC.newTableRow([ - [ - UI.modeFDM = - UC.newButton(LANG.mo_fdmp, function() { API.mode.set('FDM',null,platform.update_size) }, {icon: KIRI.icons.fdm}), - ],[ - UI.modeSLA = - UC.newButton(LANG.mo_slap, function() { API.mode.set('SLA',null,platform.update_size) }, {icon: KIRI.icons.sla}), - ],[ - UI.modeLASER = - UC.newButton(LANG.mo_lazr, function() { API.mode.set('LASER',null,platform.update_size) }, {icon: KIRI.icons.laser}), - ],[ - UI.modeCAM = - UC.newButton(LANG.mo_cncm, function() { API.mode.set('CAM',null,platform.update_size) }, {icon: KIRI.icons.cam, id:"modeCAM"}), - ] + [ UI.modeFDM = UC.newButton(LANG.mo_fdmp, function() { API.mode.set('FDM',null,platform.update_size) }, {icon: KIRI.icons.fdm}) ], + [ UI.modeSLA = UC.newButton(LANG.mo_slap, function() { API.mode.set('SLA',null,platform.update_size) }, {icon: KIRI.icons.sla}) ], + [ UI.modeLASER = UC.newButton(LANG.mo_lazr, function() { API.mode.set('LASER',null,platform.update_size) }, {icon: KIRI.icons.laser}) ], + [ UI.modeCAM = UC.newButton(LANG.mo_cncm, function() { API.mode.set('CAM',null,platform.update_size) }, {icon: KIRI.icons.cam, id:"modeCAM"}) ] ]), system: UC.newGroup(LANG.su_menu), sysTable: UC.newTableRow([ - [ - UI.setupDevices = - UC.newButton(LANG.su_devi, showDevices) - ],[ - UI.setupTools = - UC.newButton(LANG.su_tool, showTools, {modes:CAM}) - ],[ - UI.setupExport = - UC.newButton(LANG.su_xprt, settingsExport, {modes:ALL, expert:true}) - ],[ - UI.localButton = - UC.newButton(LANG.su_locl, API.show.local, {modes:FDM_CAM, expert:true}) - ],[ - UI.helpButton = - UC.newButton(LANG.su_help, API.help.show) - ] + [ UI.setupDevices = UC.newButton(LANG.su_devi, showDevices) ], + [ UI.setupTools = UC.newButton(LANG.su_tool, showTools, {modes:CAM}) ], + [ UI.setupExport = UC.newButton(LANG.su_xprt, settingsExport, {modes:ALL, expert:true}) ], + [ UI.localButton = UC.newButton(LANG.su_locl, API.show.local, {modes:FDM_CAM, expert:true}) ] + ]), + wsFile: UC.newGroup(LANG.fe_menu), + wsFileTable: UC.newTableRow([ + [ UI.import = UC.newButton(LANG.fn_recn, undefined, {class:"asym"}) ], + [ UI.load = UC.newButton(LANG.fn_impo, function() { API.event.import() }, {class:"asym"}) ] ]), wsFunc: UC.newGroup(LANG.fn_menu), wsFuncTable: UC.newTableRow([ - [ - UI.load = - UC.newButton(LANG.fn_impo, function() { API.event.import() }, {class:"asym"}), - UI.import = - UC.newButton("+", undefined, {class:"asym"}) - ],[ - UI.modeArrange = - UC.newButton(LANG.fn_arra, platform.layout), - ],[ - UI.modeSlice = - UC.newButton(LANG.fn_slic, API.function.slice) - ],[ - UI.modePreview = - UC.newButton(LANG.fn_prev, API.function.print), - ],[ - UI.modeExport = - UC.newButton(LANG.fn_expo, API.function.export) - ] + [ UI.modeArrange = UC.newButton(LANG.fn_arra, platform.layout) ], + [ UI.modeSlice = UC.newButton(LANG.fn_slic, API.function.slice) ], + [ UI.modePreview = UC.newButton(LANG.fn_prev, API.function.print) ], + [ UI.modeExport = UC.newButton(LANG.fn_expo, API.function.export) ] ]), camera: UC.newGroup(LANG.vu_menu), camTable: UC.newTableRow([ - [ - UC.newButton(LANG.vu_home, SPACE.view.home), - UC.newButton(LANG.vu_rset, SPACE.view.reset) - ],[ - UC.newButton(LANG.vu_sptp, SPACE.view.top), - UC.newButton(LANG.vu_spfr, SPACE.view.front), - ],[ - UC.newButton(LANG.vu_splt, SPACE.view.left), - UC.newButton(LANG.vu_sprt, SPACE.view.right) - ] + [ UC.newButton(LANG.vu_sptp, SPACE.view.top) ], + [ UC.newButton(LANG.vu_home, SPACE.view.home) ], + [ UC.newButton(LANG.vu_rset, SPACE.view.reset) ] ]), workspace: UC.newGroup(LANG.ws_menu, undefined, {modes:ALL, expert:true}), @@ -1265,7 +1228,6 @@ var gs_kiri_init = exports; [ UI.saveButton = UC.newButton(LANG.ws_save, API.space.save), - ],[ UC.newButton(LANG.ws_cler, API.space.clear) ] ], {modes:ALL, expert:true}), @@ -1789,9 +1751,6 @@ var gs_kiri_init = exports; // ensure hot keys work even in iframes API.focus(); - // place version number a couple of places to help users - UI.helpButton.title = `${LANG.version} ` + KIRI.version; - // restore expert setting preference UC.setExpert(control.expert); diff --git a/js/moto-space.js b/js/moto-space.js index 66e2a1e8..d306a1e6 100644 --- a/js/moto-space.js +++ b/js/moto-space.js @@ -387,21 +387,21 @@ var MOTO = window.moto = window.moto || {}; case cca('h'): Space.view.home(); break; - case cca('f'): - Space.view.front(); - break; - case cca('l'): - Space.view.left(); - break; - case cca('r'): - Space.view.right(); - break; case cca('t'): Space.view.top(); break; - case cca('b'): - Space.view.back(); - break; + // case cca('f'): + // Space.view.front(); + // break; + // case cca('l'): + // Space.view.left(); + // break; + // case cca('r'): + // Space.view.right(); + // break; + // case cca('b'): + // Space.view.back(); + // break; default: handled = false; break; diff --git a/web/kiri/lang/en.js b/web/kiri/lang/en.js index 356ebc2c..9d32f424 100644 --- a/web/kiri/lang/en.js +++ b/web/kiri/lang/en.js @@ -85,9 +85,13 @@ kiri.lang['en-us'] = { su_xprt: "Export", su_help: "Help", - // FUNCTION - fn_menu: "function", + // LOAD + fe_menu: "file", + fn_recn: "Recent", fn_impo: "Import", + + // FUNCTION + fn_menu: "action", fn_arra: "Arrange", fn_slic: "Slice", fn_prev: "Preview", From c6f40d17a3b353773ba3881149018c110a0062d7 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 1 Jun 2020 22:17:44 -0400 Subject: [PATCH 04/61] fix /data paths --- app.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app.js b/app.js index 10359bf3..d967d896 100644 --- a/app.js +++ b/app.js @@ -426,7 +426,7 @@ function handleData(req, res, next) { addCorsHeaders(req, res); res.setHeader('Cache-Control', 'private, no-cache, max-age=0'); - let tok = req.app.url.path.split('/'), + let tok = req.app.path.split('/'), muid = req.headers['x-moto-ajax'], space = tok[2] || null, version = tok[3], @@ -530,6 +530,11 @@ function handleData(req, res, next) { }); return; + + } else { + + next(); + } } From f9aa9a6832c1ad977d2f47fea72f83561b6195aa Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 1 Jun 2020 23:23:47 -0400 Subject: [PATCH 05/61] reencode url to remove version --- js/kiri-init.js | 10 ---------- js/kiri.js | 14 ++++++++++++++ web/kiri/lang/en.js | 12 ++++++------ 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/js/kiri-init.js b/js/kiri-init.js index e92525cf..eef03c75 100644 --- a/js/kiri-init.js +++ b/js/kiri-init.js @@ -1448,16 +1448,6 @@ var gs_kiri_init = exports; layerMoves: UC.newBoolean(LANG.la_move, onLayerToggle, {modes:GCODE}) }); - if (!lang_set) { - // for english only, add underlined labels for hotkeys - UI.setupDevices.innerHTML = "Devices"; - UI.setupTools.innerHTML = "Tools"; - UI.modeArrange.innerHTML = "Arrange"; - UI.modeSlice.innerHTML = "Slice"; - UI.modePreview.innerHTML = "Preview"; - UI.modeExport.innerHTML = "Export"; - } - // populate language drop-down let lp = $('langpop'); let elp = DOC.createElement("div"); diff --git a/js/kiri.js b/js/kiri.js index 2f2adf26..860c4aa9 100644 --- a/js/kiri.js +++ b/js/kiri.js @@ -65,6 +65,9 @@ self.kiri.copyright = exports.COPYRIGHT; if (SETUP.rm) renderMode = parseInt(SETUP.rm[0]); DBUG.enable(); + // remove version, preserve other settings + WIN.history.replaceState({},'','/kiri/' + encodeOpt(SETUP) + LOC.hash); + // add show() to catalog for API CATALOG.show = showCatalog; @@ -404,6 +407,7 @@ self.kiri.copyright = exports.COPYRIGHT; let opt = {}, kv, kva; // handle kiri legacy and proper url encoding better ov.replace(/&/g,',').split(',').forEach(function(el) { + el = el.replace(/=/g,':'); kv = decodeURIComponent(el).split(':'); if (kv.length === 2) { kva = opt[kv[0]] = opt[kv[0]] || []; @@ -413,6 +417,16 @@ self.kiri.copyright = exports.COPYRIGHT; return opt; } + function encodeOpt(opt) { + let out = []; + Object.keys(opt).forEach(key => { + if (key === 'ver') return; + let val = opt[key]; + out.push(encodeURIComponent(key) + "=" + encodeURIComponent(val)); + }); + return out.length ? '?' + out.join('&') : ''; + } + function ajax(url, fn, rt, po, hd) { return new MOTO.Ajax(fn, rt).request(url, po, hd); } diff --git a/web/kiri/lang/en.js b/web/kiri/lang/en.js index 9d32f424..fb91fed6 100644 --- a/web/kiri/lang/en.js +++ b/web/kiri/lang/en.js @@ -99,12 +99,12 @@ kiri.lang['en-us'] = { // VIEW vu_menu: "view", - vu_home: "home", - vu_rset: "reset", - vu_sptp: "top", - vu_spfr: "front", - vu_splt: "left", - vu_sprt: "right", + vu_home: "Home", + vu_rset: "Reset", + vu_sptp: "Top", + vu_spfr: "Front", + vu_splt: "Left", + vu_sprt: "Right", // WORKSPACE ws_menu: "workspace", From 5b2271f0059cb676a69c7cbea2d6b15ae06c1d8a Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Tue, 2 Jun 2020 20:31:12 -0400 Subject: [PATCH 06/61] fix missing ua compat api. menu order. reduce font size --- app.js | 5 +++++ js/kiri-init.js | 9 +++------ web/kiri/index.css | 6 +++++- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/app.js b/app.js index d967d896..a30aa034 100644 --- a/app.js +++ b/app.js @@ -414,6 +414,11 @@ function handleVersion(req, res, next) { } function handleOptions(req, res, next) { + try { + req.app.ua = agent.parse(req.headers['user-agent'] || ''); + } catch (e) { + logger.log("ua parse error on : "+req.headers['user-agent']); + } if (req.method === 'OPTIONS') { addCorsHeaders(req, res); res.end(); diff --git a/js/kiri-init.js b/js/kiri-init.js index eef03c75..4a0a95e9 100644 --- a/js/kiri-init.js +++ b/js/kiri-init.js @@ -1216,16 +1216,13 @@ var gs_kiri_init = exports; [ UI.modePreview = UC.newButton(LANG.fn_prev, API.function.print) ], [ UI.modeExport = UC.newButton(LANG.fn_expo, API.function.export) ] ]), - camera: UC.newGroup(LANG.vu_menu), - camTable: UC.newTableRow([ - [ UC.newButton(LANG.vu_sptp, SPACE.view.top) ], - [ UC.newButton(LANG.vu_home, SPACE.view.home) ], - [ UC.newButton(LANG.vu_rset, SPACE.view.reset) ] - ]), workspace: UC.newGroup(LANG.ws_menu, undefined, {modes:ALL, expert:true}), wsTable: UC.newTableRow([ [ + UC.newButton(LANG.vu_sptp, SPACE.view.top), + UC.newButton(LANG.vu_home, SPACE.view.home), + ],[ UI.saveButton = UC.newButton(LANG.ws_save, API.space.save), UC.newButton(LANG.ws_cler, API.space.clear) diff --git a/web/kiri/index.css b/web/kiri/index.css index 10360edd..5d67077e 100644 --- a/web/kiri/index.css +++ b/web/kiri/index.css @@ -533,8 +533,12 @@ input[type=range]::-moz-focus-outer { .sel-span:hover .sel-pop { display: block; } +.compact .sel-span .value { + font-size: 16px; + color: #444466 !important; +} .compact .sel-span label { - font-size: 24px; + font-size: 20px; } .compact .sel-span input { font-size: 18px; From 02feb524e69f55d9a8d46735683b655857153754 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Wed, 3 Jun 2020 22:39:30 -0400 Subject: [PATCH 07/61] restructure code, internalize devices --- app.js | 284 ++++++++---------- js/ext-earcut.js | 1 - js/ext-three.js | 1 - js/ext-tween.js | 1 - js/kiri-lang-en.js | 1 - js/license.js | 7 - notes.md | 1 + js/add-array.js => src/add/array.js | 0 js/add-class.js => src/add/class.js | 0 js/add-three.js => src/add/three.js | 0 .../CAM => src/dev/cam}/Any.Generic.Grbl | 14 +- .../CAM => src/dev/cam}/Any.Generic.LinuxCNC | 18 +- .../CAM => src/dev/cam}/Any.Generic.TinyG | 0 .../dev/cam}/Carbide3D.Nomad.883Pro | 14 +- .../CAM => src/dev/cam}/Carbide3D.Shapeoko.3 | 0 .../CAM => src/dev/cam}/Carbide3D.Shapeoko.XL | 0 .../dev/cam}/Carbide3D.Shapeoko.XXL | 0 .../dev/cam}/Inventables.Carvey.Any | 0 .../dev/cam}/Inventables.XCarve.1000mm | 0 .../dev/cam}/Inventables.XCarve.500mm | 0 .../CAM => src/dev/cam}/Sienci.LongMill | 0 .../CAM => src/dev/cam}/Sienci.Mill.One | 0 .../CAM => src/dev/cam}/Techno.Davinci.CNC | 0 .../FDM => src/dev/fdm}/Any.Generic.Marlin | 0 .../FDM => src/dev/fdm}/Any.Generic.Sailfish | 0 .../FDM => src/dev/fdm}/Anycubic.i3.Mega | 0 {web/kiri/filter/FDM => src/dev/fdm}/Atom.v2 | 0 .../FDM => src/dev/fdm}/Creality.Ender.3 | 0 .../FDM => src/dev/fdm}/Creality.Ender.5 | 0 .../FDM => src/dev/fdm}/Cubicon.Single+ | 0 .../filter/FDM => src/dev/fdm}/Cubicon.Style | 0 .../filter/FDM => src/dev/fdm}/DeltaMaker.2T | 0 .../FDM => src/dev/fdm}/DeltaMaker.Original | 0 .../FDM => src/dev/fdm}/Flashforge.Finder | 0 .../FDM => src/dev/fdm}/Flashforge.Guider.II | 0 .../filter/FDM => src/dev/fdm}/FolgerTech.FT5 | 0 .../filter/FDM => src/dev/fdm}/GridBot.One | 0 .../filter/FDM => src/dev/fdm}/GridBot.Two | 0 .../dev/fdm}/IMADE3D.JellyBOX.Original | 0 .../FDM => src/dev/fdm}/IMADE3D.JellyBOX2 | 0 .../FDM => src/dev/fdm}/Leapfrog.CreatrHS | 0 .../filter/FDM => src/dev/fdm}/MakerGear.M2 | 0 .../FDM => src/dev/fdm}/Makerbot.Replicator2 | 0 .../filter/FDM => src/dev/fdm}/Prusa.i3.MK2S | 0 .../filter/FDM => src/dev/fdm}/Raise3D.N2 | 0 .../filter/FDM => src/dev/fdm}/TypeA.Series1 | 0 .../FDM => src/dev/fdm}/TypeA.Series1Pro | 0 {web/kiri/filter/FDM => src/dev/fdm}/Ulio3D | 0 .../FDM => src/dev/fdm}/Ultimaker.Ultimaker2 | 0 .../FDM => src/dev/fdm}/Wanhao.Duplicator_4s | 0 .../FDM => src/dev/fdm}/Wanhao.Duplicator_5s | 0 .../FDM => src/dev/fdm}/Wanhao.Duplicator_6 | 0 .../FDM => src/dev/fdm}/Wanhao.Duplicator_i3 | 0 .../FDM => src/dev/fdm}/XYZ.daVinci.Jr.Pro | 0 .../FDM => src/dev/fdm}/XYZ.daVinci.Mini.w | 0 .../LASER => src/dev/laser}/Any.Generic.Laser | 0 .../filter/LASER => src/dev/laser}/Glowforge | 0 .../SLA => src/dev/sla}/Anycubic.Photon | 0 .../SLA => src/dev/sla}/Anycubic.Photon.S | 0 js/ext-clip.js => src/ext/clip.js | 0 js/ext-clip2.js => src/ext/clip2.js | 0 src/ext/earcut.js | 1 + js/ext-fsave.js => src/ext/fsave.js | 0 js/ext-pngjs.js => src/ext/pngjs.js | 0 src/ext/three.js | 1 + src/ext/tween.js | 1 + js/geo.js => src/geo/base.js | 33 +- js/geo-bounds.js => src/geo/bounds.js | 30 +- js/geo-debug.js => src/geo/debug.js | 20 +- js/geo-gyroid.js => src/geo/gyroid.js | 11 +- js/geo-line.js => src/geo/line.js | 22 +- js/geo-point.js => src/geo/point.js | 87 +++--- js/geo-polygon.js => src/geo/polygon.js | 118 ++++---- js/geo-polygons.js => src/geo/polygons.js | 98 +++--- js/geo-render.js => src/geo/render.js | 20 +- js/geo-slope.js => src/geo/slope.js | 44 ++- js/geo-wasm.js => src/geo/wasm.js | 7 +- src/kiri.js | 11 + js/kiri-codec.js => src/kiri/codec.js | 45 ++- js/kiri-conf.js => src/kiri/conf.js | 9 +- js/kiri-db.js => src/kiri/db.js | 27 +- js/kiri-export.js => src/kiri/export.js | 12 +- js/kiri-fill.js => src/kiri/fill.js | 7 +- js/kiri-icons.js => src/kiri/icons.js | 5 +- js/kiri-init.js => src/kiri/init.js | 24 +- src/kiri/lang-en.js | 1 + js/kiri-lang.js => src/kiri/lang.js | 11 +- js/kiri-layer.js => src/kiri/layer.js | 7 +- js/kiri.js => src/kiri/main.js | 8 +- js/kiri-print.js => src/kiri/print.js | 13 +- js/kiri-slice.js => src/kiri/slice.js | 13 +- js/kiri-slicer.js => src/kiri/slicer.js | 7 +- js/kiri-widget.js => src/kiri/widget.js | 12 +- js/kiri-work.js => src/kiri/work.js | 5 +- js/kiri-worker.js => src/kiri/worker.js | 13 +- src/license.js | 19 ++ {js => src}/meta.js | 0 .../mode/cam/driver.js | 7 +- .../mode/fdm/driver.js | 7 +- .../mode/laser/driver.js | 7 +- .../mode/sla/driver.js | 12 +- js/moto-ajax.js => src/moto/ajax.js | 14 +- js/moto-ctrl.js => src/moto/ctrl.js | 5 +- js/moto-db.js => src/moto/db.js | 24 +- js/moto-kv.js => src/moto/kv.js | 4 +- js/moto-load-obj.js => src/moto/load-obj.js | 26 +- js/moto-load-stl.js => src/moto/load-stl.js | 56 ++-- js/kiri-pack.js => src/moto/pack.js | 14 +- js/moto-space.js => src/moto/space.js | 11 +- js/moto-ui.js => src/moto/ui.js | 6 +- 110 files changed, 594 insertions(+), 683 deletions(-) delete mode 120000 js/ext-earcut.js delete mode 120000 js/ext-three.js delete mode 120000 js/ext-tween.js delete mode 120000 js/kiri-lang-en.js delete mode 100644 js/license.js rename js/add-array.js => src/add/array.js (100%) rename js/add-class.js => src/add/class.js (100%) rename js/add-three.js => src/add/three.js (100%) rename {web/kiri/filter/CAM => src/dev/cam}/Any.Generic.Grbl (69%) rename {web/kiri/filter/CAM => src/dev/cam}/Any.Generic.LinuxCNC (61%) rename {web/kiri/filter/CAM => src/dev/cam}/Any.Generic.TinyG (100%) rename {web/kiri/filter/CAM => src/dev/cam}/Carbide3D.Nomad.883Pro (71%) rename {web/kiri/filter/CAM => src/dev/cam}/Carbide3D.Shapeoko.3 (100%) rename {web/kiri/filter/CAM => src/dev/cam}/Carbide3D.Shapeoko.XL (100%) rename {web/kiri/filter/CAM => src/dev/cam}/Carbide3D.Shapeoko.XXL (100%) rename {web/kiri/filter/CAM => src/dev/cam}/Inventables.Carvey.Any (100%) rename {web/kiri/filter/CAM => src/dev/cam}/Inventables.XCarve.1000mm (100%) rename {web/kiri/filter/CAM => src/dev/cam}/Inventables.XCarve.500mm (100%) rename {web/kiri/filter/CAM => src/dev/cam}/Sienci.LongMill (100%) rename {web/kiri/filter/CAM => src/dev/cam}/Sienci.Mill.One (100%) rename {web/kiri/filter/CAM => src/dev/cam}/Techno.Davinci.CNC (100%) rename {web/kiri/filter/FDM => src/dev/fdm}/Any.Generic.Marlin (100%) rename {web/kiri/filter/FDM => src/dev/fdm}/Any.Generic.Sailfish (100%) rename {web/kiri/filter/FDM => src/dev/fdm}/Anycubic.i3.Mega (100%) rename {web/kiri/filter/FDM => src/dev/fdm}/Atom.v2 (100%) rename {web/kiri/filter/FDM => src/dev/fdm}/Creality.Ender.3 (100%) rename {web/kiri/filter/FDM => src/dev/fdm}/Creality.Ender.5 (100%) rename {web/kiri/filter/FDM => src/dev/fdm}/Cubicon.Single+ (100%) rename {web/kiri/filter/FDM => src/dev/fdm}/Cubicon.Style (100%) rename {web/kiri/filter/FDM => src/dev/fdm}/DeltaMaker.2T (100%) rename {web/kiri/filter/FDM => src/dev/fdm}/DeltaMaker.Original (100%) rename {web/kiri/filter/FDM => src/dev/fdm}/Flashforge.Finder (100%) rename {web/kiri/filter/FDM => src/dev/fdm}/Flashforge.Guider.II (100%) rename {web/kiri/filter/FDM => src/dev/fdm}/FolgerTech.FT5 (100%) rename {web/kiri/filter/FDM => src/dev/fdm}/GridBot.One (100%) rename {web/kiri/filter/FDM => src/dev/fdm}/GridBot.Two (100%) rename {web/kiri/filter/FDM => src/dev/fdm}/IMADE3D.JellyBOX.Original (100%) rename {web/kiri/filter/FDM => src/dev/fdm}/IMADE3D.JellyBOX2 (100%) rename {web/kiri/filter/FDM => src/dev/fdm}/Leapfrog.CreatrHS (100%) rename {web/kiri/filter/FDM => src/dev/fdm}/MakerGear.M2 (100%) rename {web/kiri/filter/FDM => src/dev/fdm}/Makerbot.Replicator2 (100%) rename {web/kiri/filter/FDM => src/dev/fdm}/Prusa.i3.MK2S (100%) rename {web/kiri/filter/FDM => src/dev/fdm}/Raise3D.N2 (100%) rename {web/kiri/filter/FDM => src/dev/fdm}/TypeA.Series1 (100%) rename {web/kiri/filter/FDM => src/dev/fdm}/TypeA.Series1Pro (100%) rename {web/kiri/filter/FDM => src/dev/fdm}/Ulio3D (100%) rename {web/kiri/filter/FDM => src/dev/fdm}/Ultimaker.Ultimaker2 (100%) rename {web/kiri/filter/FDM => src/dev/fdm}/Wanhao.Duplicator_4s (100%) rename {web/kiri/filter/FDM => src/dev/fdm}/Wanhao.Duplicator_5s (100%) rename {web/kiri/filter/FDM => src/dev/fdm}/Wanhao.Duplicator_6 (100%) rename {web/kiri/filter/FDM => src/dev/fdm}/Wanhao.Duplicator_i3 (100%) rename {web/kiri/filter/FDM => src/dev/fdm}/XYZ.daVinci.Jr.Pro (100%) rename {web/kiri/filter/FDM => src/dev/fdm}/XYZ.daVinci.Mini.w (100%) rename {web/kiri/filter/LASER => src/dev/laser}/Any.Generic.Laser (100%) rename {web/kiri/filter/LASER => src/dev/laser}/Glowforge (100%) rename {web/kiri/filter/SLA => src/dev/sla}/Anycubic.Photon (100%) rename {web/kiri/filter/SLA => src/dev/sla}/Anycubic.Photon.S (100%) rename js/ext-clip.js => src/ext/clip.js (100%) rename js/ext-clip2.js => src/ext/clip2.js (100%) create mode 120000 src/ext/earcut.js rename js/ext-fsave.js => src/ext/fsave.js (100%) rename js/ext-pngjs.js => src/ext/pngjs.js (100%) create mode 120000 src/ext/three.js create mode 120000 src/ext/tween.js rename js/geo.js => src/geo/base.js (94%) rename js/geo-bounds.js => src/geo/bounds.js (81%) rename js/geo-debug.js => src/geo/debug.js (94%) rename js/geo-gyroid.js => src/geo/gyroid.js (96%) rename js/geo-line.js => src/geo/line.js (90%) rename js/geo-point.js => src/geo/point.js (93%) rename js/geo-polygon.js => src/geo/polygon.js (94%) rename js/geo-polygons.js => src/geo/polygons.js (92%) rename js/geo-render.js => src/geo/render.js (86%) rename js/geo-slope.js => src/geo/slope.js (91%) rename js/geo-wasm.js => src/geo/wasm.js (97%) create mode 100644 src/kiri.js rename js/kiri-codec.js => src/kiri/codec.js (85%) rename js/kiri-conf.js => src/kiri/conf.js (99%) rename js/kiri-db.js => src/kiri/db.js (88%) rename js/kiri-export.js => src/kiri/export.js (98%) rename js/kiri-fill.js => src/kiri/fill.js (98%) rename js/kiri-icons.js => src/kiri/icons.js (99%) rename js/kiri-init.js => src/kiri/init.js (99%) create mode 120000 src/kiri/lang-en.js rename js/kiri-lang.js => src/kiri/lang.js (85%) rename js/kiri-layer.js => src/kiri/layer.js (98%) rename js/kiri.js => src/kiri/main.js (99%) rename js/kiri-print.js => src/kiri/print.js (99%) rename js/kiri-slice.js => src/kiri/slice.js (99%) rename js/kiri-slicer.js => src/kiri/slicer.js (99%) rename js/kiri-widget.js => src/kiri/widget.js (99%) rename js/kiri-work.js => src/kiri/work.js (97%) rename js/kiri-worker.js => src/kiri/worker.js (97%) create mode 100644 src/license.js rename {js => src}/meta.js (100%) rename js/kiri-driver-cam.js => src/mode/cam/driver.js (99%) rename js/kiri-driver-fdm.js => src/mode/fdm/driver.js (99%) rename js/kiri-driver-laser.js => src/mode/laser/driver.js (98%) rename js/kiri-driver-sla.js => src/mode/sla/driver.js (99%) rename js/moto-ajax.js => src/moto/ajax.js (90%) rename js/moto-ctrl.js => src/moto/ctrl.js (99%) rename js/moto-db.js => src/moto/db.js (91%) rename js/moto-kv.js => src/moto/kv.js (92%) rename js/moto-load-obj.js => src/moto/load-obj.js (94%) rename js/moto-load-stl.js => src/moto/load-stl.js (87%) rename js/kiri-pack.js => src/moto/pack.js (92%) rename js/moto-space.js => src/moto/space.js (99%) rename js/moto-ui.js => src/moto/ui.js (99%) diff --git a/app.js b/app.js index a30aa034..bafb9159 100644 --- a/app.js +++ b/app.js @@ -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(''); } diff --git a/js/ext-earcut.js b/js/ext-earcut.js deleted file mode 120000 index d0216466..00000000 --- a/js/ext-earcut.js +++ /dev/null @@ -1 +0,0 @@ -../node_modules/earcut/src/earcut.js \ No newline at end of file diff --git a/js/ext-three.js b/js/ext-three.js deleted file mode 120000 index a779ba04..00000000 --- a/js/ext-three.js +++ /dev/null @@ -1 +0,0 @@ -../node_modules/three/build/three.min.js \ No newline at end of file diff --git a/js/ext-tween.js b/js/ext-tween.js deleted file mode 120000 index 641b1dea..00000000 --- a/js/ext-tween.js +++ /dev/null @@ -1 +0,0 @@ -../node_modules/tween.js/index.js \ No newline at end of file diff --git a/js/kiri-lang-en.js b/js/kiri-lang-en.js deleted file mode 120000 index ec53fb5d..00000000 --- a/js/kiri-lang-en.js +++ /dev/null @@ -1 +0,0 @@ -../web/kiri/lang/en.js \ No newline at end of file diff --git a/js/license.js b/js/license.js deleted file mode 100644 index cd7f6c4f..00000000 --- a/js/license.js +++ /dev/null @@ -1,7 +0,0 @@ -var exports = { - COPYRIGHT:"Copyright (C) Stewart Allen - 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; diff --git a/notes.md b/notes.md index 08a63444..0cb048e9 100644 --- a/notes.md +++ b/notes.md @@ -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 diff --git a/js/add-array.js b/src/add/array.js similarity index 100% rename from js/add-array.js rename to src/add/array.js diff --git a/js/add-class.js b/src/add/class.js similarity index 100% rename from js/add-class.js rename to src/add/class.js diff --git a/js/add-three.js b/src/add/three.js similarity index 100% rename from js/add-three.js rename to src/add/three.js diff --git a/web/kiri/filter/CAM/Any.Generic.Grbl b/src/dev/cam/Any.Generic.Grbl similarity index 69% rename from web/kiri/filter/CAM/Any.Generic.Grbl rename to src/dev/cam/Any.Generic.Grbl index 439356cf..5341c0ef 100644 --- a/web/kiri/filter/CAM/Any.Generic.Grbl +++ b/src/dev/cam/Any.Generic.Grbl @@ -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 + } } diff --git a/web/kiri/filter/CAM/Any.Generic.LinuxCNC b/src/dev/cam/Any.Generic.LinuxCNC similarity index 61% rename from web/kiri/filter/CAM/Any.Generic.LinuxCNC rename to src/dev/cam/Any.Generic.LinuxCNC index 7ff81803..e7ad43f9 100644 --- a/web/kiri/filter/CAM/Any.Generic.LinuxCNC +++ b/src/dev/cam/Any.Generic.LinuxCNC @@ -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 + } } diff --git a/web/kiri/filter/CAM/Any.Generic.TinyG b/src/dev/cam/Any.Generic.TinyG similarity index 100% rename from web/kiri/filter/CAM/Any.Generic.TinyG rename to src/dev/cam/Any.Generic.TinyG diff --git a/web/kiri/filter/CAM/Carbide3D.Nomad.883Pro b/src/dev/cam/Carbide3D.Nomad.883Pro similarity index 71% rename from web/kiri/filter/CAM/Carbide3D.Nomad.883Pro rename to src/dev/cam/Carbide3D.Nomad.883Pro index 4bd60a1a..fd8f0378 100644 --- a/web/kiri/filter/CAM/Carbide3D.Nomad.883Pro +++ b/src/dev/cam/Carbide3D.Nomad.883Pro @@ -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 + } } diff --git a/web/kiri/filter/CAM/Carbide3D.Shapeoko.3 b/src/dev/cam/Carbide3D.Shapeoko.3 similarity index 100% rename from web/kiri/filter/CAM/Carbide3D.Shapeoko.3 rename to src/dev/cam/Carbide3D.Shapeoko.3 diff --git a/web/kiri/filter/CAM/Carbide3D.Shapeoko.XL b/src/dev/cam/Carbide3D.Shapeoko.XL similarity index 100% rename from web/kiri/filter/CAM/Carbide3D.Shapeoko.XL rename to src/dev/cam/Carbide3D.Shapeoko.XL diff --git a/web/kiri/filter/CAM/Carbide3D.Shapeoko.XXL b/src/dev/cam/Carbide3D.Shapeoko.XXL similarity index 100% rename from web/kiri/filter/CAM/Carbide3D.Shapeoko.XXL rename to src/dev/cam/Carbide3D.Shapeoko.XXL diff --git a/web/kiri/filter/CAM/Inventables.Carvey.Any b/src/dev/cam/Inventables.Carvey.Any similarity index 100% rename from web/kiri/filter/CAM/Inventables.Carvey.Any rename to src/dev/cam/Inventables.Carvey.Any diff --git a/web/kiri/filter/CAM/Inventables.XCarve.1000mm b/src/dev/cam/Inventables.XCarve.1000mm similarity index 100% rename from web/kiri/filter/CAM/Inventables.XCarve.1000mm rename to src/dev/cam/Inventables.XCarve.1000mm diff --git a/web/kiri/filter/CAM/Inventables.XCarve.500mm b/src/dev/cam/Inventables.XCarve.500mm similarity index 100% rename from web/kiri/filter/CAM/Inventables.XCarve.500mm rename to src/dev/cam/Inventables.XCarve.500mm diff --git a/web/kiri/filter/CAM/Sienci.LongMill b/src/dev/cam/Sienci.LongMill similarity index 100% rename from web/kiri/filter/CAM/Sienci.LongMill rename to src/dev/cam/Sienci.LongMill diff --git a/web/kiri/filter/CAM/Sienci.Mill.One b/src/dev/cam/Sienci.Mill.One similarity index 100% rename from web/kiri/filter/CAM/Sienci.Mill.One rename to src/dev/cam/Sienci.Mill.One diff --git a/web/kiri/filter/CAM/Techno.Davinci.CNC b/src/dev/cam/Techno.Davinci.CNC similarity index 100% rename from web/kiri/filter/CAM/Techno.Davinci.CNC rename to src/dev/cam/Techno.Davinci.CNC diff --git a/web/kiri/filter/FDM/Any.Generic.Marlin b/src/dev/fdm/Any.Generic.Marlin similarity index 100% rename from web/kiri/filter/FDM/Any.Generic.Marlin rename to src/dev/fdm/Any.Generic.Marlin diff --git a/web/kiri/filter/FDM/Any.Generic.Sailfish b/src/dev/fdm/Any.Generic.Sailfish similarity index 100% rename from web/kiri/filter/FDM/Any.Generic.Sailfish rename to src/dev/fdm/Any.Generic.Sailfish diff --git a/web/kiri/filter/FDM/Anycubic.i3.Mega b/src/dev/fdm/Anycubic.i3.Mega similarity index 100% rename from web/kiri/filter/FDM/Anycubic.i3.Mega rename to src/dev/fdm/Anycubic.i3.Mega diff --git a/web/kiri/filter/FDM/Atom.v2 b/src/dev/fdm/Atom.v2 similarity index 100% rename from web/kiri/filter/FDM/Atom.v2 rename to src/dev/fdm/Atom.v2 diff --git a/web/kiri/filter/FDM/Creality.Ender.3 b/src/dev/fdm/Creality.Ender.3 similarity index 100% rename from web/kiri/filter/FDM/Creality.Ender.3 rename to src/dev/fdm/Creality.Ender.3 diff --git a/web/kiri/filter/FDM/Creality.Ender.5 b/src/dev/fdm/Creality.Ender.5 similarity index 100% rename from web/kiri/filter/FDM/Creality.Ender.5 rename to src/dev/fdm/Creality.Ender.5 diff --git a/web/kiri/filter/FDM/Cubicon.Single+ b/src/dev/fdm/Cubicon.Single+ similarity index 100% rename from web/kiri/filter/FDM/Cubicon.Single+ rename to src/dev/fdm/Cubicon.Single+ diff --git a/web/kiri/filter/FDM/Cubicon.Style b/src/dev/fdm/Cubicon.Style similarity index 100% rename from web/kiri/filter/FDM/Cubicon.Style rename to src/dev/fdm/Cubicon.Style diff --git a/web/kiri/filter/FDM/DeltaMaker.2T b/src/dev/fdm/DeltaMaker.2T similarity index 100% rename from web/kiri/filter/FDM/DeltaMaker.2T rename to src/dev/fdm/DeltaMaker.2T diff --git a/web/kiri/filter/FDM/DeltaMaker.Original b/src/dev/fdm/DeltaMaker.Original similarity index 100% rename from web/kiri/filter/FDM/DeltaMaker.Original rename to src/dev/fdm/DeltaMaker.Original diff --git a/web/kiri/filter/FDM/Flashforge.Finder b/src/dev/fdm/Flashforge.Finder similarity index 100% rename from web/kiri/filter/FDM/Flashforge.Finder rename to src/dev/fdm/Flashforge.Finder diff --git a/web/kiri/filter/FDM/Flashforge.Guider.II b/src/dev/fdm/Flashforge.Guider.II similarity index 100% rename from web/kiri/filter/FDM/Flashforge.Guider.II rename to src/dev/fdm/Flashforge.Guider.II diff --git a/web/kiri/filter/FDM/FolgerTech.FT5 b/src/dev/fdm/FolgerTech.FT5 similarity index 100% rename from web/kiri/filter/FDM/FolgerTech.FT5 rename to src/dev/fdm/FolgerTech.FT5 diff --git a/web/kiri/filter/FDM/GridBot.One b/src/dev/fdm/GridBot.One similarity index 100% rename from web/kiri/filter/FDM/GridBot.One rename to src/dev/fdm/GridBot.One diff --git a/web/kiri/filter/FDM/GridBot.Two b/src/dev/fdm/GridBot.Two similarity index 100% rename from web/kiri/filter/FDM/GridBot.Two rename to src/dev/fdm/GridBot.Two diff --git a/web/kiri/filter/FDM/IMADE3D.JellyBOX.Original b/src/dev/fdm/IMADE3D.JellyBOX.Original similarity index 100% rename from web/kiri/filter/FDM/IMADE3D.JellyBOX.Original rename to src/dev/fdm/IMADE3D.JellyBOX.Original diff --git a/web/kiri/filter/FDM/IMADE3D.JellyBOX2 b/src/dev/fdm/IMADE3D.JellyBOX2 similarity index 100% rename from web/kiri/filter/FDM/IMADE3D.JellyBOX2 rename to src/dev/fdm/IMADE3D.JellyBOX2 diff --git a/web/kiri/filter/FDM/Leapfrog.CreatrHS b/src/dev/fdm/Leapfrog.CreatrHS similarity index 100% rename from web/kiri/filter/FDM/Leapfrog.CreatrHS rename to src/dev/fdm/Leapfrog.CreatrHS diff --git a/web/kiri/filter/FDM/MakerGear.M2 b/src/dev/fdm/MakerGear.M2 similarity index 100% rename from web/kiri/filter/FDM/MakerGear.M2 rename to src/dev/fdm/MakerGear.M2 diff --git a/web/kiri/filter/FDM/Makerbot.Replicator2 b/src/dev/fdm/Makerbot.Replicator2 similarity index 100% rename from web/kiri/filter/FDM/Makerbot.Replicator2 rename to src/dev/fdm/Makerbot.Replicator2 diff --git a/web/kiri/filter/FDM/Prusa.i3.MK2S b/src/dev/fdm/Prusa.i3.MK2S similarity index 100% rename from web/kiri/filter/FDM/Prusa.i3.MK2S rename to src/dev/fdm/Prusa.i3.MK2S diff --git a/web/kiri/filter/FDM/Raise3D.N2 b/src/dev/fdm/Raise3D.N2 similarity index 100% rename from web/kiri/filter/FDM/Raise3D.N2 rename to src/dev/fdm/Raise3D.N2 diff --git a/web/kiri/filter/FDM/TypeA.Series1 b/src/dev/fdm/TypeA.Series1 similarity index 100% rename from web/kiri/filter/FDM/TypeA.Series1 rename to src/dev/fdm/TypeA.Series1 diff --git a/web/kiri/filter/FDM/TypeA.Series1Pro b/src/dev/fdm/TypeA.Series1Pro similarity index 100% rename from web/kiri/filter/FDM/TypeA.Series1Pro rename to src/dev/fdm/TypeA.Series1Pro diff --git a/web/kiri/filter/FDM/Ulio3D b/src/dev/fdm/Ulio3D similarity index 100% rename from web/kiri/filter/FDM/Ulio3D rename to src/dev/fdm/Ulio3D diff --git a/web/kiri/filter/FDM/Ultimaker.Ultimaker2 b/src/dev/fdm/Ultimaker.Ultimaker2 similarity index 100% rename from web/kiri/filter/FDM/Ultimaker.Ultimaker2 rename to src/dev/fdm/Ultimaker.Ultimaker2 diff --git a/web/kiri/filter/FDM/Wanhao.Duplicator_4s b/src/dev/fdm/Wanhao.Duplicator_4s similarity index 100% rename from web/kiri/filter/FDM/Wanhao.Duplicator_4s rename to src/dev/fdm/Wanhao.Duplicator_4s diff --git a/web/kiri/filter/FDM/Wanhao.Duplicator_5s b/src/dev/fdm/Wanhao.Duplicator_5s similarity index 100% rename from web/kiri/filter/FDM/Wanhao.Duplicator_5s rename to src/dev/fdm/Wanhao.Duplicator_5s diff --git a/web/kiri/filter/FDM/Wanhao.Duplicator_6 b/src/dev/fdm/Wanhao.Duplicator_6 similarity index 100% rename from web/kiri/filter/FDM/Wanhao.Duplicator_6 rename to src/dev/fdm/Wanhao.Duplicator_6 diff --git a/web/kiri/filter/FDM/Wanhao.Duplicator_i3 b/src/dev/fdm/Wanhao.Duplicator_i3 similarity index 100% rename from web/kiri/filter/FDM/Wanhao.Duplicator_i3 rename to src/dev/fdm/Wanhao.Duplicator_i3 diff --git a/web/kiri/filter/FDM/XYZ.daVinci.Jr.Pro b/src/dev/fdm/XYZ.daVinci.Jr.Pro similarity index 100% rename from web/kiri/filter/FDM/XYZ.daVinci.Jr.Pro rename to src/dev/fdm/XYZ.daVinci.Jr.Pro diff --git a/web/kiri/filter/FDM/XYZ.daVinci.Mini.w b/src/dev/fdm/XYZ.daVinci.Mini.w similarity index 100% rename from web/kiri/filter/FDM/XYZ.daVinci.Mini.w rename to src/dev/fdm/XYZ.daVinci.Mini.w diff --git a/web/kiri/filter/LASER/Any.Generic.Laser b/src/dev/laser/Any.Generic.Laser similarity index 100% rename from web/kiri/filter/LASER/Any.Generic.Laser rename to src/dev/laser/Any.Generic.Laser diff --git a/web/kiri/filter/LASER/Glowforge b/src/dev/laser/Glowforge similarity index 100% rename from web/kiri/filter/LASER/Glowforge rename to src/dev/laser/Glowforge diff --git a/web/kiri/filter/SLA/Anycubic.Photon b/src/dev/sla/Anycubic.Photon similarity index 100% rename from web/kiri/filter/SLA/Anycubic.Photon rename to src/dev/sla/Anycubic.Photon diff --git a/web/kiri/filter/SLA/Anycubic.Photon.S b/src/dev/sla/Anycubic.Photon.S similarity index 100% rename from web/kiri/filter/SLA/Anycubic.Photon.S rename to src/dev/sla/Anycubic.Photon.S diff --git a/js/ext-clip.js b/src/ext/clip.js similarity index 100% rename from js/ext-clip.js rename to src/ext/clip.js diff --git a/js/ext-clip2.js b/src/ext/clip2.js similarity index 100% rename from js/ext-clip2.js rename to src/ext/clip2.js diff --git a/src/ext/earcut.js b/src/ext/earcut.js new file mode 120000 index 00000000..980715ff --- /dev/null +++ b/src/ext/earcut.js @@ -0,0 +1 @@ +../../node_modules/earcut/src/earcut.js \ No newline at end of file diff --git a/js/ext-fsave.js b/src/ext/fsave.js similarity index 100% rename from js/ext-fsave.js rename to src/ext/fsave.js diff --git a/js/ext-pngjs.js b/src/ext/pngjs.js similarity index 100% rename from js/ext-pngjs.js rename to src/ext/pngjs.js diff --git a/src/ext/three.js b/src/ext/three.js new file mode 120000 index 00000000..5f15cbdf --- /dev/null +++ b/src/ext/three.js @@ -0,0 +1 @@ +../../node_modules/three/build/three.min.js \ No newline at end of file diff --git a/src/ext/tween.js b/src/ext/tween.js new file mode 120000 index 00000000..15b834b0 --- /dev/null +++ b/src/ext/tween.js @@ -0,0 +1 @@ +../../node_modules/tween.js/index.js \ No newline at end of file diff --git a/js/geo.js b/src/geo/base.js similarity index 94% rename from js/geo.js rename to src/geo/base.js index f2444522..16db1b62 100644 --- a/js/geo.js +++ b/src/geo/base.js @@ -1,22 +1,19 @@ -/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */ +/** Copyright Stewart Allen -- 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); diff --git a/js/geo-bounds.js b/src/geo/bounds.js similarity index 81% rename from js/geo-bounds.js rename to src/geo/bounds.js index 739ec3ee..9b6b6744 100644 --- a/js/geo-bounds.js +++ b/src/geo/bounds.js @@ -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() ); }; diff --git a/js/geo-debug.js b/src/geo/debug.js similarity index 94% rename from js/geo-debug.js rename to src/geo/debug.js index 4bd0b103..bbb156c7 100644 --- a/js/geo-debug.js +++ b/src/geo/debug.js @@ -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 -- 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, diff --git a/js/geo-point.js b/src/geo/point.js similarity index 93% rename from js/geo-point.js rename to src/geo/point.js index 8c686014..5da90311 100644 --- a/js/geo-point.js +++ b/src/geo/point.js @@ -1,14 +1,21 @@ -/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */ +/** Copyright Stewart Allen -- 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 0; if ((c.x - a.x) * as_y - (c.y - a.y) * as_x > 0 == s_ab) return false; diff --git a/js/geo-polygon.js b/src/geo/polygon.js similarity index 94% rename from js/geo-polygon.js rename to src/geo/polygon.js index 3f984619..740fe42f 100644 --- a/js/geo-polygon.js +++ b/src/geo/polygon.js @@ -1,15 +1,12 @@ -/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */ +/** Copyright Stewart Allen -- 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 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 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; diff --git a/js/geo-polygons.js b/src/geo/polygons.js similarity index 92% rename from js/geo-polygons.js rename to src/geo/polygons.js index 2ea4ac83..0db32a36 100644 --- a/js/geo-polygons.js +++ b/src/geo/polygons.js @@ -1,15 +1,13 @@ -/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */ +/** Copyright Stewart Allen -- 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 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); } diff --git a/js/geo-render.js b/src/geo/render.js similarity index 86% rename from js/geo-render.js rename to src/geo/render.js index b21bd943..866fcc1b 100644 --- a/js/geo-render.js +++ b/src/geo/render.js @@ -1,17 +1,15 @@ -/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */ +/** Copyright Stewart Allen -- 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, diff --git a/js/geo-slope.js b/src/geo/slope.js similarity index 91% rename from js/geo-slope.js rename to src/geo/slope.js index 565a698c..93f747d1 100644 --- a/js/geo-slope.js +++ b/src/geo/slope.js @@ -1,14 +1,27 @@ -/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */ +/** Copyright Stewart Allen -- 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; diff --git a/js/geo-wasm.js b/src/geo/wasm.js similarity index 97% rename from js/geo-wasm.js rename to src/geo/wasm.js index 0f75c0df..5a9cc260 100644 --- a/js/geo-wasm.js +++ b/src/geo/wasm.js @@ -1,10 +1,9 @@ +/** Copyright Stewart Allen -- 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 = {}; diff --git a/src/kiri.js b/src/kiri.js new file mode 100644 index 00000000..83708208 --- /dev/null +++ b/src/kiri.js @@ -0,0 +1,11 @@ +/** Copyright Stewart Allen -- All Rights Reserved */ + +"use strict"; + +(function () { + + if (self.kiri) return; + + self.kiri = { }; + +})(); diff --git a/js/kiri-codec.js b/src/kiri/codec.js similarity index 85% rename from js/kiri-codec.js rename to src/kiri/codec.js index f0488ec2..bdb1977a 100644 --- a/js/kiri-codec.js +++ b/src/kiri/codec.js @@ -1,19 +1,14 @@ -/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */ +/** Copyright Stewart Allen -- 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; diff --git a/js/kiri-conf.js b/src/kiri/conf.js similarity index 99% rename from js/kiri-conf.js rename to src/kiri/conf.js index 566f46c4..b1463eb4 100644 --- a/js/kiri-conf.js +++ b/src/kiri/conf.js @@ -1,17 +1,12 @@ -/** Copyright Stewart Allen -- All Rights Reserved */ +/** Copyright Stewart Allen -- 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) { diff --git a/js/kiri-db.js b/src/kiri/db.js similarity index 88% rename from js/kiri-db.js rename to src/kiri/db.js index 74948c18..12c05ceb 100644 --- a/js/kiri-db.js +++ b/src/kiri/db.js @@ -1,18 +1,16 @@ -/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */ +/** Copyright Stewart Allen -- 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 -- 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) { diff --git a/js/kiri-fill.js b/src/kiri/fill.js similarity index 98% rename from js/kiri-fill.js rename to src/kiri/fill.js index 6e1572dc..daf825d4 100644 --- a/js/kiri-fill.js +++ b/src/kiri/fill.js @@ -1,15 +1,12 @@ -/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */ +/** Copyright Stewart Allen -- 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, diff --git a/js/kiri-icons.js b/src/kiri/icons.js similarity index 99% rename from js/kiri-icons.js rename to src/kiri/icons.js index 715de671..c791e6d4 100644 --- a/js/kiri-icons.js +++ b/src/kiri/icons.js @@ -1,10 +1,9 @@ -"use strict"; +/** Copyright Stewart Allen -- 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=='), diff --git a/js/kiri-init.js b/src/kiri/init.js similarity index 99% rename from js/kiri-init.js rename to src/kiri/init.js index 4a0a95e9..32c11f35 100644 --- a/js/kiri-init.js +++ b/src/kiri/init.js @@ -1,15 +1,12 @@ -/** Copyright Stewart Allen -- All Rights Reserved */ +/** Copyright Stewart Allen -- 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) { diff --git a/src/kiri/lang-en.js b/src/kiri/lang-en.js new file mode 120000 index 00000000..92cc3a27 --- /dev/null +++ b/src/kiri/lang-en.js @@ -0,0 +1 @@ +../../web/kiri/lang/en.js \ No newline at end of file diff --git a/js/kiri-lang.js b/src/kiri/lang.js similarity index 85% rename from js/kiri-lang.js rename to src/kiri/lang.js index d130eec3..d5fe584c 100644 --- a/js/kiri-lang.js +++ b/src/kiri/lang.js @@ -1,17 +1,14 @@ -/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */ +/** Copyright Stewart Allen -- 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; diff --git a/js/kiri-layer.js b/src/kiri/layer.js similarity index 98% rename from js/kiri-layer.js rename to src/kiri/layer.js index 68a24552..b0e6cbcb 100644 --- a/js/kiri-layer.js +++ b/src/kiri/layer.js @@ -1,15 +1,12 @@ -/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */ +/** Copyright Stewart Allen -- 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 = {}; diff --git a/js/kiri.js b/src/kiri/main.js similarity index 99% rename from js/kiri.js rename to src/kiri/main.js index 860c4aa9..6fd6f6b9 100644 --- a/js/kiri.js +++ b/src/kiri/main.js @@ -1,10 +1,6 @@ -/** Copyright Stewart Allen -- All Rights Reserved */ -"use strict"; +/** Copyright Stewart Allen -- 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 () { diff --git a/js/kiri-print.js b/src/kiri/print.js similarity index 99% rename from js/kiri-print.js rename to src/kiri/print.js index 5e2e5dae..a4f4d558 100644 --- a/js/kiri-print.js +++ b/src/kiri/print.js @@ -1,14 +1,12 @@ -/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */ +/** Copyright Stewart Allen -- 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) { diff --git a/js/kiri-slice.js b/src/kiri/slice.js similarity index 99% rename from js/kiri-slice.js rename to src/kiri/slice.js index 2a19eac3..c38e1394 100644 --- a/js/kiri-slice.js +++ b/src/kiri/slice.js @@ -1,26 +1,21 @@ -/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */ +/** Copyright Stewart Allen -- 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, diff --git a/js/kiri-slicer.js b/src/kiri/slicer.js similarity index 99% rename from js/kiri-slicer.js rename to src/kiri/slicer.js index a0636b9b..16f8d7f4 100644 --- a/js/kiri-slicer.js +++ b/src/kiri/slicer.js @@ -1,15 +1,12 @@ -/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */ +/** Copyright Stewart Allen -- 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 diff --git a/js/kiri-widget.js b/src/kiri/widget.js similarity index 99% rename from js/kiri-widget.js rename to src/kiri/widget.js index da3a36a0..e84c6f04 100644 --- a/js/kiri-widget.js +++ b/src/kiri/widget.js @@ -1,15 +1,12 @@ -/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */ +/** Copyright Stewart Allen -- 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; diff --git a/js/kiri-work.js b/src/kiri/work.js similarity index 97% rename from js/kiri-work.js rename to src/kiri/work.js index 5ff1ee77..ee8e2e1a 100644 --- a/js/kiri-work.js +++ b/src/kiri/work.js @@ -1,4 +1,5 @@ -/** Copyright Stewart Allen -- All Rights Reserved */ +/** Copyright Stewart Allen -- 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(), diff --git a/js/kiri-worker.js b/src/kiri/worker.js similarity index 97% rename from js/kiri-worker.js rename to src/kiri/worker.js index 481538f9..d866eaf7 100644 --- a/js/kiri-worker.js +++ b/src/kiri/worker.js @@ -1,16 +1,17 @@ -/** Copyright Stewart Allen -- All Rights Reserved */ +/** Copyright Stewart Allen -- 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 = {}; diff --git a/src/license.js b/src/license.js new file mode 100644 index 00000000..ddb37960 --- /dev/null +++ b/src/license.js @@ -0,0 +1,19 @@ +(function() { + + let terms = { + COPYRIGHT: "Copyright (C) Stewart Allen - 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 }; + } + +})(); diff --git a/js/meta.js b/src/meta.js similarity index 100% rename from js/meta.js rename to src/meta.js diff --git a/js/kiri-driver-cam.js b/src/mode/cam/driver.js similarity index 99% rename from js/kiri-driver-cam.js rename to src/mode/cam/driver.js index 2510e914..09e83e13 100644 --- a/js/kiri-driver-cam.js +++ b/src/mode/cam/driver.js @@ -1,16 +1,13 @@ -/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */ +/** Copyright Stewart Allen -- 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, diff --git a/js/kiri-driver-fdm.js b/src/mode/fdm/driver.js similarity index 99% rename from js/kiri-driver-fdm.js rename to src/mode/fdm/driver.js index 8c04d408..3b371d9f 100644 --- a/js/kiri-driver-fdm.js +++ b/src/mode/fdm/driver.js @@ -1,16 +1,13 @@ -/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */ +/** Copyright Stewart Allen -- 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, diff --git a/js/kiri-driver-laser.js b/src/mode/laser/driver.js similarity index 98% rename from js/kiri-driver-laser.js rename to src/mode/laser/driver.js index 5f18be6d..ecf1fb10 100644 --- a/js/kiri-driver-laser.js +++ b/src/mode/laser/driver.js @@ -1,16 +1,13 @@ -/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */ +/** Copyright Stewart Allen -- 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, diff --git a/js/kiri-driver-sla.js b/src/mode/sla/driver.js similarity index 99% rename from js/kiri-driver-sla.js rename to src/mode/sla/driver.js index d60fc48d..d0386876 100644 --- a/js/kiri-driver-sla.js +++ b/src/mode/sla/driver.js @@ -1,16 +1,13 @@ -/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */ +/** Copyright Stewart Allen -- All Rights Reserved */ "use strict"; -let gs_kiri_sla = exports; - (function() { - if (!self.kiri) self.kiri = { }; if (!self.kiri.driver) self.kiri.driver = { }; if (self.kiri.driver.SLA) return; - let KIRI = self.kiri, + const KIRI = self.kiri, BASE = self.base, DBUG = BASE.debug, UTIL = BASE.util, @@ -28,8 +25,9 @@ let gs_kiri_sla = exports; newTop = KIRI.newTop, newSlice = KIRI.newSlice, newPoint = BASE.newPoint, - newPolygon = BASE.newPolygon, - preview, + newPolygon = BASE.newPolygon; + + let preview, previewSmall, previewLarge, fill_cache, diff --git a/js/moto-ajax.js b/src/moto/ajax.js similarity index 90% rename from js/moto-ajax.js rename to src/moto/ajax.js index 03586d81..c414669a 100644 --- a/js/moto-ajax.js +++ b/src/moto/ajax.js @@ -1,15 +1,13 @@ -/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */ +/** Copyright Stewart Allen -- All Rights Reserved */ "use strict"; -let gs_moto_ajax = exports; - (function() { - let MOTO = self.moto; - if (!MOTO) MOTO = self.moto = {}; + if (!self.moto) self.moto = {}; + if (self.moto.Ajax) return; - if (MOTO.Ajax) return; + const MOTO = self.moto; MOTO.Ajax = Ajax; @@ -17,7 +15,7 @@ let gs_moto_ajax = exports; new Ajax(handler).request(url); }; - let AP = Ajax.prototype, + const AP = Ajax.prototype, KV = moto.KV, KEY = "moto-ajax", TIME = function() { return new Date().getTime() }, @@ -30,7 +28,7 @@ let gs_moto_ajax = exports; KV.setItem(KEY, MOKEY); - let STATES = [ + const STATES = [ "request not initialized", // 0 "server connection established", // 1 "request recieved", // 2 diff --git a/js/moto-ctrl.js b/src/moto/ctrl.js similarity index 99% rename from js/moto-ctrl.js rename to src/moto/ctrl.js index 29d5d7d7..068695f9 100644 --- a/js/moto-ctrl.js +++ b/src/moto/ctrl.js @@ -1,9 +1,8 @@ -/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */ +/** Copyright Stewart Allen -- All Rights Reserved */ "use strict"; -let gs_moto_ctrl = exports; -var MOTO = window.moto = window.moto || {}; +let MOTO = self.moto = self.moto || {}; /** * Adapted from THREE.OrbitControls diff --git a/js/moto-db.js b/src/moto/db.js similarity index 91% rename from js/moto-db.js rename to src/moto/db.js index 82848f92..20a708d0 100644 --- a/js/moto-db.js +++ b/src/moto/db.js @@ -1,9 +1,7 @@ -/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */ +/** Copyright Stewart Allen -- All Rights Reserved */ "use strict"; -var gs_moto_db = exports; - (function() { if (!self.moto) self.moto = {}; @@ -13,7 +11,7 @@ var gs_moto_db = exports; // https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API - var IDB = self.indexedDB || self.mozIndexedDB || self.webkitIndexedDB || self.msIndexedDB, + let IDB = self.indexedDB || self.mozIndexedDB || self.webkitIndexedDB || self.msIndexedDB, IRR = self.IDBKeyRange, local = null; @@ -34,14 +32,14 @@ var gs_moto_db = exports; IDB.deleteDatabase(dbname); }; - var SP = Storage.prototype; + let SP = Storage.prototype; /** ****************************************************************** * indexedDB implementation ******************************************************************* */ SP.keys = function(callback, lower, upper) { - var out = []; + let out = []; this.iterate(function(k,v) { if (k === null) { callback(out); @@ -56,12 +54,12 @@ var gs_moto_db = exports; this.init(); return this.queue.push(["iterate", callback, lower, upper]); } - var range = lower && upper ? IRR.bound(lower,upper) : + let range = lower && upper ? IRR.bound(lower,upper) : lower ? IRR.lowerBound(lower) : upper ? IRR.upperBound(upper) : undefined; // iterate over all db values for debugging this.db.transaction(this.name).objectStore(this.name).openCursor(range).onsuccess = function(event) { - var cursor = event.target.result; + let cursor = event.target.result; if (cursor) { callback(cursor.key,cursor.value); cursor.continue(); @@ -80,7 +78,7 @@ var gs_moto_db = exports; SP.init = function(deleteOS) { if (this.initCalled) return; - var storage = this, + let storage = this, name = this.name, request = null; @@ -125,7 +123,7 @@ var gs_moto_db = exports; SP.runQueue = function() { if (this.queue.length > 0) { - var i = 0, q = this.queue, e; + let i = 0, q = this.queue, e; while (i < q.length) { e = q[i++]; switch (e[0]) { @@ -151,7 +149,7 @@ var gs_moto_db = exports; return this.queue.push(['put', key, value, callback]); } try { - var req = this.db.transaction(this.name, "readwrite").objectStore(this.name).put(value, key); + let req = this.db.transaction(this.name, "readwrite").objectStore(this.name).put(value, key); if (callback) { req.onsuccess = function(event) { callback(true) }; req.onerror = function(event) { callback(false) }; @@ -172,7 +170,7 @@ var gs_moto_db = exports; return this.queue.push(['get', key, callback]); } try { - var req = this.db.transaction(this.name).objectStore(this.name).get(key); + let req = this.db.transaction(this.name).objectStore(this.name).get(key); if (callback) { req.onsuccess = function(event) { callback(req.result) }; req.onerror = function(event) { callback(null) }; @@ -194,7 +192,7 @@ var gs_moto_db = exports; return this.queue.push(['remove', key, callback]); } try { - var req = this.db.transaction(this.name, "readwrite").objectStore(this.name).delete(key); + let req = this.db.transaction(this.name, "readwrite").objectStore(this.name).delete(key); if (callback) { req.onsuccess = function(event) { callback(true) }; req.onerror = function(event) { callback(false) }; diff --git a/js/moto-kv.js b/src/moto/kv.js similarity index 92% rename from js/moto-kv.js rename to src/moto/kv.js index 6131bed4..719d64c8 100644 --- a/js/moto-kv.js +++ b/src/moto/kv.js @@ -1,9 +1,7 @@ -/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */ +/** Copyright Stewart Allen -- All Rights Reserved */ "use strict"; -var gs_moto_kv = exports; - (function() { if (!self.moto) self.moto = {}; diff --git a/js/moto-load-obj.js b/src/moto/load-obj.js similarity index 94% rename from js/moto-load-obj.js rename to src/moto/load-obj.js index f570cb5f..1e8f508c 100644 --- a/js/moto-load-obj.js +++ b/src/moto/load-obj.js @@ -3,11 +3,13 @@ * * https://en.wikipedia.org/wiki/Wavefront_.obj_file */ + 'use strict'; (function() { if (!self.moto) self.moto = {}; + if (self.moto.OBJ) return; self.moto.OBJ = { parse : parse @@ -19,23 +21,23 @@ */ function parse(text) { - var object, + let object, objects = [], geometry, material; function parseVertexIndex(value) { - var index = parseInt(value); + let index = parseInt(value); return (index >= 0 ? index - 1 : index + vertices.length / 3) * 3; } function parseNormalIndex(value) { - var index = parseInt(value); + let index = parseInt(value); return (index >= 0 ? index - 1 : index + normals.length / 3) * 3; } function parseUVIndex(value) { - var index = parseInt(value); + let index = parseInt(value); return (index >= 0 ? index - 1 : index + uvs.length / 2) * 2; } @@ -65,10 +67,10 @@ function addFace(a, b, c, d, ua, ub, uc, ud, na, nb, nc, nd) { - var ia = parseVertexIndex(a); - var ib = parseVertexIndex(b); - var ic = parseVertexIndex(c); - var id; + let ia = parseVertexIndex(a); + let ib = parseVertexIndex(b); + let ic = parseVertexIndex(c); + let id; if (d === undefined) { addVertex(ia, ib, ic); @@ -124,7 +126,7 @@ objects.push(object); } - var vertices = [], + let vertices = [], normals = [], uvs = [], // v float float float @@ -144,12 +146,12 @@ // split text into lines lines = text.split('\n'); - for (var i = 0; i < lines.length; i++) { + for (let i = 0; i < lines.length; i++) { - var line = lines[i]; + let line = lines[i]; line = line.trim(); - var result; + let result; if (line.length === 0 || line.charAt(0) === '#') { continue; diff --git a/js/moto-load-stl.js b/src/moto/load-stl.js similarity index 87% rename from js/moto-load-stl.js rename to src/moto/load-stl.js index 539e666a..49fe09bf 100644 --- a/js/moto-load-stl.js +++ b/src/moto/load-stl.js @@ -3,10 +3,18 @@ * * https://en.wikipedia.org/wiki/STL_(file_format) */ + 'use strict'; (function() { + if (!self.moto) self.moto = {}; + if (self.moto.STL) return; + + const SP = STL.prototype; + + self.moto.STL = STL; + /** * @constructor */ @@ -16,14 +24,9 @@ this.colors = null; } - var SP = STL.prototype; - - if (!self.moto) self.moto = {}; - - self.moto.STL = STL; SP.load = function(url, callback) { - var stl = this, + let stl = this, xhr = new XMLHttpRequest(); function onloaded (event) { @@ -51,7 +54,7 @@ SP.encode = function(vertices, normals) { if (!(vertices && vertices.length % 3 === 0)) throw "invalid vertices"; - var vc = vertices.length / 3, + let vc = vertices.length / 3, bs = (vc * 16) + (vc * (2/3)) + 84, bin = new ArrayBuffer(bs), writer = new DataView(bin), @@ -95,10 +98,10 @@ }; SP.parse = function(data) { - var binData = this.convertToBinary(data); + let binData = this.convertToBinary(data); - var isBinary = function () { - var expect, face_size, n_faces, reader; + let isBinary = function () { + let expect, face_size, n_faces, reader; reader = new DataView(binData); face_size = (32 / 8 * 3) + ((32 / 8 * 3) * 3) + (16 / 8); n_faces = reader.getUint32(80,true); @@ -112,13 +115,13 @@ }; SP.parseBinary = function(data) { - var reader = new DataView(data), + let reader = new DataView(data), faces = reader.getUint32 (80, true), r, g, b, hasColors = false, colors, defaultR, defaultG, defaultB, alpha; // check for default color in STL header ("COLOR=rgba" sequence). - for (var index = 0; index < 80 - 10; index++) { + for (let index = 0; index < 80 - 10; index++) { if ((reader.getUint32(index, false) == 0x434F4C4F /*COLO*/) && (reader.getUint8(index + 4) == 0x52 /*'R'*/) && (reader.getUint8(index + 5) == 0x3D /*'='*/)) { @@ -131,22 +134,23 @@ } } - var offset = 0, + let offset = 0, dataOffset = 84, faceLength = 12 * 4 + 2, vertices = new Float32Array(faces * 3 * 3), - normals = new Float32Array(faces * 3 * 3), - colors = hasColors ? new Uint16Array(faces * 3 * 3) : null; + normals = new Float32Array(faces * 3 * 3); - for (var face = 0; face < faces; face ++) { + colors = hasColors ? new Uint16Array(faces * 3 * 3) : null; - var start = dataOffset + face * faceLength, + for (let face = 0; face < faces; face ++) { + + let start = dataOffset + face * faceLength, normalX = reader.getFloat32(start, true), normalY = reader.getFloat32(start + 4, true), normalZ = reader.getFloat32(start + 8, true); if (hasColors) { - var packedColor = reader.getUint16(start + 48, true); + let packedColor = reader.getUint16(start + 48, true); if ((packedColor & 0x8000) === 0) { // facet has its own unique color r = (packedColor & 0x1F) / 31; g = ((packedColor >> 5) & 0x1F) / 31; @@ -158,7 +162,7 @@ } } - var i = 1, vertexstart; + let i = 1, vertexstart; while (i <= 3) { vertexstart = start + (i++) * 12; @@ -185,7 +189,7 @@ }; SP.parseASCII = function(data) { - var result, + let result, resultText, patternNormal, patternVertex, @@ -209,7 +213,7 @@ } } - var vToFloat32 = new Float32Array(vertices.length), + let vToFloat32 = new Float32Array(vertices.length), nToFloat32 = new Float32Array(normals.length), i; @@ -224,9 +228,9 @@ SP.convertToString = function (buf) { if (typeof buf !== "string") { - var array_buffer = new Uint8Array(buf); - var str = ''; - for (var i = 0; i < buf.byteLength; i++) { + let array_buffer = new Uint8Array(buf); + let str = ''; + for (let i = 0; i < buf.byteLength; i++) { str += String.fromCharCode(array_buffer[i]); } return str; @@ -237,8 +241,8 @@ SP.convertToBinary = function (buf) { if (typeof buf === "string") { - var array_buffer = new Uint8Array(buf.length); - for (var i = 0; i < buf.length; i++) { + let array_buffer = new Uint8Array(buf.length); + for (let i = 0; i < buf.length; i++) { array_buffer[i] = buf.charCodeAt(i) & 0xff; } return array_buffer.buffer || array_buffer; diff --git a/js/kiri-pack.js b/src/moto/pack.js similarity index 92% rename from js/kiri-pack.js rename to src/moto/pack.js index 10b73bb2..233238d6 100644 --- a/js/kiri-pack.js +++ b/src/moto/pack.js @@ -1,9 +1,7 @@ -/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */ +/** Copyright Stewart Allen -- All Rights Reserved */ "use strict"; -var gs_kiri_pack = exports; - /** * adapted from * http://codeincomplete.com/posts/2011/5/7/bin_packing/ @@ -11,6 +9,11 @@ var gs_kiri_pack = exports; (function (){ + if (!self.moto) self.moto = {}; + if (self.moto.Pack) return; + + self.moto.Pack = Packer; + function Packer (w, h, spacing) { this.root = { x: 0, y: 0, w: w, h: h }; this.max = { w: 0, h: 0 }; @@ -22,7 +25,7 @@ var gs_kiri_pack = exports; Packer.prototype = { fit: function (blocks) { - var n = 0, node, block, w, h; + let n = 0, node, block, w, h; while (n < blocks.length) { block = blocks[n++]; w = block.w + this.spacing; @@ -58,7 +61,4 @@ var gs_kiri_pack = exports; }; - if (!self.moto) self.moto = {}; - self.moto.Pack = Packer; - })(); diff --git a/js/moto-space.js b/src/moto/space.js similarity index 99% rename from js/moto-space.js rename to src/moto/space.js index d306a1e6..f9529156 100644 --- a/js/moto-space.js +++ b/src/moto/space.js @@ -1,12 +1,13 @@ -/** Copyright Stewart Allen -- All Rights Reserved */ -"use strict"; +/** Copyright Stewart Allen -- All Rights Reserved */ -let gs_moto_space = exports; -var MOTO = window.moto = window.moto || {}; +"use strict"; (function() { - let WIN = window, + if (!self.moto) self.moto = {}; + + let MOTO = self.moto, + WIN = window, DOC = document, SCENE = new THREE.Scene(), WORLD = new THREE.Group(), diff --git a/js/moto-ui.js b/src/moto/ui.js similarity index 99% rename from js/moto-ui.js rename to src/moto/ui.js index 6848820b..bbf95327 100644 --- a/js/moto-ui.js +++ b/src/moto/ui.js @@ -1,12 +1,10 @@ -/** Copyright 2014-2019 Stewart Allen -- All Rights Reserved */ +/** Copyright Stewart Allen -- All Rights Reserved */ "use strict"; -var gs_moto_ui = exports; - (function() { - var moto = self.moto = self.moto || {}; + if (!self.moto) self.moto = {}; if (moto.ui) return; let SELF = self, From fec728562e42c3d203d134a81d86874213c9fdf2 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Wed, 3 Jun 2020 22:44:05 -0400 Subject: [PATCH 08/61] fix non debug mode --- app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app.js b/app.js index bafb9159..b05f1eb0 100644 --- a/app.js +++ b/app.js @@ -613,12 +613,12 @@ function prepareScripts() { function concatCode(array) { let code = []; + let direct = array.filter(f => f.charAt(0) !== '@'); + let inject = array.filter(f => f.charAt(0) === '@').map(f => f.substring(1)); // 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 = [ `]; direct.forEach(file => { code.push(`"/${file.replace(/\\/g,'/')}?${version}",`); From 5d2ec18a95805b4d51ac5d1c6717767e99abeba2 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Wed, 3 Jun 2020 22:59:15 -0400 Subject: [PATCH 09/61] get meta working, if limping along --- app.js | 9 ++------- src/kiri/worker.js | 2 -- src/meta.js | 7 ++----- web/meta/index.html | 1 + 4 files changed, 5 insertions(+), 14 deletions(-) diff --git a/app.js b/app.js index b05f1eb0..f39e3e12 100644 --- a/app.js +++ b/app.js @@ -253,7 +253,7 @@ const script = { "kiri/export", "@devices" ].map(p => p.charAt(0) !== '@' ? `src/${p}.js` : p), - work : [ + worker : [ "kiri", "ext/three", "ext/pngjs", @@ -282,11 +282,7 @@ const script = { "mode/laser/driver", "kiri/widget", "kiri/print", - "kiri/codec" - ].map(p => `src/${p}.js`), - worker : [ - "kiri", - "license", + "kiri/codec", "kiri/worker" ].map(p => `src/${p}.js`), meta : [ @@ -607,7 +603,6 @@ function prepareScripts() { 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); } diff --git a/src/kiri/worker.js b/src/kiri/worker.js index d866eaf7..dd8b8006 100644 --- a/src/kiri/worker.js +++ b/src/kiri/worker.js @@ -2,8 +2,6 @@ "use strict"; -importScripts(`/code/work.js${location.search}`); - const base = self.base, util = base.util, time = util.time, diff --git a/src/meta.js b/src/meta.js index 06d7caf9..ba5752b5 100644 --- a/src/meta.js +++ b/src/meta.js @@ -22,12 +22,9 @@ "use strict"; -let gs_meta = exports; -let gs_meta_debug = false; // 'line', 'poly', or 'cut' - THREE.Material.prototype.motoSetup = function() { this.fog = false; - this.transparent = gs_meta_debug ? true : false; + this.transparent = false; let hidden = this.clone(); hidden.visible = false; @@ -271,7 +268,7 @@ THREE.Face3.prototype.mVisible = function(show) { let debugGroup = new THREE.Group(), debugAdded = false, debugLayer = new Layer(debugGroup), - debugExport = gs_meta_debug; + debugExport = false; /** ****************************************************************** * LETS_GET_THIS_PARTY_STARTED() diff --git a/web/meta/index.html b/web/meta/index.html index cd6491c9..29946282 100644 --- a/web/meta/index.html +++ b/web/meta/index.html @@ -11,6 +11,7 @@ + From 8ca0c931530fbd3800e48341c15622d989643c6f Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 4 Jun 2020 00:08:17 -0400 Subject: [PATCH 10/61] another fix for meta using compact mode --- src/meta.js | 19 +++---- web/meta/index.css | 136 ++++++++++++++++++++++++++++++++++++++++++++ web/meta/index.html | 6 +- 3 files changed, 148 insertions(+), 13 deletions(-) diff --git a/src/meta.js b/src/meta.js index ba5752b5..fa6de9e6 100644 --- a/src/meta.js +++ b/src/meta.js @@ -428,7 +428,7 @@ THREE.Face3.prototype.mVisible = function(show) { markTypeButtons[MARK.SLIDE] = mtypStop; markTypeButtons[MARK.CLEAR] = mtypClear; - UC.newGroup('workspace', assets); + UC.newGroup('workspace', assets, {region:"left"}); UC.newTableRow([[ UC.newButton('new', newWorkspace), UC.newButton('fork', forkWorkspace), @@ -489,25 +489,22 @@ THREE.Face3.prototype.mVisible = function(show) { ]); UC.newGroup('export').setAttribute("title","send selection to target"); UC.newTableRow([ - [ - UC.newButton('library', selectionToLibrary ), - UC.newButton('kiri', selectionToKiri ) - ],[ - UC.newButton('download', downloadSelection ) - ] + [ UC.newButton('to library', selectionToLibrary ) ], + [ UC.newButton('to kiri', selectionToKiri ) ], + [ UC.newButton('download', downloadSelection ) ] ]); UC.newGroup('options'); UI.invert = UC.newBoolean('invert zoom', setZoom); - UC.newGroup('space', control); + UC.newGroup('space', control, {region:"right", nocompact: true}); UI.name = UC.newInput('name', {size:10}); UI.units = UC.newInput('units'); UI.grid = UC.newInput('grid'); UI.version = UC.newInput('version', {disabled:true}); UC.newTableRow([[ verDown, verUp ]]); - UC.newGroup('selection'); + UC.newGroup('selection', undefined, {nocompact: true}); UI.sel_x = UC.newInput('width', {disabled:true}); UI.sel_y = UC.newInput('depth', {disabled:true}); UI.sel_z = UC.newInput('height', {disabled:true}); @@ -516,7 +513,7 @@ THREE.Face3.prototype.mVisible = function(show) { UC.newGroup('spaces'); UI.models = UC.newRow(); - UC.newGroup('import mesh'); + UC.newGroup('import', undefined, {nocompact: true}); UI.libdrop = UC.newButton('(drop mesh here)'); UI.libdrop.id = "dropbutton"; UC.newRow([UI.libdrop]); @@ -538,6 +535,8 @@ THREE.Face3.prototype.mVisible = function(show) { UI.units, function(ev) { setSpaceUnits(UI.units.value) } ]); + UC.hidePoppers(); + /** prevent mouse hover, click in control panels from affecting space */ function killev(ev) { ev.stopImmediatePropagation(); return false } diff --git a/web/meta/index.css b/web/meta/index.css index ef406e25..f0345414 100644 --- a/web/meta/index.css +++ b/web/meta/index.css @@ -115,6 +115,7 @@ th, tr, td, span, div, label, button { font-size: 12px; font-weight: bold; text-align: center; + position: relative; } .grouphead > a { text-transform: uppercase; @@ -519,3 +520,138 @@ button.del { background-color: #ccc; border-width: 1px; } + +.compact { + overflow: visible !important; + bottom: auto !important; + border: 0 !important; + background-color: rgba(255,255,255,0.5) !important; +} +.compact .grouphead { + padding: 10px 5px 10px 5px !important; + background-color: rgba(170,221,255,0.25); +} +.compact .grouphead:hover { + background-color: rgba(170,221,255,0.9); +} +.compact .grouphead a { + font-size: larger !important; + margin: 5px !important; +} +.compact .flow-row label { + font-size: 18px !important; +} +.compact .flow-row input { + font-size: 18px !important; +} +.compact .flow-row select { + font-size: 18px !important; +} +.compact .flow-row { + margin: 3px 0 3px 0; +} +.compact .asym { + width: auto !important; +} +.compact button { + font-size: larger !important; + padding: 5px 10px 5px 10px; +} +:-moz-any(#control-left.compact) { + overflow-x: display !important; + overflow-y: display !important; +} +:-moz-any(#control-right.compact) { + overflow-x: display !important; + overflow-y: display !important; + margin-right: auto !important; + margin-bottom: auto !important; +} + +.compact .sel-span .value { + font-size: 16px; + color: #444466 !important; +} +.compact .sel-span label { + font-size: 20px; +} +.compact .sel-span input { + font-size: 18px; + margin: 4px; +} + +.popper { + position: absolute; + top: 0; + z-index: 50000; + background-color: white; + border: 1px solid #aaa; + border-radius: 3px; + padding: 5px; + white-space: nowrap; + text-align: left; +} +.popper.left { + left: 105%; +} +.popper.right { + right: 105%; +} +.popper svg { + width: 40px; + height: 40px; +} +.poprow > div { + display: flex; + flex-direction: row; +} + +.poptext { + display: none; + position: absolute; + margin-left: 30px; + border: 3px solid #ddd; + border-radius: 3px; + transform: translate(0, -25%); + flex-direction: column; + align-items: stretch; + z-Index: 10000; +} +.poptext label { + text-align: center !important; + border-top: 1px solid #888; + border-left: 1px solid #888; + border-right: 1px solid #888; + background-color: rgba(170,221,255,0.75); + padding: 3px 0 3px 0; + margin: 0; + color: black; +} +.poptext textarea { + flex-grow: 1; + margin: 0; + opacity: 0.95; + outline: none; + overflow-y: scroll !important; +} + +.sel-span { + position: relative; + display: inline-block; +} +.sel-pop { + display: none; + position: absolute; + bottom: 100%; + left: 0; + padding-bottom: 5px; +} +.sel-pop div, .sel-pop table { + background-color: white; + border: 1px solid #ddd; + border-radius: 5px; + padding: 5px; +} +.sel-span:hover .sel-pop { + display: block; +} diff --git a/web/meta/index.html b/web/meta/index.html index 29946282..c26d15ed 100644 --- a/web/meta/index.html +++ b/web/meta/index.html @@ -16,11 +16,11 @@ - + -
+
-
+
From f8a976ffcac2a6b15245d44e5167c9ccc285d16c Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 4 Jun 2020 00:15:48 -0400 Subject: [PATCH 11/61] re-add api endpoint --- app.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app.js b/app.js index f39e3e12..54b4177a 100644 --- a/app.js +++ b/app.js @@ -17,6 +17,7 @@ const code = {}; const mods = {}; const load = []; const synth = {}; +const api = {}; let level; let cacheDir; @@ -63,6 +64,7 @@ function init(mod) { [ "/data/", handleData ], [ "/wasm/", handleWasm ] ])); + mod.add(fixedmap("/api/", api)); if (debug) { mod.static("/src/", "src"); mod.static("/mod/", "mod"); @@ -116,7 +118,7 @@ function loadModule(mod, dir) { function initModule(mod, file, dir) { logger.log({module: file}); require_fresh(file)({ - api: {}, + api: api, adm: { reload: prepareScripts }, From aa913cd6be235829434b1455be30a1e1ab14a493 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 4 Jun 2020 00:31:59 -0400 Subject: [PATCH 12/61] pass package meta to module --- app.js | 1 + 1 file changed, 1 insertion(+) diff --git a/app.js b/app.js index 54b4177a..f97d548e 100644 --- a/app.js +++ b/app.js @@ -124,6 +124,7 @@ function initModule(mod, file, dir) { }, const: { args: {}, + meta: mod.meta, debug: debug, script: script, moddir: dir, From 52d4015114a63664d33e0317a09ddd12aa67368d Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 4 Jun 2020 01:03:34 -0400 Subject: [PATCH 13/61] remove arg demunging --- src/kiri/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kiri/main.js b/src/kiri/main.js index 6fd6f6b9..1cf0c531 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -403,7 +403,7 @@ let opt = {}, kv, kva; // handle kiri legacy and proper url encoding better ov.replace(/&/g,',').split(',').forEach(function(el) { - el = el.replace(/=/g,':'); + // el = el.replace(/=/g,':'); kv = decodeURIComponent(el).split(':'); if (kv.length === 2) { kva = opt[kv[0]] = opt[kv[0]] || []; From 5677d7044901cff3ea03f6664a2b6f3cebd8fb9f Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 4 Jun 2020 15:19:01 -0400 Subject: [PATCH 14/61] change query encoding to old style meta --- app.js | 4 ++-- src/kiri/main.js | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/app.js b/app.js index f97d548e..16cdaf59 100644 --- a/app.js +++ b/app.js @@ -380,9 +380,9 @@ function string2obj(s) { function handleVersion(req, res, next) { if (req.app.path === "/kiri/" && req.url.indexOf(version) < 0) { if (req.url.indexOf("?") > 0) { - return http.redirect(res, `${req.url}&ver=${version}`); + return http.redirect(res, `${req.url},ver:${version}`); } else { - return http.redirect(res, `${req.url}?ver=${version}`); + return http.redirect(res, `${req.url}?ver:${version}`); } } else { next(); diff --git a/src/kiri/main.js b/src/kiri/main.js index 1cf0c531..7197cbbc 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -403,7 +403,6 @@ let opt = {}, kv, kva; // handle kiri legacy and proper url encoding better ov.replace(/&/g,',').split(',').forEach(function(el) { - // el = el.replace(/=/g,':'); kv = decodeURIComponent(el).split(':'); if (kv.length === 2) { kva = opt[kv[0]] = opt[kv[0]] || []; @@ -418,9 +417,9 @@ Object.keys(opt).forEach(key => { if (key === 'ver') return; let val = opt[key]; - out.push(encodeURIComponent(key) + "=" + encodeURIComponent(val)); + out.push(encodeURIComponent(key) + ":" + encodeURIComponent(val)); }); - return out.length ? '?' + out.join('&') : ''; + return out.length ? '?' + out.join(',') : ''; } function ajax(url, fn, rt, po, hd) { From 672d42fe410dd9e6ad0520e64c0b6a89ec9a08a7 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 4 Jun 2020 21:29:40 -0400 Subject: [PATCH 15/61] generate icon embeds --- app.js | 29 +++++++++++++++++++++++------ src/ico/cnc.cvg | 3 +++ src/ico/fdm.svg | 3 +++ src/ico/laser.svg | 3 +++ src/ico/sla.svg | 3 +++ src/kiri/icons.js | 19 ------------------- src/kiri/init.js | 8 ++++---- src/mode/cam/driver.js | 4 +++- 8 files changed, 42 insertions(+), 30 deletions(-) create mode 100644 src/ico/cnc.cvg create mode 100644 src/ico/fdm.svg create mode 100644 src/ico/laser.svg create mode 100644 src/ico/sla.svg delete mode 100644 src/kiri/icons.js diff --git a/app.js b/app.js index 16cdaf59..423042d6 100644 --- a/app.js +++ b/app.js @@ -1,3 +1,5 @@ +/** Copyright Stewart Allen -- All Rights Reserved */ + function require_fresh(path) { const rpa = require.resolve(path); delete require.cache[rpa]; @@ -234,7 +236,6 @@ const script = { "moto/load-stl", "moto/db", "moto/ui", - "kiri/icons", "kiri/lang", "kiri/lang-en", "kiri/fill", @@ -254,7 +255,8 @@ const script = { "kiri/main", "kiri/init", "kiri/export", - "@devices" + "@devices", + "@icons" ].map(p => p.charAt(0) !== '@' ? `src/${p}.js` : p), worker : [ "kiri", @@ -594,7 +596,17 @@ function serveCode(req, res, code) { res.end(code.code); } -function prepareScripts() { +function generateIcons() { + let root = `${dir}/src/ico`; + let icos = {}; + fs.readdirSync(root).forEach(file => { + let name = file.split(".")[0] ; + icos[name] = fs.readFileSync(`${root}/${file}`).toString(); + }); + synth.icons = `self.icons = ${JSON.stringify(icos)};`; +} + +function generateDevices() { let root = `${dir}/src/dev`; let devs = {}; fs.readdirSync(root).forEach(type => { @@ -603,7 +615,12 @@ function prepareScripts() { map[device] = JSON.parse(fs.readFileSync(`${root}/${type}/${device}`)); }); }); - synth.devices = `devices = ${JSON.stringify(devs)};`; + synth.devices = `self.devices = ${JSON.stringify(devs)};`; +} + +function prepareScripts() { + generateIcons(); + generateDevices(); code.meta = concatCode(script.meta); code.kiri = concatCode(script.kiri); code.worker = concatCode(script.worker); @@ -617,7 +634,7 @@ function concatCode(array) { // in debug mode, the script should load dependent // scripts instead of serving a complete bundle if (debug) { - let code = [ `(function() { let load = [ `]; + let code = [ '(function() { let load = [ ' ]; direct.forEach(file => { code.push(`"/${file.replace(/\\/g,'/')}?${version}",`); }); @@ -631,7 +648,7 @@ function concatCode(array) { 's.src = file;', 's.onload = load_next;', 'document.head.appendChild(s);', - '}; load_next(); })();', + '} load_next(); })();', 'self.debug=true;' ].join('\n')); inject.forEach(key => { diff --git a/src/ico/cnc.cvg b/src/ico/cnc.cvg new file mode 100644 index 00000000..38f46b4c --- /dev/null +++ b/src/ico/cnc.cvg @@ -0,0 +1,3 @@ + + + diff --git a/src/ico/fdm.svg b/src/ico/fdm.svg new file mode 100644 index 00000000..4aca6193 --- /dev/null +++ b/src/ico/fdm.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ico/laser.svg b/src/ico/laser.svg new file mode 100644 index 00000000..0647993b --- /dev/null +++ b/src/ico/laser.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ico/sla.svg b/src/ico/sla.svg new file mode 100644 index 00000000..c9456c7c --- /dev/null +++ b/src/ico/sla.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/kiri/icons.js b/src/kiri/icons.js deleted file mode 100644 index c791e6d4..00000000 --- a/src/kiri/icons.js +++ /dev/null @@ -1,19 +0,0 @@ -/** Copyright Stewart Allen -- All Rights Reserved */ - -"use strict"; - -(function() { - - 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=='), - - cam:atob('PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCBtZWV0IiB2aWV3Qm94PSIwIDAgMTcwIDE3MCIgd2lkdGg9Ijc1cHgiIGhlaWdodD0iNzVweCI+PGRlZnM+PHBhdGggZD0iTTE1IDM4LjMzQzE1IDM4LjMzIDE1IDM4LjMzIDE1IDM4LjMzQzE1IDI1LjQ1IDI1LjQ1IDE1IDM4LjMzIDE1QzQ0LjU2IDE1IDc1LjY3IDE1IDEzMS42NyAxNUMxMzEuNjcgMTUgMTMxLjY3IDE1IDEzMS42NyAxNUMxMzcuODUgMTUgMTQzLjc5IDE3LjQ2IDE0OC4xNyAyMS44M0MxNTIuNTQgMjYuMjEgMTU1IDMyLjE1IDE1NSAzOC4zM0MxNTUgNDcuNjcgMTU1IDEyMi4zMyAxNTUgMTMxLjY3QzE1NSAxNDQuNTUgMTQ0LjU1IDE1NSAxMzEuNjcgMTU1QzEyMi4zMyAxNTUgNDcuNjcgMTU1IDM4LjMzIDE1NUMyNS40NSAxNTUgMTUgMTQ0LjU1IDE1IDEzMS42N0MxNSAxMTkuMjIgMTUgODguMTEgMTUgMzguMzNaIiBpZD0iZTNpckhhWHI0Ij48L3BhdGg+PHBhdGggZD0iTTY1IDE1TDEwNSAxNUwxMDUgMTI1TDY1IDEyNUw2NSAxNVoiIGlkPSJjMVlrTG9sMTBkIj48L3BhdGg+PHBhdGggZD0iTTEwNSAyNUw2NSA1NSIgaWQ9ImI0aHhqQ0sxenkiPjwvcGF0aD48cGF0aCBkPSJNMTA1IDU1TDY1IDg1IiBpZD0iYXBVYVY4bVp1Ij48L3BhdGg+PHBhdGggZD0iTTEwNSA4NUw2NSAxMTUiIGlkPSJiazIxZElxT3EiPjwvcGF0aD48L2RlZnM+PGc+PGc+PGc+PGc+PHVzZSB4bGluazpocmVmPSIjZTNpckhhWHI0IiBvcGFjaXR5PSIxIiBmaWxsPSIjMDAwMDAwIiBmaWxsLW9wYWNpdHk9IjAiPjwvdXNlPjxnPjx1c2UgeGxpbms6aHJlZj0iI2UzaXJIYVhyNCIgb3BhY2l0eT0iMSIgZmlsbC1vcGFjaXR5PSIwIiBzdHJva2U9IiM3Nzc3NzciIHN0cm9rZS13aWR0aD0iOCIgc3Ryb2tlLW9wYWNpdHk9IjEiPjwvdXNlPjwvZz48L2c+PGc+PHVzZSB4bGluazpocmVmPSIjYzFZa0xvbDEwZCIgb3BhY2l0eT0iMSIgZmlsbD0iIzAwMDAwMCIgZmlsbC1vcGFjaXR5PSIwIj48L3VzZT48Zz48dXNlIHhsaW5rOmhyZWY9IiNjMVlrTG9sMTBkIiBvcGFjaXR5PSIxIiBmaWxsLW9wYWNpdHk9IjAiIHN0cm9rZT0iIzc3Nzc3NyIgc3Ryb2tlLXdpZHRoPSI4IiBzdHJva2Utb3BhY2l0eT0iMSI+PC91c2U+PC9nPjwvZz48Zz48Zz48dXNlIHhsaW5rOmhyZWY9IiNiNGh4akNLMXp5IiBvcGFjaXR5PSIxIiBmaWxsLW9wYWNpdHk9IjAiIHN0cm9rZT0iIzc3Nzc3NyIgc3Ryb2tlLXdpZHRoPSI4LjAxIiBzdHJva2Utb3BhY2l0eT0iMSI+PC91c2U+PC9nPjwvZz48Zz48Zz48dXNlIHhsaW5rOmhyZWY9IiNhcFVhVjhtWnUiIG9wYWNpdHk9IjEiIGZpbGwtb3BhY2l0eT0iMCIgc3Ryb2tlPSIjNzc3Nzc3IiBzdHJva2Utd2lkdGg9IjguMDEiIHN0cm9rZS1vcGFjaXR5PSIxIj48L3VzZT48L2c+PC9nPjxnPjxnPjx1c2UgeGxpbms6aHJlZj0iI2JrMjFkSXFPcSIgb3BhY2l0eT0iMSIgZmlsbC1vcGFjaXR5PSIwIiBzdHJva2U9IiM3Nzc3NzciIHN0cm9rZS13aWR0aD0iOC4wMSIgc3Ryb2tlLW9wYWNpdHk9IjEiPjwvdXNlPjwvZz48L2c+PC9nPjwvZz48L2c+PC9zdmc+Cg=='), - - laser:atob('PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCBtZWV0IiB2aWV3Qm94PSIwIDAgMTcwIDE3MCIgd2lkdGg9Ijc1cHgiIGhlaWdodD0iNzVweCI+PGRlZnM+PHBhdGggZD0iTTE1IDM4LjMzQzE1IDM4LjMzIDE1IDM4LjMzIDE1IDM4LjMzQzE1IDI1LjQ1IDI1LjQ1IDE1IDM4LjMzIDE1QzQ0LjU2IDE1IDc1LjY3IDE1IDEzMS42NyAxNUMxMzEuNjcgMTUgMTMxLjY3IDE1IDEzMS42NyAxNUMxMzcuODUgMTUgMTQzLjc5IDE3LjQ2IDE0OC4xNyAyMS44M0MxNTIuNTQgMjYuMjEgMTU1IDMyLjE1IDE1NSAzOC4zM0MxNTUgNDcuNjcgMTU1IDEyMi4zMyAxNTUgMTMxLjY3QzE1NSAxNDQuNTUgMTQ0LjU1IDE1NSAxMzEuNjcgMTU1QzEyMi4zMyAxNTUgNDcuNjcgMTU1IDM4LjMzIDE1NUMyNS40NSAxNTUgMTUgMTQ0LjU1IDE1IDEzMS42N0MxNSAxMTkuMjIgMTUgODguMTEgMTUgMzguMzNaIiBpZD0iYTRsMDBtbkVueSI+PC9wYXRoPjxwYXRoIGQ9Ik02NSAxNUwxMDUgMTVMMTA1IDU1TDY1IDU1TDY1IDE1WiIgaWQ9ImJxOG9CV3JmRyI+PC9wYXRoPjxwYXRoIGQ9Ik04NSAxMjVMODUgNjUiIGlkPSJhWHpIdEdic0QiPjwvcGF0aD48cGF0aCBkPSJNNTUgMTA1TDc1IDEzNSIgaWQ9ImFrU3poMFFLeCI+PC9wYXRoPjxwYXRoIGQ9Ik0xMTUgMTA1TDk1IDEzNSIgaWQ9ImJsb0FzOWdpWiI+PC9wYXRoPjxwYXRoIGQ9Ik0zNSAxMjVMNzUgMTQ1IiBpZD0iZ2s2b2hqMEpMIj48L3BhdGg+PHBhdGggZD0iTTEzNSAxMjMuOTZMOTUgMTQ1IiBpZD0iZTQwNGVvajdMIj48L3BhdGg+PC9kZWZzPjxnPjxnPjxnPjxnPjx1c2UgeGxpbms6aHJlZj0iI2E0bDAwbW5FbnkiIG9wYWNpdHk9IjEiIGZpbGw9IiMwMDAwMDAiIGZpbGwtb3BhY2l0eT0iMCI+PC91c2U+PGc+PHVzZSB4bGluazpocmVmPSIjYTRsMDBtbkVueSIgb3BhY2l0eT0iMSIgZmlsbC1vcGFjaXR5PSIwIiBzdHJva2U9IiM3Nzc3NzciIHN0cm9rZS13aWR0aD0iOCIgc3Ryb2tlLW9wYWNpdHk9IjEiPjwvdXNlPjwvZz48L2c+PGc+PHVzZSB4bGluazpocmVmPSIjYnE4b0JXcmZHIiBvcGFjaXR5PSIxIiBmaWxsPSIjMDAwMDAwIiBmaWxsLW9wYWNpdHk9IjAiPjwvdXNlPjxnPjx1c2UgeGxpbms6aHJlZj0iI2JxOG9CV3JmRyIgb3BhY2l0eT0iMSIgZmlsbC1vcGFjaXR5PSIwIiBzdHJva2U9IiM3Nzc3NzciIHN0cm9rZS13aWR0aD0iOCIgc3Ryb2tlLW9wYWNpdHk9IjEiPjwvdXNlPjwvZz48L2c+PGc+PGc+PHVzZSB4bGluazpocmVmPSIjYVh6SHRHYnNEIiBvcGFjaXR5PSIxIiBmaWxsLW9wYWNpdHk9IjAiIHN0cm9rZT0iIzc3Nzc3NyIgc3Ryb2tlLXdpZHRoPSI4LjAxIiBzdHJva2Utb3BhY2l0eT0iMSI+PC91c2U+PC9nPjwvZz48Zz48Zz48dXNlIHhsaW5rOmhyZWY9IiNha1N6aDBRS3giIG9wYWNpdHk9IjEiIGZpbGwtb3BhY2l0eT0iMCIgc3Ryb2tlPSIjNzc3Nzc3IiBzdHJva2Utd2lkdGg9IjguMDEiIHN0cm9rZS1vcGFjaXR5PSIxIj48L3VzZT48L2c+PC9nPjxnPjxnPjx1c2UgeGxpbms6aHJlZj0iI2Jsb0FzOWdpWiIgb3BhY2l0eT0iMSIgZmlsbC1vcGFjaXR5PSIwIiBzdHJva2U9IiM3Nzc3NzciIHN0cm9rZS13aWR0aD0iOC4wMSIgc3Ryb2tlLW9wYWNpdHk9IjEiPjwvdXNlPjwvZz48L2c+PGc+PGc+PHVzZSB4bGluazpocmVmPSIjZ2s2b2hqMEpMIiBvcGFjaXR5PSIxIiBmaWxsLW9wYWNpdHk9IjAiIHN0cm9rZT0iIzc3Nzc3NyIgc3Ryb2tlLXdpZHRoPSI4LjAxIiBzdHJva2Utb3BhY2l0eT0iMSI+PC91c2U+PC9nPjwvZz48Zz48Zz48dXNlIHhsaW5rOmhyZWY9IiNlNDA0ZW9qN0wiIG9wYWNpdHk9IjEiIGZpbGwtb3BhY2l0eT0iMCIgc3Ryb2tlPSIjNzc3Nzc3IiBzdHJva2Utd2lkdGg9IjguMDEiIHN0cm9rZS1vcGFjaXR5PSIxIj48L3VzZT48L2c+PC9nPjwvZz48L2c+PC9nPjwvc3ZnPgo='), - - sla:atob('PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCBtZWV0IiB2aWV3Qm94PSIwIDAgMTcwIDE3MCIgd2lkdGg9Ijc1cHgiIGhlaWdodD0iNzVweCI+PGRlZnM+PHBhdGggZD0iTTE1IDM4LjMzQzE1IDM4LjMzIDE1IDM4LjMzIDE1IDM4LjMzQzE1IDI1LjQ1IDI1LjQ1IDE1IDM4LjMzIDE1QzQ0LjU2IDE1IDc1LjY3IDE1IDEzMS42NyAxNUMxMzEuNjcgMTUgMTMxLjY3IDE1IDEzMS42NyAxNUMxMzcuODUgMTUgMTQzLjc5IDE3LjQ2IDE0OC4xNyAyMS44M0MxNTIuNTQgMjYuMjEgMTU1IDMyLjE1IDE1NSAzOC4zM0MxNTUgNDcuNjcgMTU1IDEyMi4zMyAxNTUgMTMxLjY3QzE1NSAxNDQuNTUgMTQ0LjU1IDE1NSAxMzEuNjcgMTU1QzEyMi4zMyAxNTUgNDcuNjcgMTU1IDM4LjMzIDE1NUMyNS40NSAxNTUgMTUgMTQ0LjU1IDE1IDEzMS42N0MxNSAxMTkuMjIgMTUgODguMTEgMTUgMzguMzNaIiBpZD0iYjNUUk5IeWJ4WCI+PC9wYXRoPjxwYXRoIGQ9Ik0zMS44OCA0Mi41TDEzOC4xMiA0Mi41TDEzOC4xMiA0Ny44MUwzMS44OCA0Ny44MUwzMS44OCA0Mi41WiIgaWQ9ImFOTWt6THdiIj48L3BhdGg+PHBhdGggZD0iTTc1IDIxLjg3TDk1IDIxLjg3TDk1IDQxLjg4TDc1IDQxLjg4TDc1IDIxLjg3WiIgaWQ9ImQxZktLZzJKcnUiPjwvcGF0aD48cGF0aCBkPSJNMTE1LjkzIDEwNy4xOUMxMTUuOTMgMTI0LjI3IDEwMi4wNyAxMzguMTMgODUgMTM4LjEzQzY3LjkzIDEzOC4xMyA1NC4wNyAxMjQuMjcgNTQuMDcgMTA3LjE5QzU0LjA3IDkwLjEyIDY3LjkzIDc2LjI2IDg1IDc2LjI2QzEwMi4wNyA3Ni4yNiAxMTUuOTMgOTAuMTIgMTE1LjkzIDEwNy4xOVoiIGlkPSJjbnlyY1RRTWciPjwvcGF0aD48cGF0aCBkPSJNNTMuODcgNDcuODFMNTMuODcgMTA3LjA4IiBpZD0iYTRHOVJyNlZRTCI+PC9wYXRoPjxwYXRoIGQ9Ik0xMTUuNzYgNTEuMjdMMTE1Ljc2IDExMC41MyIgaWQ9ImQ0aHl0eVNReFoiPjwvcGF0aD48cGF0aCBkPSJNNjkuMDYgNzkuNjlMNjkuMDYgNDcuODEiIGlkPSJiMVdRODNFTEFBIj48L3BhdGg+PHBhdGggZD0iTTEwMC45NCA3OS42OUwxMDAuOTQgNDcuODEiIGlkPSJmMmtOSHNsYUxhIj48L3BhdGg+PHBhdGggZD0iTTY5LjA2IDU4LjQ0TDUzLjEzIDc0LjM4IiBpZD0iZzY3dkZKd0FGeSI+PC9wYXRoPjxwYXRoIGQ9Ik0xMTQuNjggNTguNDRMMTAwLjk0IDY5LjA2IiBpZD0iYUFjcDN6NUt2Ij48L3BhdGg+PC9kZWZzPjxnPjxnPjxnPjx1c2UgeGxpbms6aHJlZj0iI2IzVFJOSHlieFgiIG9wYWNpdHk9IjEiIGZpbGw9IiMwMDAwMDAiIGZpbGwtb3BhY2l0eT0iMCI+PC91c2U+PGc+PHVzZSB4bGluazpocmVmPSIjYjNUUk5IeWJ4WCIgb3BhY2l0eT0iMSIgZmlsbC1vcGFjaXR5PSIwIiBzdHJva2U9IiM3Nzc3NzciIHN0cm9rZS13aWR0aD0iOCIgc3Ryb2tlLW9wYWNpdHk9IjEiPjwvdXNlPjwvZz48L2c+PGc+PHVzZSB4bGluazpocmVmPSIjYU5Na3pMd2IiIG9wYWNpdHk9IjEiIGZpbGw9IiMwMDAwMDAiIGZpbGwtb3BhY2l0eT0iMCI+PC91c2U+PGc+PHVzZSB4bGluazpocmVmPSIjYU5Na3pMd2IiIG9wYWNpdHk9IjEiIGZpbGwtb3BhY2l0eT0iMCIgc3Ryb2tlPSIjNzc3Nzc3IiBzdHJva2Utd2lkdGg9IjgiIHN0cm9rZS1vcGFjaXR5PSIxIj48L3VzZT48L2c+PC9nPjxnPjx1c2UgeGxpbms6aHJlZj0iI2QxZktLZzJKcnUiIG9wYWNpdHk9IjEiIGZpbGw9IiMwMDAwMDAiIGZpbGwtb3BhY2l0eT0iMCI+PC91c2U+PGc+PHVzZSB4bGluazpocmVmPSIjZDFmS0tnMkpydSIgb3BhY2l0eT0iMSIgZmlsbC1vcGFjaXR5PSIwIiBzdHJva2U9IiM3Nzc3NzciIHN0cm9rZS13aWR0aD0iOCIgc3Ryb2tlLW9wYWNpdHk9IjEiPjwvdXNlPjwvZz48L2c+PGc+PHVzZSB4bGluazpocmVmPSIjY255cmNUUU1nIiBvcGFjaXR5PSIxIiBmaWxsPSIjMWVhNWU2IiBmaWxsLW9wYWNpdHk9IjAiPjwvdXNlPjxnPjx1c2UgeGxpbms6aHJlZj0iI2NueXJjVFFNZyIgb3BhY2l0eT0iMSIgZmlsbC1vcGFjaXR5PSIwIiBzdHJva2U9IiM3Nzc3NzciIHN0cm9rZS13aWR0aD0iOCIgc3Ryb2tlLW9wYWNpdHk9IjEiPjwvdXNlPjwvZz48L2c+PGc+PGc+PHVzZSB4bGluazpocmVmPSIjYTRHOVJyNlZRTCIgb3BhY2l0eT0iMSIgZmlsbC1vcGFjaXR5PSIwIiBzdHJva2U9IiM3Nzc3NzciIHN0cm9rZS13aWR0aD0iOCIgc3Ryb2tlLW9wYWNpdHk9IjEiPjwvdXNlPjwvZz48L2c+PGc+PGc+PHVzZSB4bGluazpocmVmPSIjZDRoeXR5U1F4WiIgb3BhY2l0eT0iMSIgZmlsbC1vcGFjaXR5PSIwIiBzdHJva2U9IiM3Nzc3NzciIHN0cm9rZS13aWR0aD0iOCIgc3Ryb2tlLW9wYWNpdHk9IjEiPjwvdXNlPjwvZz48L2c+PGc+PGc+PHVzZSB4bGluazpocmVmPSIjYjFXUTgzRUxBQSIgb3BhY2l0eT0iMSIgZmlsbC1vcGFjaXR5PSIwIiBzdHJva2U9IiM3Nzc3NzciIHN0cm9rZS13aWR0aD0iOCIgc3Ryb2tlLW9wYWNpdHk9IjEiPjwvdXNlPjwvZz48L2c+PGc+PGc+PHVzZSB4bGluazpocmVmPSIjZjJrTkhzbGFMYSIgb3BhY2l0eT0iMSIgZmlsbC1vcGFjaXR5PSIwIiBzdHJva2U9IiM3Nzc3NzciIHN0cm9rZS13aWR0aD0iOCIgc3Ryb2tlLW9wYWNpdHk9IjEiPjwvdXNlPjwvZz48L2c+PGc+PGc+PHVzZSB4bGluazpocmVmPSIjZzY3dkZKd0FGeSIgb3BhY2l0eT0iMSIgZmlsbC1vcGFjaXR5PSIwIiBzdHJva2U9IiM3Nzc3NzciIHN0cm9rZS13aWR0aD0iNiIgc3Ryb2tlLW9wYWNpdHk9IjEiPjwvdXNlPjwvZz48L2c+PGc+PGc+PHVzZSB4bGluazpocmVmPSIjYUFjcDN6NUt2IiBvcGFjaXR5PSIxIiBmaWxsLW9wYWNpdHk9IjAiIHN0cm9rZT0iIzc3Nzc3NyIgc3Ryb2tlLXdpZHRoPSI2IiBzdHJva2Utb3BhY2l0eT0iMSI+PC91c2U+PC9nPjwvZz48L2c+PC9nPjwvc3ZnPgo=') - - }; - -})(); diff --git a/src/kiri/init.js b/src/kiri/init.js index 32c11f35..eaab2632 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -1186,10 +1186,10 @@ mode: UC.newGroup(LANG.mo_menu, assets, {region:"left", poprow:false}), modeTable: UC.newTableRow([ - [ UI.modeFDM = UC.newButton(LANG.mo_fdmp, function() { API.mode.set('FDM',null,platform.update_size) }, {icon: KIRI.icons.fdm}) ], - [ UI.modeSLA = UC.newButton(LANG.mo_slap, function() { API.mode.set('SLA',null,platform.update_size) }, {icon: KIRI.icons.sla}) ], - [ UI.modeLASER = UC.newButton(LANG.mo_lazr, function() { API.mode.set('LASER',null,platform.update_size) }, {icon: KIRI.icons.laser}) ], - [ UI.modeCAM = UC.newButton(LANG.mo_cncm, function() { API.mode.set('CAM',null,platform.update_size) }, {icon: KIRI.icons.cam, id:"modeCAM"}) ] + [ UI.modeFDM = UC.newButton(LANG.mo_fdmp, function() { API.mode.set('FDM',null,platform.update_size) }, {icon: icons.fdm}) ], + [ UI.modeSLA = UC.newButton(LANG.mo_slap, function() { API.mode.set('SLA',null,platform.update_size) }, {icon: icons.sla}) ], + [ UI.modeLASER = UC.newButton(LANG.mo_lazr, function() { API.mode.set('LASER',null,platform.update_size) }, {icon: icons.laser}) ], + [ UI.modeCAM = UC.newButton(LANG.mo_cncm, function() { API.mode.set('CAM',null,platform.update_size) }, {icon: icons.cam, id:"modeCAM"}) ] ]), system: UC.newGroup(LANG.su_menu), sysTable: UC.newTableRow([ diff --git a/src/mode/cam/driver.js b/src/mode/cam/driver.js index 09e83e13..ff507232 100644 --- a/src/mode/cam/driver.js +++ b/src/mode/cam/driver.js @@ -16,8 +16,10 @@ sliceRender, printSetup, printExport, + // printDownload, + // printRender getToolById, - getToolDiameter + getToolDiameter, }, CPRO = CAM.process = { ROUGH: 1, From d3680873febd48fde8a63cdffe51a45fd25283bc Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 5 Jun 2020 23:21:53 -0400 Subject: [PATCH 16/61] start a new look --- app.js | 2 +- src/kiri/init.js | 222 +++--- src/kiri/main.js | 94 +-- src/kiri/ui.js | 579 +++++++++++++++ web/kiri/index.css | 1435 ++++++------------------------------ web/kiri/index.html | 300 +++----- web/kiri/lang/en-help.html | 6 +- web/kiri/lang/en.js | 2 +- 8 files changed, 1088 insertions(+), 1552 deletions(-) create mode 100644 src/kiri/ui.js diff --git a/app.js b/app.js index 423042d6..19ae4ac6 100644 --- a/app.js +++ b/app.js @@ -235,7 +235,7 @@ const script = { "moto/space", "moto/load-stl", "moto/db", - "moto/ui", + "kiri/ui", "kiri/lang", "kiri/lang-en", "kiri/fill", diff --git a/src/kiri/init.js b/src/kiri/init.js index eaab2632..de9139d0 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -522,7 +522,7 @@ let code = devices[API.mode.get_lower()][devicename]; setDeviceCode(code, devicename); } - $('selected-device').innerHTML = devicename; + // $('selected-device').innerHTML = devicename; } // only for local filters @@ -535,6 +535,7 @@ } function setDeviceCode(code, devicename) { + return console.log('TODO setDeviceCode'); try { if (typeof(code) === 'string') code = js2o(code) || {}; @@ -1010,6 +1011,7 @@ } function updateCatalog(files) { + return console.log('TODO catalog render'); let table = UI.catalogList, list = []; table.innerHTML = ''; @@ -1126,9 +1128,9 @@ layerID: $('layer-id'), layerSpan: $('layer-span'), layerRange: $('layer-range'), - loading: $('loading').style, - progress: $('progress').style, - prostatus: $('prostatus'), + loading: $('progress').style, + progress: $('progbar').style, + prostatus: $('progtxt'), selection: $('selection'), sizeX: $('size_x'), sizeY: $('size_y'), @@ -1184,44 +1186,44 @@ gcodePre: UC.newText(LANG.dv_head_s, {title:LANG.dv_head_l, modes:GCODE, size:14, height:3}), gcodePost: UC.newText(LANG.dv_foot_s, {title:LANG.dv_foot_l, modes:GCODE, size:14, height:3}), - mode: UC.newGroup(LANG.mo_menu, assets, {region:"left", poprow:false}), - modeTable: UC.newTableRow([ - [ UI.modeFDM = UC.newButton(LANG.mo_fdmp, function() { API.mode.set('FDM',null,platform.update_size) }, {icon: icons.fdm}) ], - [ UI.modeSLA = UC.newButton(LANG.mo_slap, function() { API.mode.set('SLA',null,platform.update_size) }, {icon: icons.sla}) ], - [ UI.modeLASER = UC.newButton(LANG.mo_lazr, function() { API.mode.set('LASER',null,platform.update_size) }, {icon: icons.laser}) ], - [ UI.modeCAM = UC.newButton(LANG.mo_cncm, function() { API.mode.set('CAM',null,platform.update_size) }, {icon: icons.cam, id:"modeCAM"}) ] - ]), - system: UC.newGroup(LANG.su_menu), - sysTable: UC.newTableRow([ - [ UI.setupDevices = UC.newButton(LANG.su_devi, showDevices) ], - [ UI.setupTools = UC.newButton(LANG.su_tool, showTools, {modes:CAM}) ], - [ UI.setupExport = UC.newButton(LANG.su_xprt, settingsExport, {modes:ALL, expert:true}) ], - [ UI.localButton = UC.newButton(LANG.su_locl, API.show.local, {modes:FDM_CAM, expert:true}) ] - ]), - wsFile: UC.newGroup(LANG.fe_menu), - wsFileTable: UC.newTableRow([ - [ UI.import = UC.newButton(LANG.fn_recn, undefined, {class:"asym"}) ], - [ UI.load = UC.newButton(LANG.fn_impo, function() { API.event.import() }, {class:"asym"}) ] - ]), - wsFunc: UC.newGroup(LANG.fn_menu), - wsFuncTable: UC.newTableRow([ - [ UI.modeArrange = UC.newButton(LANG.fn_arra, platform.layout) ], - [ UI.modeSlice = UC.newButton(LANG.fn_slic, API.function.slice) ], - [ UI.modePreview = UC.newButton(LANG.fn_prev, API.function.print) ], - [ UI.modeExport = UC.newButton(LANG.fn_expo, API.function.export) ] - ]), - - workspace: UC.newGroup(LANG.ws_menu, undefined, {modes:ALL, expert:true}), - wsTable: UC.newTableRow([ - [ - UC.newButton(LANG.vu_sptp, SPACE.view.top), - UC.newButton(LANG.vu_home, SPACE.view.home), - ],[ - UI.saveButton = - UC.newButton(LANG.ws_save, API.space.save), - UC.newButton(LANG.ws_cler, API.space.clear) - ] - ], {modes:ALL, expert:true}), + // mode: UC.newGroup(LANG.mo_menu, assets, {region:"left", poprow:false}), + // modeTable: UC.newTableRow([ + // [ UI.modeFDM = UC.newButton(LANG.mo_fdmp, function() { API.mode.set('FDM',null,platform.update_size) }, {icon: icons.fdm}) ], + // [ UI.modeSLA = UC.newButton(LANG.mo_slap, function() { API.mode.set('SLA',null,platform.update_size) }, {icon: icons.sla}) ], + // [ UI.modeLASER = UC.newButton(LANG.mo_lazr, function() { API.mode.set('LASER',null,platform.update_size) }, {icon: icons.laser}) ], + // [ UI.modeCAM = UC.newButton(LANG.mo_cncm, function() { API.mode.set('CAM',null,platform.update_size) }, {icon: icons.cnc, id:"modeCAM"}) ] + // ]), + // system: UC.newGroup(LANG.su_menu), + // sysTable: UC.newTableRow([ + // [ UI.setupDevices = UC.newButton(LANG.su_devi, showDevices) ], + // [ UI.setupTools = UC.newButton(LANG.su_tool, showTools, {modes:CAM}) ], + // [ UI.setupExport = UC.newButton(LANG.su_xprt, settingsExport, {modes:ALL, expert:true}) ], + // [ UI.localButton = UC.newButton(LANG.su_locl, API.show.local, {modes:FDM_CAM, expert:true}) ] + // ]), + // wsFile: UC.newGroup(LANG.fe_menu), + // wsFileTable: UC.newTableRow([ + // [ UI.import = UC.newButton(LANG.fn_recn, undefined, {class:"asym"}) ], + // [ UI.load = UC.newButton(LANG.fn_impo, function() { API.event.import() }, {class:"asym"}) ] + // ]), + // wsFunc: UC.newGroup(LANG.fn_menu), + // wsFuncTable: UC.newTableRow([ + // [ UI.modeArrange = UC.newButton(LANG.fn_arra, platform.layout) ], + // [ UI.modeSlice = UC.newButton(LANG.fn_slic, API.function.slice) ], + // [ UI.modePreview = UC.newButton(LANG.fn_prev, API.function.print) ], + // [ UI.modeExport = UC.newButton(LANG.fn_expo, API.function.export) ] + // ]), + // + // workspace: UC.newGroup(LANG.ws_menu, undefined, {modes:ALL, expert:true}), + // wsTable: UC.newTableRow([ + // [ + // UC.newButton(LANG.vu_sptp, SPACE.view.top), + // UC.newButton(LANG.vu_home, SPACE.view.home), + // ],[ + // UI.saveButton = + // UC.newButton(LANG.ws_save, API.space.save), + // UC.newButton(LANG.ws_cler, API.space.clear) + // ] + // ], {modes:ALL, expert:true}), layout: UC.newGroup(LANG.op_menu), expert: UC.newBoolean(LANG.op_xprt_s, booleanSave, {title:LANG.op_xprt_l}), @@ -1234,9 +1236,9 @@ units: UC.newSelect(LANG.op_unit_s, {title: LANG.op_unit_l, modes:CAM}, "units"), // allow modules to insert new items at the bottom of the left menu - appendLeft: UC.checkpoint(), + // appendLeft: UC.checkpoint(), - settingsGroup: UC.newGroup(LANG.se_menu, control, {region:"right"}), + settingsGroup: UC.newGroup(LANG.se_menu, $('settings'), {region:"right"}), settingsTable: UC.newTableRow([ [ UI.settingsLoad = @@ -1508,74 +1510,74 @@ } SPACE.onEnterKey([ - UI.layerSpan, function() { API.show.slices() }, - UI.layerID, function() { API.show.layer(UI.layerID.value) }, - UI.scaleX, selectionScale, - UI.scaleY, selectionScale, - UI.scaleZ, selectionScale, - UI.sizeX, selectionSize, - UI.sizeY, selectionSize, - UI.sizeZ, selectionSize, - UI.toolName, updateTool, - UI.toolNum, updateTool, - UI.toolFluteDiam, updateTool, - UI.toolFluteLen, updateTool, - UI.toolShaftDiam, updateTool, - UI.toolShaftLen, updateTool, - UI.toolTaperTip, updateTool, - $('rot_x'), selectionRotate, - $('rot_y'), selectionRotate, - $('rot_z'), selectionRotate + // UI.layerSpan, function() { API.show.slices() }, + // UI.layerID, function() { API.show.layer(UI.layerID.value) }, + // UI.scaleX, selectionScale, + // UI.scaleY, selectionScale, + // UI.scaleZ, selectionScale, + // UI.sizeX, selectionSize, + // UI.sizeY, selectionSize, + // UI.sizeZ, selectionSize, + // UI.toolName, updateTool, + // UI.toolNum, updateTool, + // UI.toolFluteDiam, updateTool, + // UI.toolFluteLen, updateTool, + // UI.toolShaftDiam, updateTool, + // UI.toolShaftLen, updateTool, + // UI.toolTaperTip, updateTool, + // $('rot_x'), selectionRotate, + // $('rot_y'), selectionRotate, + // $('rot_z'), selectionRotate ]); - UI.layerID.convert = UC.toFloat.bind(UI.layerID); - UI.layerSpan.convert = UC.toFloat.bind(UI.layerSpan); - UI.layerRange.onclick = function() { - UI.layerRange.checked = !(UI.layerRange.checked || false); - API.show.slices(); - }; + // UI.layerID.convert = UC.toFloat.bind(UI.layerID); + // UI.layerSpan.convert = UC.toFloat.bind(UI.layerSpan); + // UI.layerRange.onclick = function() { + // UI.layerRange.checked = !(UI.layerRange.checked || false); + // API.show.slices(); + // }; + // + // $('layer-toggle').onclick = function(ev) { + // let ls = UI.layers.style; + // ls.display = ls.display !== 'block' ? 'block' : 'none'; + // UI.layers.style.left = ev.target.getBoundingClientRect().left + 'px'; + // }; - $('layer-toggle').onclick = function(ev) { - let ls = UI.layers.style; - ls.display = ls.display !== 'block' ? 'block' : 'none'; - UI.layers.style.left = ev.target.getBoundingClientRect().left + 'px'; - }; + // UI.modelOpacity.onchange = UI.modelOpacity.onclick = function(ev) { + // API.widgets.opacity(parseInt(UI.modelOpacity.value)/100); + // }; + // + // UI.layerSlider.ondblclick = function() { + // UI.layerRange.checked = !UI.layerRange.checked; + // API.show.slices(); + // }; + // + // UI.layerSlider.onmousedown = function(ev) { + // if (ev.shiftKey) UI.layerRange.checked = !UI.layerRange.checked; + // }; + // + // UI.layerSlider.onclick = function() { + // API.show.layer(UI.layerSlider.value); + // }; + // + // UI.layerSlider.onmousemove = UI.layerSlider.onchange = function() { + // API.show.layer(UI.layerSlider.value); + // }; + // + // UI.layerSlider.onmouseup = function() { API.focus() }; + // + // UI.import.setAttribute("import","1"); + // UI.import.onclick = function() { + // UC.hidePoppers(); + // API.dialog.show("catalog"); + // }; + // + // $('cache-close').onclick = API.dialog.hide; + // + // UI.toolMetric.onclick = updateTool; + // UI.toolType.onchange = updateTool; - UI.modelOpacity.onchange = UI.modelOpacity.onclick = function(ev) { - API.widgets.opacity(parseInt(UI.modelOpacity.value)/100); - }; - - UI.layerSlider.ondblclick = function() { - UI.layerRange.checked = !UI.layerRange.checked; - API.show.slices(); - }; - - UI.layerSlider.onmousedown = function(ev) { - if (ev.shiftKey) UI.layerRange.checked = !UI.layerRange.checked; - }; - - UI.layerSlider.onclick = function() { - API.show.layer(UI.layerSlider.value); - }; - - UI.layerSlider.onmousemove = UI.layerSlider.onchange = function() { - API.show.layer(UI.layerSlider.value); - }; - - UI.layerSlider.onmouseup = function() { API.focus() }; - - UI.import.setAttribute("import","1"); - UI.import.onclick = function() { - UC.hidePoppers(); - API.dialog.show("catalog"); - }; - - $('cache-close').onclick = API.dialog.hide; - - UI.toolMetric.onclick = updateTool; - UI.toolType.onchange = updateTool; - - $('apphelp').onclick = API.help.show; + $('app-name').onclick = API.help.show; SPACE.platform.setSize( settings().device.bedWidth, @@ -1583,7 +1585,7 @@ settings().device.bedHeight ); - UI.selection.classList.add('compact'); + // UI.selection.classList.add('compact'); if (dark) { SPACE.platform.setGrid(25, 5, 0x999999, 0x333333); @@ -1765,7 +1767,7 @@ API.dialog.update(); // show version on startup - API.show.alert(`${LANG.version} ${KIRI.version}`); + $('app-vers').innerHTML = KIRI.version; if (!SETUP.s) console.log(`kiri | init main | ${KIRI.version}`); diff --git a/src/kiri/main.js b/src/kiri/main.js index 7197cbbc..eb30a58f 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -39,7 +39,7 @@ newWidget = kiri.newWidget, // --------------- UI = {}, - UC = MOTO.ui.prefix('kiri').inputAction(updateSettings).hideAction(updateDialogLeft), + UC = KIRI.ui.prefix('kiri').inputAction(updateSettings).hideAction(updateDialogLeft), MODE = MODES.FDM, onEvent = {}, currentPrint = null, @@ -502,6 +502,7 @@ } function updateSliderMax(set) { + return console.log('TODO updateSliderMax'); let max = 0; if (viewMode === VIEWS.PREVIEW && currentPrint) { max = currentPrint.getLayerCount(); @@ -558,8 +559,8 @@ layer = bound(layer, 0, API.var.layer_max); - UI.layerID.value = layer; - UI.layerSlider.value = layer; + // UI.layerID.value = layer; + // UI.layerSlider.value = layer; let j, slice, @@ -849,12 +850,12 @@ }); if (bounds.min.x === Infinity) { if (selectedMeshes.length === 0) { - UI.sizeX.value = 0; - UI.sizeY.value = 0; - UI.sizeZ.value = 0; - UI.scaleX.value = 1; - UI.scaleY.value = 1; - UI.scaleZ.value = 1; + // UI.sizeX.value = 0; + // UI.sizeY.value = 0; + // UI.sizeZ.value = 0; + // UI.scaleX.value = 1; + // UI.scaleY.value = 1; + // UI.scaleZ.value = 1; } return; } @@ -862,17 +863,17 @@ dy = bounds.max.y - bounds.min.y, dz = bounds.max.z - bounds.min.z, scale = unitScale(); - UI.sizeX.value = UI.sizeX.was = UTIL.round(dx/scale,2); - UI.sizeY.value = UI.sizeY.was = UTIL.round(dy/scale,2); - UI.sizeZ.value = UI.sizeZ.was = UTIL.round(dz/scale,2); - UI.scaleX.value = UI.scaleX.was = track.scale.x; - UI.scaleY.value = UI.scaleY.was = track.scale.y; - UI.scaleZ.value = UI.scaleZ.was = track.scale.z; + // UI.sizeX.value = UI.sizeX.was = UTIL.round(dx/scale,2); + // UI.sizeY.value = UI.sizeY.was = UTIL.round(dy/scale,2); + // UI.sizeZ.value = UI.sizeZ.was = UTIL.round(dz/scale,2); + // UI.scaleX.value = UI.scaleX.was = track.scale.x; + // UI.scaleY.value = UI.scaleY.was = track.scale.y; + // UI.scaleZ.value = UI.scaleZ.was = track.scale.z; } function setOpacity(value) { forAllWidgets(function (w) { w.setOpacity(value) }); - UI.modelOpacity.value = value * 100; + // UI.modelOpacity.value = value * 100; SPACE.update(); } @@ -1018,8 +1019,8 @@ } function platformUpdateSelected() { - UI.selection.style.display = platform.selected_count() ? 'inline' : 'none'; - $('ext-sel').style.display = (MODE === MODES.FDM) ? 'inline-block' : 'none'; + // UI.selection.style.display = platform.selected_count() ? 'inline' : 'none'; + // $('ext-sel').style.display = (MODE === MODES.FDM) ? 'inline-block' : 'none'; let extruders = settings.device.extruders; if (extruders) { for (let i=0; i -- All Rights Reserved */ + +"use strict"; + +(function() { + + if (kiri.ui) return; + + let SELF = self, + KIRI = self.kiri, + lastRegion = null, + lastGroup = null, + lastDiv = null, + addTo = null, + hideAction = null, + inputAction = null, + groups = {}, + groupShow = {}, + groupName = undefined, + hideable = {}, + hasModes = [], + isExpert = [], + letMode = null, + letExpert = false, + SDB = moto.KV, + DOC = SELF.document, + prefix = "tab", + NOMODE = "nomode", + exitimer = undefined; + + SELF.$ = (SELF.$ || function (id) { return DOC.getElementById(id) } ); + + KIRI.ui = { + prefix: function(pre) { prefix = pre; return kiri.ui }, + hideAction: function(fn) { hideAction = fn; return kiri.ui }, + inputAction: function(fn) { inputAction = fn; return kiri.ui }, + setMode: setMode, + setExpert: setExpert, + bound: bound, + toInt: toInt, + toFloat: toFloat, + hidePop: hidePop, + isPopped: isPopped, + newText: newTextArea, + newLabel: newLabel, + newRange: newRange, + newInput: newInputField, + newButton: newButton, + newBoolean: newBooleanField, + newSelect: newSelect, + newTable: newTables, + newTableRow: newTableRow, + newRow: newRow, + newBlank: newBlank, + newGroup: newGroup, + setGroup: setGroup, + hidePoppers: hidePoppers, + checkpoint, + restore + }; + + function setMode(mode) { + // $('control-left').classList.add('compact'); + // $('control-right').classList.add('compact'); + Object.keys(groupShow).forEach(group => { + updateGroupShow(group); + }); + letMode = mode; + hasModes.forEach(function(div) { + div.setMode(div._group && !groupShow[div._group] ? NOMODE : mode); + }); + } + + function setExpert(bool) { + letExpert = bool; + setMode(letMode); + } + + function checkpoint() { + return { addTo, lastDiv, lastGroup, lastRegion, groupName }; + } + + function restore(opt) { + if (opt) { + addTo = opt.addTo; + lastDiv = opt.lastDiv; + lastGroup = opt.lastGroup; + lastRegion = opt.lastRegion; + groupName = opt.groupName; + } + } + + // at present only used by the layers popup menu + function setGroup(div) { + addTo = lastDiv = div; + groupName = undefined; + lastGroup = []; + return div; + } + + function newGroup(label, div, options) { + lastDiv = div || lastDiv; + return addCollapsableGroup(label, lastDiv, options); + } + + function addCollapsableGroup(label, div, options) { + let opt = options || {}; + let group = opt.group || label; + lastRegion = opt.region || lastRegion; + hideable[group] = opt.nocompact === true ? false : true; + + let row = DOC.createElement('div'), + a = DOC.createElement('a'), + dbkey = `beta-${prefix}-show-${group}`, + popper = !opt.nocompact; + + if (popper) { + let pop = DOC.createElement('div'); + pop.classList.add('popper'); + if (lastRegion) pop.classList.add(lastRegion); + if (opt.poprow) pop.classList.add('poprow') + row.appendChild(pop); + addTo = pop; + } else { + addTo = lastDiv; + } + + div.appendChild(row); + row.setAttribute("class", "grouphead noselect"); + row.appendChild(a); + a.appendChild(DOC.createTextNode(label)); + addModeControls(row, opt); + lastGroup = groups[group] = []; + lastGroup.key = dbkey; + groupName = group; + groupShow[group] = popper ? SDB[dbkey] === 'true' : SDB[dbkey] !== 'false'; + row.onclick = function(ev) { + if (ev.target !== a && ev.target !== row) { + return; + } + toggleGroup(group, dbkey); + }; + if (popper) { + row.onmouseenter = function(ev) { + if (ev.target !== a && ev.target !== row) { + return; + } + clearTimeout(exitimer); + showGroup(group); + }; + row.onmouseleave = function(ev) { + if (ev.target !== a && ev.target !== row) { + return; + } + clearTimeout(exitimer); + exitimer = setTimeout(showGroup, 1000); + }; + addTo._group = group; + addModeControls(addTo, opt); + lastGroup.push(addTo); + } + + return row; + } + + function hidePoppers() { + showGroup(undefined); + } + + function showGroup(groupname) { + Object.keys(groups).forEach(name => { + let group = groups[name]; + groupShow[name] = SDB[group.key] = (groupname === name); + updateGroupShow(name); + }); + } + + function toggleGroup(groupname, dbkey) { + let show = SDB[dbkey] === 'false'; + groupShow[groupname] = hideable[groupname] ? SDB[dbkey] = show : true; + updateGroupShow(groupname); + } + + function updateGroupShow(groupname) { + let show = groupShow[groupname] || !hideable[groupname]; + let group = groups[groupname]; + group.forEach(div => { + if (show) div.setMode(letMode); + else div.setMode(NOMODE); + }); + } + + function toInt() { + let nv = this.value !== '' ? parseInt(this.value) : null; + if (isNaN(nv)) nv = 0; + if (nv !== null && this.bound) nv = this.bound(nv); + this.value = nv; + return nv; + } + + function toFloat() { + let nv = this.value !== '' ? parseFloat(this.value) : null; + if (nv !== null && this.bound) nv = this.bound(nv); + this.value = nv; + return nv; + } + + function bound(low,high) { + return function(v) { + if (isNaN(v)) return low; + return v < low ? low : v > high ? high : v; + }; + } + + function raw() { + return this.value !== '' ? this.value : null; + } + + function newLabel(text) { + let label = DOC.createElement('label'); + label.appendChild(DOC.createTextNode(text)); + label.setAttribute("class", "noselect"); + return label; + } + + function addId(el, options) { + if (options && options.id) { + el.setAttribute("id", options.id); + } + } + + function addModeControls(el, options) { + options = options || {}; + el.__show = true; + el.__modeSave = null; + el.showMe = function() { + if (el.__show) return; + el.style.display = el.__modeSave; + el.__show = true; + el.__modeSave = null; + }; + el.hideMe = function() { + if (!el.__show) return; + el.__show = false; + el.__modeSave = el.style.display; + el.style.display = 'none'; + }; + el.setVisible = function(show) { + if (show) el.showMe(); + else el.hideMe(); + }; + el.setMode = function(mode) { + let show = options.expert === undefined || (options.expert === letExpert); + el.setVisible(el.hasMode(mode) && show); + } + el.hasMode = function(mode) { + if (mode === NOMODE) return false; + if (!el.modes) return true; + return el.modes.contains(mode); + } + if (options.modes) { + el.modes = options.modes; + hasModes.push(el); + } + } + + function newDiv(options) { + let div = DOC.createElement('div'); + addModeControls(div, options); + addTo.appendChild(div); + lastGroup.push(div); + div._group = groupName; + return div; + } + + let lastPop = null; + let savePop = null; + + function hidePop() { + if (lastPop) { + lastPop.style.display = "none"; + } + if (savePop) { + savePop(); + savePop = null; + } + lastPop = null; + } + + function isPopped() { + return lastPop !== null; + } + + function newTextArea(label, options) { + let opt = options || {}, + row = newDiv(options), + btn = DOC.createElement("button"), + box = DOC.createElement("div"), + pop = DOC.createElement("div"), + lbl = DOC.createElement("label"), + txt = DOC.createElement("textarea"); + + pop.setAttribute("class", "poptext flow-col"); + box.setAttribute("style", "position: relative"); + box.appendChild(pop); + pop.appendChild(lbl); + pop.appendChild(txt); + lbl.appendChild(DOC.createTextNode(label)); + + txt.setAttribute("cols", 40); + txt.setAttribute("rows", 20); + txt.setAttribute("wrap", "off"); + + btn.appendChild(DOC.createTextNode("edit")); + btn.onclick = function(ev) { + ev.stopPropagation(); + if (ev.target === txt) { + // drop clicks on TextArea + ev.target.focus(); + } else { + // first time, button click / show + btn.parentNode.appendChild(box); + btn.parentNode.onclick = btn.onclick; + txt.scrollTop = 0; + txt.scrollLeft = 0; + txt.selectionEnd = 0; + let rows = txt.value.split('\n'); + let cols = 0; + rows.forEach(row => { + cols = Math.max(cols, row.length); + }); + txt.setAttribute("cols", Math.max(30, cols + 1)); + txt.setAttribute("rows", Math.max(10, rows.length + 1)); + + let showing = pop === lastPop; + hidePop(); + if (!showing) { + savePop = inputAction; + pop.style.display = "flex"; + lastPop = pop; + txt.focus(); + } else { + inputAction(); + } + } + }; + addModeControls(btn, opt); + addId(btn, opt); + + row.appendChild(newLabel(label)); + row.appendChild(btn); + row.setAttribute("class", "flow-row"); + if (opt.title) row.setAttribute("title", options.title); + btn.setVisible = row.setVisible; + + return txt; + } + + function newInputField(label, options) { + let opt = options || {}, + row = newDiv(opt), + hide = opt && opt.hide, + size = opt ? opt.size || 5 : 5, + height = opt ? opt.height : 0, + ip = height > 1 ? DOC.createElement('textarea') : DOC.createElement('input'), + action = opt.action || inputAction; + + row.appendChild(newLabel(label)); + row.appendChild(ip); + row.setAttribute("class", "flow-row"); + if (height > 1) { + ip.setAttribute("cols", size); + ip.setAttribute("rows", height); + ip.setAttribute("wrap", "off"); + } else { + if (Number.isInteger(size)) { + ip.setAttribute("size", size); + } else { + ip.setAttribute("style", `width:${size}`); + } + } + ip.setAttribute("type", "text"); + row.style.display = hide ? 'none' : ''; + if (opt) { + if (opt.disabled) ip.setAttribute("disabled", "true"); + if (opt.title) row.setAttribute("title", opt.title); + if (opt.convert) ip.convert = opt.convert.bind(ip); + if (opt.bound) ip.bound = opt.bound; + if (opt.action) action = opt.action; + } + ip.addEventListener('focus', function(event) { + hidePop(); + }); + if (action) { + ip.addEventListener('keydown', function(event) { + let key = event.key; + if ( + opt.text || + (key >= '0' && key <= '9') || + key === '.' || + key === '-' || + key === 'Backspace' || + key === 'Delete' || + key === 'ArrowLeft' || + key === 'ArrowRight' || + key === 'Tab' || + event.metaKey || + event.ctrlKey || + (key === ',' && options.comma) + ) { + return; + } + event.preventDefault(); + event.stopPropagation(); + }); + ip.addEventListener('keyup', function(event) { + if (event.keyCode === 13) { + // action(event); + ip.blur(); + } + }); + ip.addEventListener('blur', function(event) { + action(event); + }); + } + if (!ip.convert) ip.convert = raw.bind(ip); + ip.setVisible = row.setVisible; + + return ip; + } + + function newRange(label, options) { + let row = newDiv(options), + ip = DOC.createElement('input'), + hide = options && options.hide, + action = inputAction; + + if (label) row.appendChild(newLabel(label)); + row.appendChild(ip); + row.setAttribute("class", "flow-row"); + ip.setAttribute("type", "range"); + ip.setAttribute("min", (options && options.min ? options.min : 0)); + ip.setAttribute("max", (options && options.max ? options.max : 100)); + ip.setAttribute("value", 0); + row.style.display = hide ? 'none' : ''; + if (options) { + if (options.title) { + ip.setAttribute("title", options.title); + row.setAttribute("title", options.title); + } + if (options.action) action = options.action; + } + ip.setVisible = row.setVisible; + + return ip; + } + + function newSelect(label, options, source) { + let row = newDiv(options), + ip = DOC.createElement('select'), + hide = options && options.hide, + action = inputAction; + + row.appendChild(newLabel(label)); + row.appendChild(ip); + row.setAttribute("source", source || "tools"); + row.setAttribute("class", "flow-row"); + row.style.display = hide ? 'none' : ''; + if (options) { + if (options.convert) ip.convert = options.convert.bind(ip); + if (options.disabled) ip.setAttribute("disabled", "true"); + if (options.title) row.setAttribute("title", options.title); + if (options.action) action = options.action; + } + ip.onchange = function() { action() }; + ip.setVisible = row.setVisible; + + return ip; + } + + function newBooleanField(label, action, options) { + let row = newDiv(options), + ip = DOC.createElement('input'), + hide = options && options.hide; + + if (label) { + row.appendChild(newLabel(label)); + } + row.appendChild(ip); + row.setAttribute("class", "flow-row"); + row.style.display = hide ? 'none' : ''; + ip.setAttribute("type", "checkbox"); + ip.checked = false; + if (options) { + if (options.disabled) ip.setAttribute("disabled", "true"); + if (options.title) { + ip.setAttribute("title", options.title); + row.setAttribute("title", options.title); + } + } + if (action) ip.onclick = function() { action() }; + ip.setVisible = row.setVisible; + + return ip; + } + + function newBlank(options) { + let row = newDiv(options), + hide = options && options.hide; + + row.setAttribute("class", "flow-row"); + row.style.display = hide ? 'none' : ''; + ip.setVisible = row.setVisible; + + return ip; + } + + function newButton(label, action, options) { + let b = DOC.createElement('button'), + t = DOC.createTextNode(label); + + b.onclick = function() { + hidePoppers(); + if (action) action(); + }; + + if (options) { + if (options.class) b.classList.add(options.class); + if (options.icon) { + let d = DOC.createElement('div'); + d.innerHTML = options.icon; + b.appendChild(d); + } + } + + b.appendChild(t); + + addModeControls(b, options); + addId(b, options); + + return b; + } + + function newTableRow(arrayOfArrays, options) { + return newRow(newTables(arrayOfArrays), options); + } + + function newTables(arrayOfArrays) { + let array = []; + for (let i=0; i a { - text-transform: uppercase; -} -.grouphead:hover { - cursor: default; -} -.ck_catalog { - padding-top: 2px; -} -.ck_catalog div { - -webkit-flex-direction: row; - -webkit-justify-content: center; - -webkit-align-items: center; - display: -webkit-flex; - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - margin-bottom: 1px; -} -.ck_catalog button { - margin: 0px 0px 1px 2px !important; -} -.buton { - font-weight: bold; - background-color: #bbb; -} -.flow-row { - position: relative; - -webkit-flex-direction: row; - -webkit-justify-content: flex-end; - display: -webkit-flex; - display: flex; - flex-direction: row; - justify-content: flex-end; -} -.flow-row label { - -webkit-flex-basis: auto; - -webkit-flex-grow: 1; - flex-basis: auto; - flex-grow: 1; -} -.flow-col { - position: relative; - -webkit-flex-direction: column; - -webkit-justify-content: flex-start; - display: -webkit-flex; - display: flex; - flex-direction: column; - justify-content: flex-start; -} -.flow-left { - -webkit-justify-content: flex-start; - justify-content: flex-start; -} -.flow-grow { - -webkit-flex-grow: 1; - flex-grow: 1 -} -.flow-space-between { - -webkit-justify-content: space-between; - justify-content: space-between; -} - -:-moz-any(#control-left) { - overflow-x: hidden !important; - overflow-y: hidden !important; -} -:-moz-any(#control-right) { - overflow-x: scroll !important; - overflow-y: scroll !important; - margin-right: -14px !important; - margin-bottom: -14px !important; -} -.dark .control { - border: 0 !important; - background-color: rgba(255,255,255,0.5); -} -.dark .control button { - border: 1px solid rgba(128,128,128,0.5); -} -.control { - background-color: rgba(255,255,255,0.75); -} -.control label { - padding: 2px; -} -.control input { +input { background-color: #eee; margin-bottom: 1px; text-align: right; border: 1px solid #bbb; } -.control input:focus { +input:focus { background-color: #fec; outline: none; } -.control input[disabled] { +input[disabled] { background-color: #ccc; color: #000; border-width: 1px; } -.control input[type="range"] { +input[type="range"] { width: 85px; background-color: transparent; } -.control select { +input[type=range]::-moz-focus-outer { + border: 0; +} +select { + outline: none; +} +select { border: 1px solid #bbb; background-color: #eee; margin-bottom: 1px !important; border-radius: 3px; } -.control button { - margin: 1px; +th, tr, td, span, div, label, button { + user-select: none; } -.control .flow-row { - align-items: center; - justify-content: center; -} -.dark #appid span { - border-color: #555; - background-color: rgba(100,120,150,0.75); - color: #eee; -} -.dark #appid a { - color: #eee; -} -.dark #appid a:hover { - color: #eee; -} -.dark #appid span:hover { - background-color: rgba(80,100,230,0.75); -} -.dark #langpop { - color: black; -} -#appid { - text-align: center; - position: fixed; - width: 100%; - top: 3px; -} -#appid span { - border: 1px solid #ccc; - border-radius: 5px; - padding: 5px 8px 3px 8px; - background-color: rgba(170,221,255,0.75); - color: rgba(0,0,0,0.5); -} -#appid span:hover { - background-color: rgba(170,221,255,0.5); -} -#appid a { - color: rgba(0,0,0,0.75); - font-weight: bold; -} -#appid a:hover { - color: rgba(0,50,50,0.75); -} -#apphelp { - margin-left: 5px; - font-weight: bold; -} -#applang { - position: relative; - margin-right: 5px; - font-weight: bold; -} -#langpop { - display: none; - position: absolute; - white-space: nowrap; - top: 105%; - left: 0; - border-radius: 5px; - border: 1px solid #ddd; - background-color: rgba(255,255,255,0.75); - padding: 5px; -} -#langpop > div { - padding: 5px; -} -#langpop > div:hover { - background-color: rgba(255,128,128,0.5); - border-radius: 5px; -} -#applang:hover #langpop { - display: block; -} -#container { - width: 100%; - height: 100%; -} -#control > div:hover label { - text-decoration: underline; - text-decoration-color: #aaa; -} -#control-left { - display: none; - position: fixed; - z-index: 10000; - color: black; - top: 5px; - left: 0px; - padding: 5px; - border-top: 2px solid #ddd; - border-right: 2px solid #ddd; - border-bottom: 2px solid #ddd; - border-top-right-radius: 3px; - border-bottom-right-radius: 3px; - overflow-x: visible; - overflow-y: scroll; -} -#control-right { - display: none; - position: fixed; - z-index: 10000; - top: 5px; - right: 0px; - bottom: 5px; - padding: 5px; - border-top: 2px solid #ddd; - border-left: 2px solid #ddd; - border-bottom: 2px solid #ddd; - border-top-left-radius: 3px; - border-bottom-left-radius: 3px; - color: #222; - overflow-y: scroll; - overflow-x: visible; -} -.dark .compact .grouphead { - background-color: rgba(100,120,150,0.75); - border: 1px solid #555; - color: #eee; -} -.dark .compact .grouphead:hover { - background-color: rgba(80,100,230,0.75); -} -.dark .compact.control { - background-color: rgba(128,128,128,0.2) !important; -} -.compact { - overflow: visible !important; - bottom: auto !important; - border: 0 !important; - background-color: rgba(255,255,255,0.5) !important; -} -.compact .grouphead { - padding: 10px 5px 10px 5px !important; - background-color: rgba(170,221,255,0.25); -} -.compact .grouphead:hover { - background-color: rgba(170,221,255,0.9); -} -.compact .grouphead a { - font-size: larger !important; - margin: 5px !important; -} -.compact .flow-row label { - font-size: 18px !important; -} -.compact .flow-row input { - font-size: 18px !important; -} -.compact .flow-row select { - font-size: 18px !important; -} -.compact .flow-row { - margin: 3px 0 3px 0; -} -.compact .asym { - width: auto !important; -} -.compact button { - font-size: larger !important; - padding: 5px 10px 5px 10px; -} -:-moz-any(#control-left.compact) { - overflow-x: display !important; - overflow-y: display !important; -} -:-moz-any(#control-right.compact) { - overflow-x: display !important; - overflow-y: display !important; - margin-right: auto !important; - margin-bottom: auto !important; -} -#control-left::-webkit-scrollbar, #control-right::-webkit-scrollbar { - display: none; -} -.dark #control-left:hover, .dark #control-right:hover { - background-color: rgba(255,255,255,0.6); -} -#control-left:hover, #control-right:hover { - background-color: #ffffff; -} -#loading { - position: fixed; - top: 5px; - left: 20%; - right: 20%; - border: 1px solid white; - margin: 2px; - background-color: #ddd; - text-align: center; - display: none; -} -#modal { - display: none; - position: fixed; - z-index: 20000; - top: 0px; - left: 0px; - right: 0px; - bottom: 0px; - background-color: rgba(0,0,0,0); -} -#progress { - position: relative; - width: 1%; - height: 100%; - background-color: #f00; -} -#welcome { - color: white; - padding: 10px; - border: 10px solid white; - background-color: rgba(20,20,20,0.75); - position: fixed; - top: 50px; - left: 0; - right: 0; - bottom: 100px; - margin: 0 auto; - width: 50%; - max-width: 800px; - min-width: 500px; - display: block; - unicode-bidi: embed; - font-family: monospace; - white-space: pre; - overflow-y: scroll +.noselect { + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } -input[type=range]::-moz-focus-outer { - border: 0; -} -.grouphead { - position: relative; -} -.dark .popper { - background-color: rgba(255,255,255,0.75); - color: black; -} -.popper { - position: absolute; - top: 0; - z-index: 50000; - background-color: white; - border: 1px solid #aaa; - border-radius: 3px; - padding: 5px; - white-space: nowrap; - text-align: left; -} -.popper.left { - left: 105%; -} -.popper.right { - right: 105%; -} -.popper svg { - width: 40px; - height: 40px; -} -.poprow > div { - display: flex; +.row { flex-direction: row; } -.dialog { - display: none; - color: black; - padding: 10px; - border: 3px solid #ddd; - border-radius: 3px; - background-color: rgba(255,255,255,0.75); - position: fixed; - top: 5px; -} -.dialog span { - padding: 2px 5px 2px 5px; - margin: 0 5px 5px 5px; - background-color: #eee; - border-radius: 5px; - border: 1px solid #aaa; - text-align: center; -} -.helper { - position: relative; - display: none; -} -.mono { - unicode-bidi: embed; - font-family: monospace; - white-space: pre; -} -.sel-span { - position: relative; - display: inline-block; -} -.sel-pop { - display: none; - position: absolute; - bottom: 100%; - left: 0; - padding-bottom: 5px; -} -.sel-pop div, .sel-pop table { - background-color: white; - border: 1px solid #ddd; - border-radius: 5px; - padding: 5px; -} -.sel-span:hover .sel-pop { - display: block; -} -.compact .sel-span .value { - font-size: 16px; - color: #444466 !important; -} -.compact .sel-span label { - font-size: 20px; -} -.compact .sel-span input { - font-size: 18px; - margin: 4px; -} -#localCache { - border-bottom: 1px solid #ddd !important; - padding-bottom: 8px !important; - margin-bottom: 4px; -} -#localCache button { - position: absolute; - right: 0; -} -#widget-info { - text-align: center; +.col { + flex-direction: column; +} +.auto { + flex-basis: auto; +} +.grow { + flex-grow: 1; +} +.a-start { + align-items: flex-start; +} +.a-center { + align-items: center; +} +.a-end { + align-items: flex-end; +} +.j-start { + justify-content: flex-start; +} +.j-center { + justify-content: center; +} +.j-end { + justify-content: flex-end; +} +.space-between { + justify-content: space-between; +} + +:-moz-any() { + overflow-x: hidden !important; + overflow-y: hidden !important; +} +:-moz-any() { + overflow-x: scroll !important; + overflow-y: scroll !important; + margin-right: -14px !important; + margin-bottom: -14px !important; +} + +#container { position: fixed; + z-index: -1000; width: 100%; - bottom: -5px; + height: 100%; } -#widget-info span { - border: 1px solid #ccc; - border-radius: 5px; - margin: 0 3px 0 3px; - padding: 3px 10px 10px 10px; - background-color: rgba(170,221,255,0.75); - font-weight: bold; +#container canvas { + width: 100%; + height: 100%; + overflow: hidden; +} + +#top { + font-family: 'Russo One', sans-serif; + background-color: rgba(255,255,255,0.75); + padding: 3px; +} +#top > div { + margin: 0 5px 0 5px; +} + +#app-vers, #app-acct { + width: 125px; +} + +#app-acct { + justify-content: flex-end; +} + +#mid { + pointer-events: none; +} + +#mid-lcol, #mid-rcol, #modal { + pointer-events: visible; +} + +#mid-sep { + height: 1px; + background-image: linear-gradient(to right, #ddd, #666, #ddd); +} + +.pop-lcol { + position: absolute; + display: none; + top: -3px; + left: 100%; z-index: 10; } -#widget-info label { - border: 0; - color: rgba(0,0,0,0.75); - white-space: nowrap; - font-weight: bold; -} -#widget-info .value { - font-style: italic; - background-color: #f4f4f4; - outline: none; - color: black; -} -#widget-info .value:focus { - background-color: #fec; -} -#widget-info button { - margin: 0 2px 0 2px !important; - border: 1px solid rgba(255,255,255,0.75); -} -#sel-ext { - display: flex; + +.pop-lcol > div { flex-direction: column; -} -#stock,#selection { - display: none; -} -#stock label { - background-color: transparent !important; -} -#selection { - background-color: transparent !important; -} -#container { - width: 100%; - height: 100%; -} -#loading { - position: fixed; - top: 30px; - left: 20%; - right: 20%; + align-items: center; margin: 2px; - background-color: rgba(200,200,200,0.65); - border: 3px solid rgba(200,200,200,0.5); - border-radius: 5px; - text-align: center; - display: none; -} -#progress { - display: flex; - position: relative; - text-align: left; - background-color: rgba(255,0,0,0.75); - width: 100%; -} -#prostatus { - color: white; padding: 5px; - margin: 5px; - white-space: nowrap; + background-color: rgba(255,255,255,0.75); + border: 1px solid rgba(0,0,0,0); + border-radius: 3px; + width: 60px; + color: #89a; } + +.pop-lcol > div:hover { + background-color: #eee; + border: 1px solid #aaa; + color: #000; +} + +.lt-menu { + flex-direction: column; + align-items: center; + margin: 2px 0 2px 0; + padding: 5px 5px 5px 10px; + border: 1px solid rgba(0,0,0,0); + border-radius: 3px; + color: #89a; + left: -5px; + background-color: rgba(255,255,255,0.75); +} + +.lt-menu svg { + font-size: 40px; + text-align: center; +} + +.lt-menu label { + font-size: smaller; +} + +.lt-menu:hover { + background-color: #eee; + border: 1px solid #aaa; + color: #000; +} + +.lt-menu:hover .pop-lcol { + display: flex; +} + +#bot { + text-align: center; + font-size: smaller; + height: 25px; +} + +#progress { + display: none; + position: absolute; + bottom: 0px; + top: 0px; + left: 10%; + right: 10%; + text-align: center; + background-color: #ddd; +} +#progbar { + width: 100%; + text-align: left; + position: relative; + background-color: rgba(255,0,0,0.75); +} +#progtxt { + color: white; + height: 25px; + padding: 0 5px 0 5px; + margin: 0 5px 0 5px; + white-space: nowrap; + flex-direction: row; + align-items: center; + vertical-align: middle; +} + #modal { - z-index: 20000; + display: none; position: fixed; + z-index: 10000; top: 0px; left: 0px; right: 0px; bottom: 0px; - background-color: rgba(0,0,0,0.2); - display: none; + background-color: rgba(0,0,0,0.5); } -.modal-x { +#slider { + display: none; position: absolute; - z-index: 200; + top: 5px; right: 3px; - top: 3px; -} - -/** LOCAL DIALOG */ - -#local { - position: fixed; - -webkit-transform: translate(-50%, 0); - transform: translate(-50%, 0); - text-align: center; - top: 50px; - left: 50%; - color: black; - border: 10px solid #ddd; - border-radius: 10px; - background-color: rgba(255,255,255,0.9); - padding: 10px; -} -#local-dev table { - border-color: separate; - border-spacing: 0; -} -#local-dev td,th { - padding: 5px !important; -} -#local-dev thead th { - width: 100%; - border-bottom: 1px solid #888; -} -#local-dev tbody tr:hover { - background-color: #eee; -} - -/** PRINT DIALOG */ - -#print { - position: fixed; - -webkit-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); - text-align: center; - top: 50%; - left: 50%; - color: black; - border: 10px solid #ddd; - border-radius: 10px; - background-color: rgba(255,255,255,0.9); - padding: 10px; -} -#print button { - font-weight: bold; -} -#print > div { + bottom: 5px; + width: 50px; + background-color: #f8f8f8; border: 1px solid #aaa; border-radius: 3px; - padding: 2px; - margin: 6px 0 6px 0; -} -.print-sel { - position: relative; - margin-top: 15px !important; - padding: 15px 5px 10px 5px !important; -} -.print-sel > div { - flex-grow: 1; -} -.print-send { - margin: 0 0 0 5px !important; - width: 50px !important; - min-width: 50px !important; - max-width: 50px !important; -} -.print-gcode > button { - margin: 0 2px 0 2px !important; - height: 30px; -} -.print-sel > button { - max-width: 1000px; - flex-basis: 100px; -} -.print-sel > span { - position: absolute; - top: -10px; - left: 0; - right: 0; -} -.print-sel > span > label { - background-color: rgba(255,255,255,0.9); - font-size: 15px; - padding: 0 5px 0 5px; - border-top: 0; - border-bottom: 0; - border-left: 1px solid #aaa; - border-right: 1px solid #aaa; - border-radius: 5px; -} -.print-sel td,th { - padding: 2px; -} -.print-sel th { - text-align: right !important; -} -#print-canvas { - width: 180px; - height: 320px; - border: 1px solid #ccc; - background-color: #f5f5f5; - transform: scale(-1, 1); -} -#print-range { - width: 80%; -} -#print-layer { - border: 1px solid #ddd; - padding: 0 3px 0 3px; - margin: 0 5px 0 5px; - font-family: monospace; -} -#print .print-sel:hover { - border: 1px solid #555; -} -#print table { - width: 100%; -} -#print th { - text-align: left; -} -#print td { - text-align: right; -} -#print input { - text-align: right; -} -#print input[disabled] { - background-color: #eee; - border-color: #ddd; - color: black; -} -#print-density { - disabled: false; -} -#grid-hint { - font-style: italic; - font-weight: lighter; - font-size: 10px; -} -#octo-hint { - font-style: italic; - font-weight: lighter; - font-size: 10px; -} -#print a { - color: #68d; -} -#print a:hover { - color: #46a; - background-color: rgba(255,255,255,0.5); } -#v a { - color: #8ae; -} - -/** help dialog */ - -#help { - position: fixed; - -webkit-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); - text-align: left; - top: 50%; - left: 50%; - color: black; - border-radius: 10px; - border: 10px solid #ddd; - background-color: rgba(255,255,255,0.9); - padding: 10px; -} -#help div { - font-family: Verdana, Geneva, sans-serif; - white-space: nowrap; -} -#help a { - color: #68d; -} -#help button { - margin: 2px 0 2px 0; -} -#help a:hover { - color: #46a; - background-color: rgba(255,255,255,0.5); -} -#help p { - font-weight: normal; - white-space: nowrap; -} -#help td { - border: 1px solid rgba(255,255,255,0); -} -button.selected { - background-color: white; -} -#help-left { - border-right: 1px dashed #aaa; - padding-right: 10px; - line-height: 150%; -} -#help .grouphead { - line-height: 120%; - font-size: 14px; - padding: 8px 0 8px 0; - margin: 10px 0 10px 0; - background-color: #ccc; - border-color: white; -} -#help-left .content { - margin: 5px; -} -#help-right { - padding-left: 10px; -} -#help-body .grouphead { - padding: 3px !important; -} -#help-body table label { - font-family: monospace; - border-radius: 3px; - margin: 5px 1px 5px 1px !important; - padding: 1px 3px 1px 3px; - background-color: #ddd; -} -#help-body td { - margin: 5px; - padding: 2px; - font-family: monospace; -} -#help-body th,td { - white-space: nowrap; -} -#help-body li { - white-space: nowrap; - list-style-type: none; - padding-left: 10px; -} -.help-post { - text-align: center; - font-style: italic; - border-top: 1px dashed #aaa; - margin-top: 10px !important; -} - -/** tool dialog */ - -#tools:hover,#tools-body:hover { - background-color: #ffffff; -} -#tools { - text-align: center; -} -#tools button { - margin-left: 1px; - margin-right: 2px; -} -#tools span { - border: 0; - background: transparent; -} -#tools-body { - height: 100%; -} -#tool-labels label { - display: block; - text-align: center !important; - font-weight: bold; - font-size: 14px; - padding-bottom: 5px; - border: 0; -} -#tool-labels label:nth-child(1) { - width: 125px; -} -#tool-labels label:nth-child(2) { - width: 175px; -} -#tool-labels label:nth-child(3) { - width: 100px; -} -#tool-cols > div { - padding: 5px; - margin: 5px; - border: 1px solid #aaa; - border-radius: 5px; -} -#tool-cols > div:nth-child(1) { - width: 125px; -} -#tool-cols > div:nth-child(2) { - width: 175px; -} -#tool-cols > div:nth-child(3) { - width: 100px; -} -#tool-info > div { - margin-top: 2px; - margin-bottom: 2px; - flex-basis: auto; - flex-shrink: 0; -} -#tool-action { - padding: 3px 3px 0 3px; -} -#tool-action > button { - text-align: center; -} -#tool-action > span { - flex-grow: 1; - width: 100%; -} -#tools label { - text-align: left; -} -#tools input { - background-color: #ddd; - margin-bottom: 1px; - text-align: right; -} -#tools input:focus { - background-color: #dee; -} -#tools input:disabled { - color: #ddd; -} -#tool-list > select { - flex-grow: 1; - width: 100%; - height: 100%; - color: black; - border: 0; - margin-bottom: 2px; - padding-bottom: 2px; - background-color: transparent; - overflow-y: auto; - outline: none; -} -#tool-list select::-webkit-scrollbar { - display: none; -} - -/** device dialog */ - -#devices:hover,#devices-body:hover { - background-color: #ffffff; -} -#devices { - text-align: center; -} -#devices button { - margin-left: 1px; - margin-right: 2px; -} -#devices span { - border: 0; - background: transparent; -} -#devices-body { - height: 100%; -} -#device .tablerow button { - margin: 5px 3px 5px 3px; - padding-top: 0; - padding-bottom: 2px; -} -#device-labels span { - width: 200px; - padding: 2px 5px 2px 5px; - margin: 0 5px 5px 5px; - background-color: #eee; - border-radius: 5px; - border: 1px solid #aaa; - text-align: center; -} -#device-cols > div { - width: 200px; - padding: 5px; - margin: 5px; - border: 1px solid #aaa; - border-radius: 5px; -} -#device-info > div { - margin-top: 2px; - margin-bottom: 2px; - flex-basis: auto; - flex-shrink: 0; - position: relative; -} -#device-action { - padding: 3px 3px 0 3px; -} -#device-action > button { - text-align: center; -} -#device-action > span { - flex-grow: 1; - width: 100%; -} -#device-labels label { - display: block; - text-align: center !important; - font-weight: bold; - font-size: 14px; - padding-bottom: 5px; - border: 0; -} -#devices label { - text-align: left; -} -#devices input { - background-color: #ddd; - margin-bottom: 1px; - text-align: right; -} -#devices input:focus { - background-color: #dee; -} -#device-list select { - flex-grow: 1; - width: 100%; - height: 100%; - color: black; - border: 0; - margin-bottom: 2px; - padding-bottom: 2px; - background-color: transparent; - overflow-y: auto; - outline: none; -} -#device-list select::-webkit-scrollbar { - display: none; -} -#device-list option[local="1"] { - color: #55d; -} -#device-list option[favorite="1"] { - font-weight: bold; -} -#device > div { - align-items: center; - justify-content: center; -} -#device label { - white-space: nowrap; -} -#device > div > label { - padding: 2px; -} -#device input { - margin: 2px; -} -#device textarea { - overflow: hidden; - font-family: monospace; -} -#import { - width: 100%; -} -button[import="1"] { - width: 5px; - padding-left: 2px; - padding-right: 2px; -} -#catalog { - text-align: center; - min-height: 25%; - max-height: 75%; - height: 1000px; -} -#catalog div { - position: relative; -} -#catalogBody { - height: 100%; -} -#catalogBody div::-webkit-scrollbar { - display: none; -} -#catalogBody label { - font-weight: bold; - font-size: 14px; - padding-bottom: 10px; - border: 0; -} -#catalogList { - overflow-y: scroll; - overflow-x: hidden; -} -#catalogList button { - margin: 0px 0px 2px 2px; - overflow-x: hidden; - text-overflow: ellipsis; -} - -#settings button { - margin: 1px; -} -#settingsBody label { - font-weight: bold; - font-size: 14px; - padding-bottom: 10px; - border: 0; -} -#layer-view { - display: none; - position: fixed; - flex-direction: row; - justify-content: center; - align-items: stretch; - bottom: 0; - left: 20%; - right: 20%; - margin: 0; - padding: 4px; - background-color: rgba(170,221,255,0.75); - border: 1px solid #ccc; - border-bottom: 0; - border-top-left-radius: 5px; - border-top-right-radius: 5px; -} -#layer-view button { - margin: 0 !important; - border: 1px solid #bbb; -} -#layer-view input { - border-width: 1px; - padding: 2px; - border: 1px solid #bbb; -} -#layer-view > button, #layer-view > input { - margin-left: 4px !important; - margin-right: 4px !important; -} -#opacity { - max-width: 75px; -} -#layer-slider,#opacity { - border: 0; - margin: 0; - padding: 0; -} -#layer-slider { - flex-grow: 1; -} -#layers { - display: none; - position: fixed; - bottom: 25px; - background-color: rgba(170,221,255,0.75); - border: 1px solid rgba(0,0,0,0.2); - border-radius: 3px; - padding: 6px; - -webkit-transform: translate(-9px, -5px); - transform: translate(-9px, -5px); -} -#layers label { - text-align: left; - color: rgba(0,0,0,0.85); -} - -.poptext { - display: none; - position: absolute; - margin-left: 30px; - border: 3px solid #ddd; - border-radius: 3px; - transform: translate(0, -25%); +#slider > div { flex-direction: column; - align-items: stretch; - z-Index: 10000; + align-items: center; } -.poptext label { - text-align: center !important; - border-top: 1px solid #888; - border-left: 1px solid #888; - border-right: 1px solid #888; - background-color: rgba(170,221,255,0.75); - padding: 3px 0 3px 0; - margin: 0; - color: black; + +#slider-begin { + background-color: #ccc; + border-bottom: 1px solid #aaa; } -.poptext textarea { - flex-grow: 1; - margin: 0; - opacity: 0.95; - outline: none; - overflow-y: scroll !important; + +#slider-end { + background-color: #ccc; + border-top: 1px solid #aaa; +} + +#slider-hold { + background-color: #ccc; + position: absolute; + right: 0; + left: 0; + border: 3px solid white; +} + +#slider-hold .shim { + width: 100%; + height: 10px; + background-color: #aaa; + border: 1px solid #999; } #alert-area { display: none; justify-content: center; align-items: center; - position: fixed; - top: 40px; + position: absolute; + bottom: 40px; left: 0; right: 0; } @@ -1273,44 +349,3 @@ button[import="1"] { margin: 5px; text-align: center; } - -.flex { - display: flex; -} - -.frow { - flex-direction: row; -} - -.fcol { - flex-direction: column; -} - -.fgro { - flex-grow: 1; -} - -#selected { - position: fixed; - z-index: 5000; - color: #eee; - bottom: 5px; - left: 0px; - padding: 5px; - border-top: 3px solid #ddd; - border-right: 3px solid #ddd; - border-bottom: 3px solid #ddd; - border-top-right-radius: 3px; - border-bottom-right-radius: 3px; - background-color: rgba(255,255,255,0.75); - overflow: none; - display: flex; - flex-direction: row; -} -#selected > span { - font-family: sans-serif; - font-weight: normal; - font-size: 12px; - color: #555; - -} diff --git a/web/kiri/index.html b/web/kiri/index.html index 4239bcc0..c2e7cb81 100644 --- a/web/kiri/index.html +++ b/web/kiri/index.html @@ -2,10 +2,10 @@ + + - - @@ -15,209 +15,121 @@ + + + - - -
- A
- Kiri:Moto Slicer - ? -
- -
- -
- -
- mode -   :   - device -   :   - settings -
- - - +
- -
status
- -
-
- -
-
+
+
version
+
+
Kiri:Moto
+
+
- -
-
- -
-
-
- -
-
-
- - +
+
+
+
+ +
-
-
- -
-
-
-
-
-
-
-
-
- - - - - - - - -
-
-
- -
-
-
- - - -
-
-
- -
-
-
- +
+ + +
+
+ + +
+
+ +
-
-
-
-
shaft
-
-
-
flute
-
-
-
taper
- -
-
-
- - - - - +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+ +
+
+
+
+
0
+
+
+
+
 
+
+
+
+
∞
- -
-
- - -
- - - - - - - - - - - - - - - - - - - - -
-
-
- - -
-
- - -
- - -
- - -
-
-
- - -
-
- - - x - x - - -
-
- -
- -
- - - - - -
- -
-
-
+
+
loading
+
+
+
+
alerts
alerts
alerts
+
diff --git a/web/kiri/lang/en-help.html b/web/kiri/lang/en-help.html index ff14fc6f..a06c11a8 100644 --- a/web/kiri/lang/en-help.html +++ b/web/kiri/lang/en-help.html @@ -4,7 +4,9 @@
-

Quick Help

+

Kiri:Moto

+ +
About
Kiri:Moto @@ -13,7 +15,7 @@ Laser cutting, 3D printing, CNC milling
-
Loading Objects
+
File Loading
Drag and drop a file onto the grid diff --git a/web/kiri/lang/en.js b/web/kiri/lang/en.js index fb91fed6..b9ded2b1 100644 --- a/web/kiri/lang/en.js +++ b/web/kiri/lang/en.js @@ -107,7 +107,7 @@ kiri.lang['en-us'] = { vu_sprt: "Right", // WORKSPACE - ws_menu: "workspace", + ws_menu: "view", ws_save: "Save", ws_cler: "Clear", From 757457fed23907629485645bb183840aabccbc59 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 6 Jun 2020 00:38:46 -0400 Subject: [PATCH 17/61] rework right hand settings menu --- src/kiri/init.js | 24 ++++++++-------- src/kiri/ui.js | 11 ++------ web/kiri/index.css | 68 ++++++++++++++++++++++++++++++++++++++++++++- web/kiri/index.html | 4 +++ web/kiri/lang/en.js | 4 +-- 5 files changed, 88 insertions(+), 23 deletions(-) diff --git a/src/kiri/init.js b/src/kiri/init.js index de9139d0..dcd1156a 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -1238,17 +1238,7 @@ // allow modules to insert new items at the bottom of the left menu // appendLeft: UC.checkpoint(), - settingsGroup: UC.newGroup(LANG.se_menu, $('settings'), {region:"right"}), - settingsTable: UC.newTableRow([ - [ - UI.settingsLoad = - UC.newButton(LANG.se_load, settingsLoad), - UI.settingsSave = - UC.newButton(LANG.se_save, settingsSave) - ] - ]), - - process: UC.newGroup(LANG.sl_menu, control, {modes:FDM_LASER}), + process: UC.newGroup(LANG.sl_menu, $('settings'), {modes:FDM_LASER}), sliceHeight: UC.newInput(LANG.sl_lahi_s, {title:LANG.sl_lahi_l, convert:UC.toFloat, modes:FDM}), sliceShells: UC.newInput(LANG.sl_shel_s, {title:LANG.sl_shel_l, convert:UC.toInt, modes:FDM}), sliceTopLayers: UC.newInput(LANG.sl_ltop_s, {title:LANG.sl_ltop_l, convert:UC.toInt, modes:FDM}), @@ -1259,7 +1249,7 @@ laserSliceHeight: UC.newInput(LANG.ls_lahi_s, {title:LANG.ls_lahi_l, convert:UC.toFloat, modes:LASER}), laserSliceSingle: UC.newBoolean(LANG.ls_sngl_s, onBooleanClick, {title:LANG.ls_sngl_l, modes:LASER}), - process: UC.newGroup(LANG.fi_menu, control, {modes:FDM}), + process: UC.newGroup(LANG.fi_menu, $('settings'), {modes:FDM}), sliceFillType: UC.newSelect(LANG.fi_type, {modes:FDM}, "infill"), sliceFillSparse: UC.newInput(LANG.fi_pcnt_s, {title:LANG.fi_pcnt_l, convert:UC.toFloat, bound:UC.bound(0.0,1.0), modes:FDM}), sliceFillAngle: UC.newInput(LANG.fi_angl_s, {title:LANG.fi_angl_l, convert:UC.toFloat, modes:FDM, expert:true}), @@ -1424,6 +1414,16 @@ slaFirstOffset: UC.newInput(LANG.sa_opzo_s, {title:LANG.sa_opzo_l, convert:UC.toFloat, bound:UC.bound(0,1), modes:SLA, expert:true}), slaAntiAlias: UC.newSelect(LANG.sa_opaa_s, {title:LANG.sa_opaa_l, modes:SLA}, "antialias"), + settingsGroup: UC.newGroup(LANG.se_menu, $('settings')), + settingsTable: UC.newTableRow([ + [ + UI.settingsLoad = + UC.newButton(LANG.se_load, settingsLoad), + UI.settingsSave = + UC.newButton(LANG.se_save, settingsSave) + ] + ]), + layers: UC.setGroup($("layers")), layerOutline: UC.newBoolean(LANG.la_olin, onLayerToggle, {modes:LOCAL ? ALL : FDM_LASER}), layerTrace: UC.newBoolean(LANG.la_trce, onLayerToggle, {modes:FDM_LASER}), diff --git a/src/kiri/ui.js b/src/kiri/ui.js index 88cb432f..fc457838 100644 --- a/src/kiri/ui.js +++ b/src/kiri/ui.js @@ -8,7 +8,6 @@ let SELF = self, KIRI = self.kiri, - lastRegion = null, lastGroup = null, lastDiv = null, addTo = null, @@ -77,7 +76,7 @@ } function checkpoint() { - return { addTo, lastDiv, lastGroup, lastRegion, groupName }; + return { addTo, lastDiv, lastGroup, groupName }; } function restore(opt) { @@ -85,7 +84,6 @@ addTo = opt.addTo; lastDiv = opt.lastDiv; lastGroup = opt.lastGroup; - lastRegion = opt.lastRegion; groupName = opt.groupName; } } @@ -106,7 +104,6 @@ function addCollapsableGroup(label, div, options) { let opt = options || {}; let group = opt.group || label; - lastRegion = opt.region || lastRegion; hideable[group] = opt.nocompact === true ? false : true; let row = DOC.createElement('div'), @@ -116,9 +113,7 @@ if (popper) { let pop = DOC.createElement('div'); - pop.classList.add('popper'); - if (lastRegion) pop.classList.add(lastRegion); - if (opt.poprow) pop.classList.add('poprow') + pop.classList.add('setpop'); row.appendChild(pop); addTo = pop; } else { @@ -126,7 +121,7 @@ } div.appendChild(row); - row.setAttribute("class", "grouphead noselect"); + row.setAttribute("class", "setgroup noselect"); row.appendChild(a); a.appendChild(DOC.createTextNode(label)); addModeControls(row, opt); diff --git a/web/kiri/index.css b/web/kiri/index.css index 778eefb8..0d413d13 100644 --- a/web/kiri/index.css +++ b/web/kiri/index.css @@ -1,4 +1,4 @@ -a, a:hover, a:visited { +setpopsetpopa, a:hover, a:visited { border: none; outline: none; color: inherit; @@ -172,6 +172,20 @@ th, tr, td, span, div, label, button { background-image: linear-gradient(to right, #ddd, #666, #ddd); } +#lt-top { + height: 10px; + border-top-right-radius: 10px; + background-color: #abc; + left: -5px; +} + +#lt-end { + height: 10px; + border-bottom-right-radius: 10px; + background-color: #abc; + left: -5px; +} + .pop-lcol { position: absolute; display: none; @@ -349,3 +363,55 @@ th, tr, td, span, div, label, button { margin: 5px; text-align: center; } + +#settings { + align-items: stretch; +} +#set-top { + color: black; + padding: 1px 10px 2px 2px; + border-top-left-radius: 10px; + border-bottom-left-radius: 0; + background-color: #abc; +} +#set-end { + color: black; + padding: 1px 10px 2px 2px; + border-top-left-radius: 0; + border-bottom-left-radius: 10px; + background-color: #abc; + height: 10px; +} +.setgroup { + align-items: center; + flex-direction: column; + background-color: rgba(255,255,255,0.75); + border: 1px solid rgba(0,0,0,0); + border-radius: 3px; + margin: 2px 0 2px 4px; + padding: 8px 10px 8px 5px; + color: #89a; + right: -5px; +} +.setgroup:hover { + background-color: #eee; + border: 1px solid #aaa; + color: #000; +} +.setpop { + top: 50%; + right: 100%; + position: absolute; + white-space: nowrap; + flex-direction: column; + transform: translateY(-50%); + background-color: rgba(255,255,255,0.5); + border: 1px solid #aaa; + border-radius: 3px; + padding: 5px; + margin-right: 5px; +} +.setpop label { + padding: 2px 4px 2px 0; + flex-grow: 1; +} diff --git a/web/kiri/index.html b/web/kiri/index.html index c2e7cb81..cdea8f16 100644 --- a/web/kiri/index.html +++ b/web/kiri/index.html @@ -32,6 +32,7 @@
+
@@ -86,6 +87,7 @@
+
+
+
0
diff --git a/web/kiri/lang/en.js b/web/kiri/lang/en.js index b9ded2b1..e68102eb 100644 --- a/web/kiri/lang/en.js +++ b/web/kiri/lang/en.js @@ -150,7 +150,7 @@ kiri.lang['en-us'] = { la_move: "moves", // SETTINGS - se_menu: "settings", + se_menu: "library", se_load: "load", se_save: "save", @@ -275,7 +275,7 @@ kiri.lang['en-us'] = { cd_lift_l: "lift between plunges\nafter dwell period\nin workspace units\n0 to disable", // CNC CUTOUT TABS - ct_menu: "cutout tabs", + ct_menu: "tabs", ct_angl_s: "angle", ct_angl_l: "starting angle for tab spacing\nin degrees (0-360)", ct_numb_s: "count", From 3ea6f400bc519122051efa126febeaa53c6265ac Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 6 Jun 2020 11:17:04 -0400 Subject: [PATCH 18/61] reenable basic modal functionality --- src/kiri/init.js | 20 ++++---- src/kiri/main.js | 73 +++++++++++++++++---------- src/kiri/ui.js | 4 +- web/kiri/index.css | 60 +++++++++++++++++----- web/kiri/index.html | 35 ++++++++++--- web/kiri/lang/en-help.html | 100 ++++++++++++++++++------------------- web/kiri/lang/en.js | 4 +- 7 files changed, 184 insertions(+), 112 deletions(-) diff --git a/src/kiri/init.js b/src/kiri/init.js index dcd1156a..c5d25046 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -1091,10 +1091,15 @@ layerView: $('layer-view'), layerSlider: $('layer-slider'), modelOpacity: $('opacity'), + modal: $('modal'), - print: $('print'), - local: $('local'), - help: $('help'), + help: $('mod-help'), + print: $('mod-print'), + local: $('mod-local'), + files: $('mod-files'), + catalogBody: $('catalogBody'), + catalogList: $('catalogList'), + devices: $('devices'), deviceAdd: $('device-add'), deviceDelete: $('device-del'), @@ -1119,9 +1124,6 @@ // toolTaperAngle: $('tool-tangle'), toolTaperTip: $('tool-ttip'), toolMetric: $('tool-metric'), - catalog: $('catalog'), - catalogBody: $('catalogBody'), - catalogList: $('catalogList'), settings: $('settings'), settingsBody: $('settingsBody'), settingsList: $('settingsList'), @@ -1763,12 +1765,12 @@ // add ability to override API.show.controls(API.feature.controls); - // set initial layer slider size - API.dialog.update(); - // show version on startup $('app-vers').innerHTML = KIRI.version; + // enable modal hiding + $('mod-x').onclick = API.modal.hide; + if (!SETUP.s) console.log(`kiri | init main | ${KIRI.version}`); // send init-done event diff --git a/src/kiri/main.js b/src/kiri/main.js index eb30a58f..21e9f783 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -184,9 +184,8 @@ set: undefined // set during init }, dialog: { - show: showDialog, - hide: hideDialog, - update: updateDialogLeft + show: showModal, + hide: hideModal, }, help: { show: showHelp, @@ -1619,37 +1618,62 @@ } function modalShowing() { - let showing = $('modal').style.display !== 'none'; - return showing || UC.isPopped(); + return UI.modal.style.display === 'flex'; } function showModal(which) { - UI.modal.style.display = 'block'; - ["print","help","local"].forEach(function(modal) { - UI[modal].style.display = (modal === which ? 'block' : 'none'); + let mod = UI.modal, + style = mod.style, + visible = modalShowing(), + info = { pct: 0 }; + + ["print","help","files","local"].forEach(function(name) { + UI[name].style.display = name === which ? 'flex' : ''; }); - if (which) API.event.emit('modal.show', which); + + function ondone() { + // UI[which].style.display = 'flex'; + API.event.emit('modal.show', which); + } + + if (visible) { + return ondone(); + } + + style.height = '0'; + style.display = 'flex'; + + new TWEEN.Tween(info). + easing(TWEEN.Easing.Quadratic.InOut). + to({ pct: 100 }, 100). + onUpdate(() => { style.height = `${info.pct}%` }). + onComplete(ondone). + start(); + } + + function hideModal() { + if (!modalShowing()) { + return; + } + let mod = UI.modal, style = mod.style, info={pct:100}; + new TWEEN.Tween(info). + easing(TWEEN.Easing.Quadratic.InOut). + to({pct:0}, 100). + onUpdate(() => { style.height = `${info.pct}%` }). + onComplete(() => { style.display = '' }). + start(); } function hideDialog() { - showDialog(null); + hideModal(); } - function showDialog(which, force) { - return console.log('TODO showDialog'); - if (UC.isPopped()) { - UC.hidePop(); - return; - } - ["catalog","devices","tools","settings"].forEach(function(dialog) { - let style = UI[dialog].style; - style.display = (dialog === which && (force || style.display !== 'flex') ? 'flex' : 'none'); - }); - if (which) API.event.emit('dialog.show', which); + function showDialog(which) { + showModal(which); } function showCatalog() { - showDialog("catalog"); + showDialog("files"); } function getSettings() { @@ -1776,10 +1800,6 @@ UI.settings.style.right = (right.width + 5) + 'px'; } - function hideModal() { - UI.modal.style.display = 'none'; - } - function showHelp() { showHelpFile(`/kiri/lang/${KIRI.lang.get()}-help.html`); } @@ -1792,7 +1812,6 @@ } ajax(local, function(html) { UI.help.innerHTML = html; - $('help-close').onclick = hideModal; $('kiri-version').innerHTML = `${LANG.version} ${KIRI.version}`; showModal('help'); }); diff --git a/src/kiri/ui.js b/src/kiri/ui.js index fc457838..c5ead320 100644 --- a/src/kiri/ui.js +++ b/src/kiri/ui.js @@ -113,7 +113,7 @@ if (popper) { let pop = DOC.createElement('div'); - pop.classList.add('setpop'); + pop.classList.add('set-pop'); row.appendChild(pop); addTo = pop; } else { @@ -121,7 +121,7 @@ } div.appendChild(row); - row.setAttribute("class", "setgroup noselect"); + row.setAttribute("class", "set-group noselect"); row.appendChild(a); a.appendChild(DOC.createTextNode(label)); addModeControls(row, opt); diff --git a/web/kiri/index.css b/web/kiri/index.css index 0d413d13..707378d5 100644 --- a/web/kiri/index.css +++ b/web/kiri/index.css @@ -78,6 +78,9 @@ select { th, tr, td, span, div, label, button { user-select: none; } +th, tr, td { + white-space: nowrap; +} .noselect { -khtml-user-select: none; -moz-user-select: none; @@ -280,11 +283,47 @@ th, tr, td, span, div, label, button { display: none; position: fixed; z-index: 10000; - top: 0px; + transform: translateY(-50%); + top: 50%; left: 0px; right: 0px; bottom: 0px; - background-color: rgba(0,0,0,0.5); + height: 300px; + background-color: rgba(0,0,0,0.25); + border-bottom: 1px solid black; + border-top: 1px solid black; + overflow: hidden; +} +#modal > div { + position: absolute; + transform: translateX(50%) translateY(-50%); + right: 50%; + top: 50%; +} +.mdialog { + display: none; + padding: 10px; + font-size: smaller; + font-family: monospace; + background-color: rgba(255,255,255,0.75); +} +#mod-top { + height: 10px; + border-top-left-radius: 10px; + border-top-right-radius: 10px; + background-color: rgba(0,0,0,0.25); +} +#mod-x { + position: absolute; + z-index: 30000; + bottom: -20px; + right: 5px; +} +#mod-end { + height: 10px; + border-bottom-left-radius: 10px; + border-bottom-right-radius: 10px; + background-color: rgba(0,0,0,0.25); } #slider { @@ -298,22 +337,18 @@ th, tr, td, span, div, label, button { border: 1px solid #aaa; border-radius: 3px; } - #slider > div { flex-direction: column; align-items: center; } - #slider-begin { background-color: #ccc; border-bottom: 1px solid #aaa; } - #slider-end { background-color: #ccc; border-top: 1px solid #aaa; } - #slider-hold { background-color: #ccc; position: absolute; @@ -321,7 +356,6 @@ th, tr, td, span, div, label, button { left: 0; border: 3px solid white; } - #slider-hold .shim { width: 100%; height: 10px; @@ -382,7 +416,7 @@ th, tr, td, span, div, label, button { background-color: #abc; height: 10px; } -.setgroup { +.set-group { align-items: center; flex-direction: column; background-color: rgba(255,255,255,0.75); @@ -393,12 +427,12 @@ th, tr, td, span, div, label, button { color: #89a; right: -5px; } -.setgroup:hover { +.set-group:hover { background-color: #eee; border: 1px solid #aaa; color: #000; } -.setpop { +.set-pop { top: 50%; right: 100%; position: absolute; @@ -407,11 +441,11 @@ th, tr, td, span, div, label, button { transform: translateY(-50%); background-color: rgba(255,255,255,0.5); border: 1px solid #aaa; - border-radius: 3px; - padding: 5px; + border-radius: 5px; margin-right: 5px; + padding: 5px; } -.setpop label { +.set-pop label { padding: 2px 4px 2px 0; flex-grow: 1; } diff --git a/web/kiri/index.html b/web/kiri/index.html index cdea8f16..f4315504 100644 --- a/web/kiri/index.html +++ b/web/kiri/index.html @@ -87,33 +87,54 @@
+
+ + +
+ +
+
+
+ + +
+ +
+
@@ -306,9 +306,9 @@
∞
-
+
 
-
+
0
diff --git a/web/kiri/output-gcode.html b/web/kiri/output-gcode.html index 038b914c..e0145306 100644 --- a/web/kiri/output-gcode.html +++ b/web/kiri/output-gcode.html @@ -1,68 +1,57 @@ - - -output options - -
- - - - - +
+ -