checkpoint internal work. # app server file wrapping, gerber import work

This commit is contained in:
Stewart Allen 2024-06-27 21:50:54 -04:00
commit d1938316e5
8 changed files with 163 additions and 7 deletions

38
app.js
View file

@ -23,6 +23,7 @@ const mods = {};
const load = []; const load = [];
const synth = {}; const synth = {};
const api = {}; const api = {};
const wrap = {};
let forceUseCache = false; let forceUseCache = false;
let serviceWorker = true; let serviceWorker = true;
@ -57,6 +58,14 @@ netdb.create = async function(map = {}) {
return client; return client;
}; };
function wrapdata(path, buf) {
return [
`gapp.register("${path}", [], (root, exports) => {`,
buf.toString(),
"});"
].join('\n');
}
function addonce(array, v) { function addonce(array, v) {
if (array.indexOf(v) < 0) { if (array.indexOf(v) < 0) {
array.push(v); array.push(v);
@ -209,6 +218,9 @@ function init(mod) {
if (fc === '@') { if (fc === '@') {
continue; continue;
} }
if (fc === '#') {
continue;
}
if (fc === '&') { if (fc === '&') {
path = path.substring(1); path = path.substring(1);
addonce(roots, path); addonce(roots, path);
@ -230,7 +242,16 @@ function init(mod) {
} }
// val.splice(1, 0, ...roots); // val.splice(1, 0, ...roots);
if (xxxx) console.log({key, cache, refs, paths, roots, val}); if (xxxx) console.log({key, cache, refs, paths, roots, val});
script[key] = val.map(p => p.charAt(0) !== '@' ? `src/${p}.js` : p); script[key] = val.map(p => {
let fc = p.charAt(0);
if (fc === '@') return p;
if (fc === '#') {
let nupath = `src/${p.substring(1)}.js`;
wrap[nupath] = true;
return nupath;
}
return `src/${p}.js`;
});
// console.log({script: key, files: script[key]}); // console.log({script: key, files: script[key]});
} }
@ -271,6 +292,17 @@ function init(mod) {
}); });
} }
mod.add(rewriteHtmlVersion); mod.add(rewriteHtmlVersion);
mod.add((req, res, next) => {
const path = req.gs.path.substring(1);
if (wrap[path]) {
const data = getCachedFile(path, data => {
console.log({ do_not_min: data });
return data;
});
return res.end(data);
}
next();
});
mod.static("/src/", "src"); mod.static("/src/", "src");
mod.static("/obj/", "web/obj"); mod.static("/obj/", "web/obj");
mod.static("/font/", "web/font"); mod.static("/font/", "web/font");
@ -724,6 +756,10 @@ function getCachedFile(file, fn) {
fs.writeFileSync(cachePath, cacheData); fs.writeFileSync(cachePath, cacheData);
} }
if (wrap[file]) {
cacheData = wrapdata(file, cacheData);
}
cached = { cached = {
data: cacheData, data: cacheData,
mtime: cmod || now, mtime: cmod || now,

View file

@ -27,6 +27,7 @@
"@fortawesome/fontawesome-free": "^6.1.1", "@fortawesome/fontawesome-free": "^6.1.1",
"@gridspace/app-server": "^0.0.13", "@gridspace/app-server": "^0.0.13",
"@gridspace/net-level-client": "^0.2.3", "@gridspace/net-level-client": "^0.2.3",
"@tracespace/parser": "^5.0.0-next.0",
"@tweenjs/tween.js": "^16.6.0", "@tweenjs/tween.js": "^16.6.0",
"base64-js": "^1.5.1", "base64-js": "^1.5.1",
"buffer-crc32": "^0.2.13", "buffer-crc32": "^0.2.13",

View file

@ -115,6 +115,99 @@ CAM.init = function(kiri, api) {
updateStock(); updateStock();
} }
api.event.on("cam.parse.gerber", gerber => {
let fact = 1000000;
let tools = {};
let tool;
let poly;
let polys = [];
let circs = [];
let rects = [];
let last = {};
let bounds = base.newBounds();
let p = TracespaceParser.createParser();
p.feed(gerber);
let r = p.results();
let c = r.children
.filter(c => {
switch (c.type) {
case 'toolDefinition':
tools[c.code] = c.shape;
break;
case 'toolChange':
tool = { code: c.code, shape: tools[c.code] };
break;
case 'graphic':
c.tool = tool;
return true;
}
return false;
})
.map(r => {
return {
type: r.graphic,
tool: r.tool,
x: parseInt(r.coordinates.x),
y: parseInt(r.coordinates.y)
};
})
.map(r => {
const { x, y, tool, type } = r;
const pos = { x:x/fact, y:y/fact, z: 0};
bounds.update(pos);
switch (type) {
case 'move':
if (true && poly && last.x === x && last.y === y && last.tool === tool) {
// console.log('continuation');
} else {
poly = base.newPolygon().setOpen().add(pos.x, pos.y, 0);
poly.tool = tool;
polys.push(poly);
}
break;
case 'segment':
poly.add(pos.x, pos.y, 0);
break;
case 'shape':
poly = undefined;
let { shape } = tool;
switch (shape.type) {
case 'circle':
circs.push(base.newPolygon().centerCircle(pos, shape.diameter / 2, 20));
break;
case 'rectangle':
rects.push(base.newPolygon().centerRectangle(pos, shape.xSize, shape.ySize));
break;
}
break;
}
last = { x, y, tool };
return r;
});
const { minx, maxx, miny, maxy } = bounds;
for (let poly of [...polys, ...circs, ...rects]) {
poly.move({
x: -((maxx-minx)/2 + minx),
y: -((maxy-miny)/2 + miny),
z: 0
});
}
console.log(polys, circs, rects);
const widget = api.widgets.all()[0];
const stack = new kiri.Stack(widget.mesh);
const layers = new kiri.Layers();
for (let poly of polys) {
layers.setLayer("paths", {line: 0xff0000}, false).addPoly(poly);
}
for (let poly of circs) {
layers.setLayer("circs", {line: 0x008800}, false).addPoly(poly);
}
for (let poly of rects) {
layers.setLayer("rects", {line: 0x0000ff}, false).addPoly(poly);
}
stack.addLayers(layers);
});
api.event.on("widget.add", widget => { api.event.on("widget.add", widget => {
if (isCamMode && !Array.isArray(widget)) { if (isCamMode && !Array.isArray(widget)) {
updateAxisMode(true); updateAxisMode(true);

View file

@ -12,6 +12,7 @@
// dep: kiri.selection // dep: kiri.selection
// use: kiri.tools // use: kiri.tools
// use: kiri.pack // use: kiri.pack
// use: ext.gerber
gapp.register("kiri.init", [], (root, exports) => { gapp.register("kiri.init", [], (root, exports) => {
const { base, kiri } = root; const { base, kiri } = root;
@ -369,6 +370,7 @@ gapp.register("kiri.init", [], (root, exports) => {
if (evt.metaKey) { if (evt.metaKey) {
evt.preventDefault(); evt.preventDefault();
api.space.save(); api.space.save();
api.settings.sync.put();
} }
break; break;
case 76: // 'l' for restore workspace case 76: // 'l' for restore workspace

View file

@ -139,8 +139,16 @@ gapp.register("kiri.main", [], (root, exports) => {
is_fdm() { return MODE === MODES.FDM }, is_fdm() { return MODE === MODES.FDM },
is_cam() { return MODE === MODES.CAM }, is_cam() { return MODE === MODES.CAM },
is_sla() { return MODE === MODES.SLA }, is_sla() { return MODE === MODES.SLA },
is_laser() { return MODE === MODES.LASER },
is_drag() { return MODE === MODES.DRAG }, is_drag() { return MODE === MODES.DRAG },
is_wedm() { return MODE === MODES.WEDM },
is_wjet() { return MODE === MODES.WJET },
is_laser() { return MODE === MODES.LASER },
is_2d() { return
api.mode.is_drag() ||
api.mode.is_wedm() ||
api.mode.is_wjet() ||
api.mode.is_laser()
}
}, },
probe: { probe: {
live: "https://live.grid.space", live: "https://live.grid.space",
@ -549,7 +557,6 @@ gapp.register("kiri.main", [], (root, exports) => {
function saveWorkspace(quiet) { function saveWorkspace(quiet) {
api.conf.save(); api.conf.save();
api.settings.sync.put();
const newWidgets = []; const newWidgets = [];
const oldWidgets = js2o(SDB.getItem('ws-widgets'), []); const oldWidgets = js2o(SDB.getItem('ws-widgets'), []);
api.widgets.each(function(widget) { api.widgets.each(function(widget) {

View file

@ -763,7 +763,8 @@ function platformLoadFiles(files, group) {
isgcode = lower.indexOf(".gcode") > 0 || lower.indexOf(".nc") > 0, isgcode = lower.indexOf(".gcode") > 0 || lower.indexOf(".nc") > 0,
isset = lower.indexOf(".b64") > 0 || lower.indexOf(".km") > 0, isset = lower.indexOf(".b64") > 0 || lower.indexOf(".km") > 0,
iskmz = lower.indexOf(".kmz") > 0, iskmz = lower.indexOf(".kmz") > 0,
isini = lower.indexOf(".ini") > 0; isini = lower.indexOf(".ini") > 0,
isgrb = lower.indexOf(".grb");
reader.file = files[i]; reader.file = files[i];
reader.onloadend = function(e) { reader.onloadend = function(e) {
function load_dec() { function load_dec() {
@ -817,6 +818,12 @@ function platformLoadFiles(files, group) {
} else { } else {
odon(); odon();
} }
} else if (isgrb && api.conf.get().controller.devel) {
if (api.mode.is_cam()) {
api.event.emit('cam.parse.gerber', e.target.result);
} else {
api.alerts.show('Gerber import not availabe in this device mode');
}
} else if (is3mf) { } else if (is3mf) {
let odon = function(models) { let odon = function(models) {
let msg = api.show.alert('Adding Objects'); let msg = api.show.alert('Adding Objects');
@ -870,7 +877,7 @@ function platformLoadFiles(files, group) {
else if (ispng) api.image.dialog(e.target.result, e.target.file.name); else if (ispng) api.image.dialog(e.target.result, e.target.file.name);
else if (isjpg) api.image.convert(e.target.result, e.target.file.name); else if (isjpg) api.image.convert(e.target.result, e.target.file.name);
else if (isini) api.settings.import_prusa(e.target.result); else if (isini) api.settings.import_prusa(e.target.result);
else api.show.alert(`Unsupported file: ${files[i].name}`); else api.show.alert(`Unsupported file: ${reader.file.name}`);
}; };
if (isstl || ispng || isjpg || iskmz) { if (isstl || ispng || isjpg || iskmz) {
reader.readAsArrayBuffer(reader.file); reader.readAsArrayBuffer(reader.file);

View file

@ -79,6 +79,16 @@ gapp.register = function() {
mods.push(mod); mods.push(mod);
}; };
function safeFN(fn, name) {
return function() {
try {
return fn(...arguments);
} catch (error) {
console.log({ register_fail: name, error });
}
};
}
// perform dependency checks and run module load functions // perform dependency checks and run module load functions
gapp.main = function() { gapp.main = function() {
const args = exargs([...arguments]); const args = exargs([...arguments]);
@ -115,7 +125,7 @@ gapp.main = function() {
} }
} }
let tmp = path[map] || {}; let tmp = path[map] || {};
fn(root, exports => { safeFN(fn, name)(root, exports => {
if (exports) { if (exports) {
return path[map] = Object.assign(tmp, exports); return path[map] = Object.assign(tmp, exports);
} }

View file

@ -642,7 +642,7 @@ self.kiri.lang['en-us'] = {
// LASER SLICING // LASER SLICING
ls_offs_s: "offset / kerf", ls_offs_s: "offset / kerf",
ls_offs_l: ["adjust for beam width","also known as kerf","in millimeters"], ls_offs_l: ["distance between the center of the cutting","path and the edge of remaining material","in millimeters"],
ls_lahi_s: "slice height", ls_lahi_s: "slice height",
ls_lahi_l: ["layer height","in millimeters","0 = auto/detect"], ls_lahi_l: ["layer height","in millimeters","0 = auto/detect"],
ls_lahm_s: "slice minimum", ls_lahm_s: "slice minimum",