Merge branch 'rel-4.3' into improved-register

This commit is contained in:
bakedpotatolord 2025-07-21 09:23:53 -06:00
commit 333a965566
336 changed files with 19582 additions and 25184 deletions

View file

@ -1,149 +0,0 @@
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
// dep: moto.broker
// dep: data.local
// dep: kiri.utils
// dep: kiri.consts
gapp.register("kiri.api", (root, exports) => {
let { data, kiri, moto, noop } = root,
{ consts, utils } = kiri,
{ ajax, o2js, js2o } = utils,
lists = consts.LISTS,
clone = Object.clone,
isHover = false,
feature = {
seed: true, // seed profiles on first use
meta: true, // show selected widget metadata
frame: true, // receive frame events
alert_event: false, // emit alerts as events instead of display
controls: true, // show or not side menus
device_filter: undefined, // function to limit devices shown
drop_group: undefined, // optional array to group multi drop
drop_layout: true, // layout on new drop
hoverAdds: false, // when true only searches widget additions
on_key: undefined, // function override default key handlers
on_key2: [], // allows for multiple key handlers
on_load: undefined, // function override file drop loads
on_add_stl: undefined, // legacy override stl drop loads
on_mouse_up: undefined, // function intercepts mouse up select
on_mouse_down: undefined, // function intercepts mouse down
work_alerts: true, // allow disabling work progress alerts
pmode: consts.PMODES.SPEED, // preview modes
// hover: false, // when true fires mouse hover events
get hover() {
return isHover;
},
set hover(b) {
isHover = b;
moto.broker.publish("feature.hover", b);
}
},
onkey = (fn) => {
api.feature.on_key2.push(fn);
},
doit = {
undo: noop, // do.js
redo: noop // do.js
},
devel = {
xray(layers, raw) {
let proc = api.conf.get().process,
size = proc.sliceHeight || proc.slaSlice || 1,
base = (proc.firstSliceHeight || size);
layers = Array.isArray(layers) ? layers : [ layers ];
proc.xray = layers.map(l => raw ? l : base + l * size - size / 2);
proc.xrayi = layers.slice();
api.function.slice();
}
},
local = {
get: (key) => localGet(key),
getInt: (key) => parseInt(localGet(key)),
getFloat: (key) => parseFloat(localGet(key)),
getBoolean: (key, def = true) => {
let val = localGet(key);
return val === true || val === 'true' || val === def;
},
toggle: (key, val, def) => localSet(key, val ?? !api.local.getBoolean(key, def)),
put: (key, val) => localSet(key, val),
set: (key, val) => localSet(key, val),
},
tweak = {
line_precision(v) { api.work.config({base:{clipperClean: v}}) },
gcode_decimals(v) { api.work.config({base:{gcode_decimals: v}}) }
},
und = undefined,
api = exports({
ajax, // via utils
alerts: {}, // alerts.js
busy: {}, // main.js
catalog: und, // main.js
clip, // <--
clone, // <--
color: und, // main.js
conf: {}, // settings.js
const: {}, // main.js
devel, // <--
device: {}, // devices.js
devices: {}, // devices.js
dialog: {}, // main.js
doit, // <--
event: {}, // main.js
feature, // <--
function: {}, // function.js
group: {}, // main.js
help: {}, // main.js
hide: {}, // main.js
image: {}, // main.js
js2o, // via utils
language: und, // main.js
lists, // <--
local, // <--
modal: {}, // main.js
mode: {}, // main.js
o2js, // via utils
onkey, // <--
platform: {}, // platform.js
probe: {}, // main.js
process: {}, // main.js
sdb: data.local,
selection: {}, // selection.js
settings: {}, // settings.js
show: {}, // main.js
space: {}, // main.js
tool: {}, // kiri-mode/cam/tools.js
tweak, // <--
uc: {}, // main.js
ui: {}, // main.js
util: {}, // main.js
var: {
layer_lo: 0,
layer_hi: 0,
layer_max: 0
},
view: {}, // main.js
widgets: {}, // widgets.js
work: und, // main.js
});
function clip(text) {
navigator.clipboard
.writeText(text)
.catch(err => console.error('Clipboard Error:', err));
}
function localGet(key) {
let sloc = api.conf.get().local;
return sloc[key] || api.sdb[key];
}
function localSet(key, val) {
let sloc = api.conf.get().local;
sloc[key] = api.sdb[key] = val;
return val;
}
});

View file

@ -1,12 +1,6 @@
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
// dep: kiri.api
gapp.register("kiri.alerts", [], (root, exports) => {
const { kiri } = root;
const { api } = kiri;
import { api } from './api.js';
let alerts = [];
@ -68,11 +62,14 @@ function update(clear) {
}
}
// extend API
Object.assign(api.alerts, {
export {
hide,
show,
update
});
};
});
export default {
hide,
show,
update
};

189
src/kiri/core/api.js Normal file
View file

@ -0,0 +1,189 @@
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
import alerts from './alerts.js';
import settings from './settings.js'
import STACKS from './stacks.js';
import { broker } from '../../moto/broker.js';
import { client as work } from './client.js';
import { consts, COLOR as color, LISTS as lists } from './consts.js';
import { device, devices } from './devices.js';
import { catalog, dialog, event, group, help, hide, image } from './main.js';
import { modal, mode, probe, process, show, space, util, view } from './main.js';
import { local as dataLocal } from '../../data/local.js';
import { noop, ajax, o2js, js2o } from './utils.js';
import { functions } from './function.js';
import { platform } from './platform.js';
import { selection } from './selection.js';
import { stats } from './stats.js';
import { newWidget } from './widget.js';
import { widgets } from './widgets.js';
import { updateTool } from '../mode/cam/tools.js';
import { beta, version } from '../../moto/license.js';
import { space as SPACE } from '../../moto/space.js';
import { LANG } from './lang.js';
import { LOCAL, SETUP, SECURE } from './main.js';
import { UI } from './ui.js';
import web from '../../moto/webui.js';
let UC = UI.prefix('kiri').inputAction(settings.conf.update),
und = undefined,
clone = Object.clone,
isHover = false,
feature = {
seed: true, // seed profiles on first use
meta: true, // show selected widget metadata
frame: true, // receive frame events
alert_event: false, // emit alerts as events instead of display
controls: true, // show or not side menus
device_filter: und, // function to limit devices shown
drop_group: und, // optional array to group multi drop
drop_layout: true, // layout on new drop
hoverAdds: false, // when true only searches widget additions
on_key: und, // function override default key handlers
on_key2: [], // allows for multiple key handlers
on_load: und, // function override file drop loads
on_add_stl: und, // legacy override stl drop loads
on_mouse_up: und, // function intercepts mouse up select
on_mouse_down: und, // function intercepts mouse down
work_alerts: true, // allow disabling work progress alerts
pmode: consts.PMODES.SPEED, // preview modes
// hover: false, // when true fires mouse hover events
get hover() {
return isHover;
},
set hover(b) {
isHover = b;
broker.publish("feature.hover", b);
}
},
busyVal = 0,
busy = {
val() { return busyVal },
inc() { api.event.emit("busy", ++busyVal) },
dec() { api.event.emit("busy", --busyVal) }
},
onkey = (fn) => {
api.feature.on_key2.push(fn);
},
doit = {
undo: noop, // do.js
redo: noop // do.js
},
devel = {
xray(layers, raw) {
let proc = api.conf.get().process,
size = proc.sliceHeight || proc.slaSlice || 1,
base = (proc.firstSliceHeight || size);
layers = Array.isArray(layers) ? layers : [layers];
proc.xray = layers.map(l => raw ? l : base + l * size - size / 2);
proc.xrayi = layers.slice();
api.function.slice();
}
},
local = {
get: (key) => localGet(key),
getItem: (key) => localGet(key),
getInt: (key) => parseInt(localGet(key)),
getFloat: (key) => parseFloat(localGet(key)),
getBoolean: (key, def = true) => {
let val = localGet(key);
return val === true || val === 'true' || val === def;
},
toggle: (key, val, def) => localSet(key, val ?? !api.local.getBoolean(key, def)),
put: (key, val) => localSet(key, val),
set: (key, val) => localSet(key, val),
setItem: (key, val) => localSet(key, val),
},
tweak = {
line_precision(v) { api.work.config({ base: { clipperClean: v } }) },
gcode_decimals(v) { api.work.config({ base: { gcode_decimals: v } }) }
};
function clip(text) {
navigator.clipboard
.writeText(text)
.catch(err => console.error('Clipboard Error:', err));
}
function localGet(key) {
let sloc = api.conf.get().local;
return sloc[key] || api.sdb[key];
}
function localSet(key, val) {
let sloc = api.conf.get().local;
sloc[key] = api.sdb[key] = val;
return val;
}
export const api = {
ajax,
beta,
alerts,
busy,
catalog,
client: work,
clip,
clone,
color,
conf: settings.conf,
const: { LANG, LOCAL, SETUP, SECURE, STACKS, ...consts },
devel,
device,
devices,
dialog,
doit,
event,
feature,
function: functions,
group,
help,
hide,
image,
js2o,
language: LANG,
lists,
local,
modal,
mode,
new: {
widget: newWidget
},
noop,
o2js,
onkey,
platform,
probe,
process,
sdb: dataLocal,
selection,
settings,
show,
space,
SPACE,
stacks: STACKS,
stats,
tool: {
update: updateTool
},
tweak,
uc: UC,
ui: {},
util,
var: {
layer_lo: 0,
layer_hi: 0,
layer_max: 0
},
version,
view,
web,
widgets,
work,
};
// allow widget to straddle client / worker FOR NOW
self.kiri_api = api;

60
src/kiri/core/boxes.js Normal file
View file

@ -0,0 +1,60 @@
import { space } from '../../moto/space.js';
const { BoxGeometry, Matrix4, MeshPhongMaterial, Quaternion, Vector3, Mesh } = THREE;
const boxes = [];
let lastBox;
export function clearboxes() {
boxes.length = 0;
}
export function getlastbox() {
return lastBox;
}
export function delbox(name) {
const old = boxes[name];
if (old) {
old.groupTo.remove(old);
}
}
export function addbox(point, color, name, dim = {x:1,y:1,z:1,rz:0}, opt = {}) {
delbox(name);
const box = new Mesh(
new BoxGeometry(dim.x, dim.y, dim.z),
new MeshPhongMaterial({
transparent: true,
opacity: opt.opacity || 0.5,
color
})
);
if (name) {
boxes[name] = box;
}
box.position.x = point.x;
box.position.y = point.y;
box.position.z = point.z;
lastBox = { point, dim };
const group = opt.group || space.scene;
group.add(box);
box.groupTo = group;
if (dim.rz) {
opt.rotate = new Quaternion().setFromAxisAngle(new Vector3(0,0,1), dim.rz);
}
if (opt.rotate) {
opt.matrix = new Matrix4().makeRotationFromQuaternion(opt.rotate);
}
if (opt.matrix) {
box.geometry.applyMatrix4(opt.matrix);
}
return box;
}

View file

@ -1,27 +1,22 @@
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
// use: kiri.api
gapp.register("kiri.client", [], (root, exports) => {
const { kiri } = root;
import { api } from './api.js';
import { noop } from './utils.js';
import { codec } from './codec.js';
import { Widget } from './widget.js';
import { newPrint } from './print.js';
// this code runs in kiri's main loop
let loc = self.location,
host = loc.hostname,
port = loc.port,
proto = loc.protocol,
debug = self.debug === true,
let debug = self.debug === true,
time = Date.now,
seqid = 1,
syncd = {},
running = {},
worker = null,
minions = false,
restarting = false
// occ = new Worker("/kiri/ext/occ-worker.js", {type:"module"}),
;
restarting = false,
workpath,
poolpath;
/**
* @param {Function} fn name of function in kiri.worker
@ -52,13 +47,23 @@ function send(fn, data, onreply, zerocopy) {
}
// code is running in the browser / client context
const client = exports({
export const client = {
send: send,
setWorkPath(path) {
workpath = path;
return client;
},
setPoolPath(path) {
poolpath = path;
return client;
},
pool: {
start() {
minions = true;
send("pool_start", {}, noop);
send("pool_start", { url: poolpath }, noop);
},
stop() {
@ -70,9 +75,21 @@ const client = exports({
newWorker() {
if (self.createWorker) {
return self.createWorker();
} else if (self.kiri_work) {
const work = atob(self.kiri_work);
const blob = new Blob([ work ], { type: 'application/javascript' });
return new Worker(URL.createObjectURL(blob));
} else {
let _ = debug ? '_' : '';
return new Worker(`/code/kiri_work.js?${_}${gapp.version}`);
let worker = new Worker(workpath || api.const.PATHS.work, { type: 'module' });
worker.onerror = (error) => {
console.log({ WORKER_ERROR: error });
error.preventDefault();
};
worker.onmessageerror = (error) => {
console.log({ WORKER_MESSAGE_ERROR: error });
error.preventDefault();
};
return worker;
}
},
@ -85,6 +102,10 @@ const client = exports({
return current > 0;
},
start() {
client.restart();
},
restart() {
// prevent re-entry from cancel callback
if (restarting) {
@ -108,7 +129,7 @@ const client = exports({
running = {};
worker = client.newWorker();
client.onmessage = worker.onmessage = function(e) {
client.onmessage = worker.onmessage = (e) => {
let now = time(),
reply = e.data,
record = running[reply.seq],
@ -157,7 +178,7 @@ const client = exports({
// widget sync
sync(widgets) {
if (!widgets) {
widgets = kiri.api.widgets.all();
widgets = api.widgets.all();
}
// sync any widget that has changed
for (let widget of widgets.filter(w => w.modified || !syncd[w.id])) {
@ -181,7 +202,7 @@ const client = exports({
send("rotate", { settings }, reply => {
if (reply.group) {
// collect post-rotation data for slice/preview renders
for (let widget of kiri.Widget.Groups.forid(reply.group)) {
for (let widget of Widget.Groups.forid(reply.group)) {
widget.belt = reply.belt;
}
} else if (callback) {
@ -241,7 +262,7 @@ const client = exports({
ondone(null, reply.error);
}
if (reply.debug) {
kiri.api.event.emit("export.debug", reply.debug);
api.event.emit("export.debug", reply.debug);
}
});
},
@ -262,10 +283,10 @@ const client = exports({
y: -origin.y,
z: origin.z
};
const output = kiri.newPrint().parseSVG(code, offset);
const output = newPrint().parseSVG(code, offset);
send("parse_svg", output, reply => {
if (reply.parsed) {
done(kiri.codec.decode(reply.parsed));
done(codec.decode(reply.parsed));
}
});
return;
@ -275,7 +296,7 @@ const client = exports({
progress(reply.progress);
}
if (reply.parsed) {
done(kiri.codec.decode(reply.parsed), reply.maxSpeed, reply.minSpeed);
done(codec.decode(reply.parsed), reply.maxSpeed, reply.minSpeed);
}
});
},
@ -330,9 +351,8 @@ const client = exports({
// console.log({ clearCache_reply: reply });
});
}
});
};
// start worker
client.restart();
self.kiri_client = client;
});
export default client;

View file

@ -1,32 +1,14 @@
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
import { Layers } from './layers.js';
import { newPoint } from '../../geo/point.js';
import { Polygon, newPolygon } from '../../geo/polygon.js';
import { Slice, newSlice, Top, newTop } from './slice.js';
import { Widget, newWidget } from './widget.js';
// dep: main.kiri
// dep: geo.base
// dep: geo.polygon
// dep: kiri.widget
// dep: kiri.slice
// dep: kiri.layers
gapp.register("kiri.codec", [], (root, exports) => {
const { base, kiri } = root;
const decoders = {};
const freeMem = true;
const codec = exports({
undef: undefined,
encode: encode,
decode: decode,
registerDecoder: registerDecoder,
allocFloat32Array: allocFloat32Array,
encodePointArray,
decodePointArray,
encodePointArray2D,
decodePointArray2D,
toCodable
});
const TYPE = {
WIDGET: 100,
SLICE: 200,
@ -210,7 +192,7 @@ function decodePointArray(array) {
const points = new Array(length / 3);
for (let vid=0, pid=0; vid < length; ) {
points[pid++] = base.newPoint(array[vid++], array[vid++], array[vid++]);
points[pid++] = newPoint(array[vid++], array[vid++], array[vid++]);
}
return points;
@ -225,7 +207,7 @@ function decodePointArray2D(array, z, fn) {
for (let vid=0, pid=0; vid < length; ) {
points[pid++] = fn ?
fn(array[vid++], array[vid++]) :
base.newPoint(array[vid++], array[vid++], z);
newPoint(array[vid++], array[vid++], z);
}
return points;
@ -233,7 +215,7 @@ function decodePointArray2D(array, z, fn) {
// ----- Widget Codec -----
kiri.Widget.prototype.encode = function(state) {
Widget.prototype.encode = function(state) {
const json = state._json_;
const geo = this.getGeoVertices();
const coded = {
@ -252,7 +234,7 @@ registerDecoder(TYPE.WIDGET, function(v, state) {
const id = v.id,
group = v.group || id,
track = v.track || undefined,
widget = kiri.newWidget(id, kiri.Widget.Groups.forid(group));
widget = newWidget(id, Widget.Groups.forid(group));
widget.loadVertices(v.json ? v.geo.toFloat32() : v.geo);
widget.saved = Date.now();
@ -266,7 +248,7 @@ registerDecoder(TYPE.WIDGET, function(v, state) {
// ----- Slice Codec -----
kiri.Slice.prototype.encode = function(state) {
Slice.prototype.encode = function(state) {
const rv = {
type: TYPE.SLICE,
z: this.z,
@ -279,7 +261,7 @@ kiri.Slice.prototype.encode = function(state) {
};
registerDecoder(TYPE.SLICE, function(v, state) {
let slice = kiri.newSlice(v.z, state.mesh ? state.mesh.newGroup() : null);
let slice = newSlice(v.z, state.mesh ? state.mesh.newGroup() : null);
slice.index = v.index;
slice.layers = decode(v.layers, state)
@ -289,7 +271,7 @@ registerDecoder(TYPE.SLICE, function(v, state) {
// ----- Slice.Top Codec -----
kiri.Top.prototype.encode = function(state) {
Top.prototype.encode = function(state) {
let obj = {
type: TYPE.TOP,
poly: encode(this.poly, state)
@ -307,7 +289,7 @@ kiri.Top.prototype.encode = function(state) {
};
registerDecoder(TYPE.TOP, function(v, state) {
let top = kiri.newTop(decode(v.poly, state));
let top = newTop(decode(v.poly, state));
if (state.full) {
// top.gaps = decode(v.gaps, state);
top.last = decode(v.last, state);
@ -320,7 +302,7 @@ registerDecoder(TYPE.TOP, function(v, state) {
// ----- Polygon Codec -----
base.Polygon.prototype.encode = function(state) {
Polygon.prototype.encode = function(state) {
if (!state.poly) state.poly = {};
let cached = state.poly[this.id];
@ -352,10 +334,10 @@ registerDecoder(TYPE.POLY, function(v, state) {
const array = v.array;
const length = array.length;
const poly = base.newPolygon();
const poly = newPolygon();
for (let vid = 0; vid < length; ) {
poly.push(base.newPoint(array[vid++], array[vid++], array[vid++]));
poly.push(newPoint(array[vid++], array[vid++], array[vid++]));
}
state.poly[v.id] = poly;
@ -382,7 +364,7 @@ function encodeLayerPolys(polys, state) {
});
}
kiri.Layers.prototype.encode = function(state) {
Layers.prototype.encode = function(state) {
let zeros = state.zeros;
let enc = {
type: TYPE.LAYERS,
@ -419,7 +401,7 @@ kiri.Layers.prototype.encode = function(state) {
};
registerDecoder(TYPE.LAYERS, function(v, state) {
const render = new kiri.Layers();
const render = new Layers();
const { layers } = v;
for (let i=0; i<layers.length; i++) {
@ -463,4 +445,28 @@ registerDecoder(TYPE.LAYERS, function(v, state) {
return render;
});
});
export const codec = {
encode,
decode,
registerDecoder,
allocFloat32Array,
encodePointArray,
decodePointArray,
encodePointArray2D,
decodePointArray2D,
toCodable
};
export {
encode,
decode,
registerDecoder,
allocFloat32Array,
encodePointArray,
decodePointArray,
encodePointArray2D,
decodePointArray2D,
toCodable
};
self.kiri_codec = codec;

View file

@ -1,13 +1,5 @@
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
// dep: add.array
// dep: data.local
gapp.register("kiri.conf", (root, exports) => {
const { data } = root;
const { local } = data;
const { clone } = Object;
const CVER = 410;
@ -215,12 +207,11 @@ const renamed = {
drillDwell: "camDrillDwell",
drillLift: "camDrillLift",
drillingOn: "camDrillingOn",
camPocketOnlyFinish: "camOutlinePocket",
camWideCutout: "camOutlineWide",
outputClockwise: "camConventional"
};
const conf = exports({
export const conf = {
// --------------- helper functions
normalize,
device_from_code,
@ -431,9 +422,10 @@ const conf = exports({
camLevelTool: 1000,
camLevelSpindle: 1000,
camLevelOver: 0.75,
camLevelStepZ: 0,
camLevelSpeed: 1000,
camLevelDown: 0,
camLevelOver: 0.5,
camLevelInset: 0.5,
camLevelStock: true,
camRoughTool: 1000,
camRoughSpindle: 1000,
@ -494,7 +486,7 @@ const conf = exports({
camTracePlunge: 200,
camTraceOffOver: 0,
camTraceDogbone: false,
camTraceMerge: true,
camTraceMerge: false,
camTraceLines: false,
camTraceZTop: 0,
camTraceZBottom: 0,
@ -527,6 +519,21 @@ const conf = exports({
camRegisterSpeed: 1000,
camRegisterThru: 5,
camRegisterOffset: 10,
camHelicalTool: 1000,
camHelicalSpindle: 1000,
camHelicalDownSpeed: 250,
camHelicalSpeed: 1000,
camHelicalDown: 5,
camHelicalBottomFinish: true,
camHelicalThru: 0,
camHelicalOffset: "auto",
camHelicalForceStartAngle: false,
camHelicalStartAngle: 0,
camHelicalOffsetOverride: 0,
camHelicalEntry: false,
camHelicalEntryOffset:0,
camHelicalReverse: false,
camHelicalClockwise: true,
camFlipAxis: "X",
camFlipOther: "",
camLaserEnable: ["M321"],
@ -580,7 +587,8 @@ const conf = exports({
outputInvertY: false,
camExpertFast: false,
camTrueShadow: false,
camArcTolerance: 0.006,
camArcEnabled: false,
camArcTolerance: 0.15,
camArcResolution: 5,
camForceZMax: false,
camFirstZMax: false,
@ -973,7 +981,7 @@ const conf = exports({
id: genID(),
ver: CVER
}
});
};
const settings = conf.template;
@ -992,5 +1000,3 @@ settings.cdev.LASER = clone(settings.device);
settings.cdev.DRAG = clone(settings.device);
settings.cdev.WJET = clone(settings.device);
settings.cdev.WEDM = clone(settings.device);
});

View file

@ -1,9 +1,5 @@
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
gapp.register("kiri.consts", (root, exports) => {
const COLOR = {
wireframe: 0x444444,
wireframe_opacity: 0.25,
@ -94,6 +90,11 @@ const LISTS = {
{ name: "inside" },
{ name: "outside" }
],
helicaloff:[
{ name: "auto" },
{ name: "inside" },
{ name: "outside" },
],
zanchor: [
{ name: "top" },
{ name: "middle" },
@ -145,16 +146,22 @@ const PMODES = {
TOOLS: 2
};
const PATHS = {
work: "../lib/kiri/run/worker.js",
pool: "./minion.js"
};
const SEED = 'kiri-seed';
exports({
PMODES,
export let consts = {
COLOR,
LISTS,
MODES,
PATHS,
PMODES,
VIEWS,
SEED,
beltfact: Math.cos(Math.PI / 4)
});
};
});
export { COLOR, LISTS, MODES, VIEWS, PATHS, PMODES, SEED };

View file

@ -13,7 +13,7 @@ const gapp = self.gapp;
eval( fs.readFileSync("src/add/array.js").toString() );
eval( fs.readFileSync("src/data/local.js").toString() );
eval( fs.readFileSync("src/kiri/conf.js").toString() );
eval( fs.readFileSync("src/kiri/core/conf.js").toString() );
gapp.main(undefined, undefined, root => {
let kiri = root.kiri;

382
src/kiri/core/devices.js Normal file
View file

@ -0,0 +1,382 @@
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
import { $, h } from '../../moto/webui.js';
import { api } from './api.js';
import { conf } from './conf.js';
import { space } from '../../moto/space.js';
import { devices as devlist } from '../../pack/kiri-devs.js';
import { settings, conf as setconf } from './settings.js';
export const device = {
clone: cloneDevice,
code: currentDeviceCode,
get: currentDeviceName,
set: selectDevice,
isBelt
};
export const devices = {
show: showDevices,
select: selectDevice,
refresh: updateDeviceList,
update_laser_state: updateLaserState
};
function isBelt() {
return setconf.get().device.bedBelt;
}
function currentDeviceName() {
return setconf.get().filter[api.mode.get()];
}
function currentDeviceCode() {
return setconf.get().devices[currentDeviceName()];
}
function getModeDevices() {
return Object.keys(devlist[ api.mode.get_lower() ]).sort();
}
export function showDevices() {
settings.sync.get().then(_showDevices);
}
function _showDevices() {
updateDeviceList();
api.modal.show('setup');
}
function updateDeviceList() {
renderDevices(getModeDevices());
}
function updateDeviceName(newname) {
let selected = api.device.get(),
devs = setconf.get().devices;
if (newname !== selected) {
devs[newname] = devs[selected];
delete devs[selected];
selectDevice(newname);
updateDeviceList();
}
}
function putLocalDevice(devicename, obj) {
setconf.get().devices[devicename] = obj;
setconf.save();
}
function removeLocalDevice(devicename) {
delete setconf.get().devices[devicename];
setconf.save();
settings.sync.put();
}
function isLocalDevice(devicename) {
return setconf.get().devices[devicename] ? true : false;
}
function getSelectedDevice() {
return api.device.get();
}
function selectDevice(devicename) {
if (isLocalDevice(devicename)) {
setDeviceCode(setconf.get().devices[devicename], devicename);
} else {
let code = devlist[api.mode.get_lower()][devicename];
if (code) {
setDeviceCode(code, devicename);
}
}
}
// only for local filters
function cloneDevice() {
let name = `${getSelectedDevice().replace(/\./g,' ')}`;
let code = api.clone(setconf.get().device);
code.mode = api.mode.get();
if (name.toLowerCase().indexOf('my ') >= 0) {
name = `${name} copy`;
} else {
name = `My ${name}`;
}
putLocalDevice(name, code);
setDeviceCode(code, name);
settings.sync.put();
}
function updateLaserState() {
const dev = setconf.get().device;
$('laser-on').style.display = dev.useLaser ? 'flex' : 'none';
$('laser-off').style.display = dev.useLaser ? 'flex' : 'none';
}
function setDeviceCode(code, devicename) {
api.event.emit('device.select', devicename);
try {
if (typeof(code) === 'string') code = js2o(code) || {};
let mode = api.mode.get(),
lmode = mode.toLowerCase(),
current = setconf.get(),
local = isLocalDevice(devicename),
dev = current.device = conf.device_from_code(code,mode),
dproc = current.devproc[devicename], // last process name for this device
newdev = dproc === undefined, // first time device is selected
predev = current.filter[mode], // previous device selection
chgdev = predev !== devicename; // device is changing
// fill missing device fields
conf.fill_cull_once(dev, conf.defaults[lmode].d);
// first time device use, add any print profiles and set to default if present
if (code.profiles) {
for (let profile of code.profiles) {
let profname = profile.processName;
// if no saved profile by that name for this mode...
if (!current.sproc[mode][profname]) {
console.log('adding profile', profname, 'to', mode);
current.sproc[mode][profname] = profile;
}
// if it's a new device, seed the new profile name as last profile
if (newdev && !current.devproc[devicename]) {
console.log('setting default profile for new device', devicename, 'to', profname);
current.devproc[devicename] = dproc = profname;
}
}
}
dev.new = false;
dev.deviceName = devicename;
let { platform, ui, uc } = api;
ui.deviceBelt.checked = dev.bedBelt;
ui.deviceRound.checked = dev.bedRound;
ui.deviceOrigin.checked = dev.ctOriginCenter || dev.originCenter || dev.bedRound;
ui.fwRetract.checked = dev.fwRetract;
// add extruder selection buttons
if (dev.extruders) {
let ext = api.lists.extruders = [];
dev.internal = 0;
for (let i=0; i<dev.extruders.length; i++) {
ext.push({id:i, name:i});
}
}
// disable editing for non-local devices
[
// ui.deviceName,
ui.gcodePre,
ui.gcodePost,
ui.bedDepth,
ui.bedWidth,
ui.maxHeight,
ui.useLaser,
ui.resolutionX,
ui.resolutionY,
ui.deviceOrigin,
ui.deviceRound,
ui.deviceBelt,
ui.fwRetract,
ui.deviceZMax,
ui.gcodeTime,
ui.gcodeFan,
ui.gcodeFeature,
ui.gcodeTrack,
ui.gcodeLayer,
ui.extFilament,
ui.extNozzle,
ui.spindleMax,
ui.gcodeSpindle,
ui.gcodeDwell,
ui.gcodeChange,
ui.gcodeFExt,
ui.gcodeSpace,
ui.gcodeStrip,
ui.gcodeLaserOn,
ui.gcodeLaserOff,
ui.laserMaxPower,
ui.extPrev,
ui.extNext,
ui.extAdd,
ui.extDel,
ui.extOffsetX,
ui.extOffsetY
].forEach(function(e) {
e.disabled = !local;
});
ui.deviceSave.disabled = !local;
ui.deviceDelete.disabled = !local;
ui.deviceRename.disabled = !local;
ui.deviceExport.disabled = !local;
ui.deviceAdd.style.display = mode === 'SLA' ? 'none' : '';
if (local) {
ui.deviceAdd.innerText = "copy";
ui.deviceDelete.style.display = '';
ui.deviceRename.style.display = '';
ui.deviceExport.style.display = '';
} else {
ui.deviceAdd.innerText = "customize";
ui.deviceDelete.style.display = 'none';
ui.deviceRename.style.display = 'none';
ui.deviceExport.style.display = 'none';
}
ui.deviceAdd.disabled = dev.noclone;
setconf.update_fields();
space.platform.setBelt(isBelt());
platform.update_size();
platform.update_origin();
platform.update();
updateLaserState();
// store current device name for this mode
current.filter[mode] = devicename;
// cache device record for this mode (restored in setMode)
current.cdev[mode] = dev;
if (dproc) {
// restore last process associated with this device
setconf.load(null, dproc);
} else {
setconf.update();
}
setconf.save();
if (isBelt()) {
// space.view.setHome(dev.bedBelt ? Math.PI/2 : 0, Math.PI / 2.5);
space.view.setHome(0, Math.PI / 2.5);
} else {
space.view.setHome(0);
}
// when changing devices, update focus on widgets
if (chgdev) {
setTimeout(api.space.set_focus, 0);
}
uc.refresh(1);
api.event.emit('device.selected', dev);
} catch (e) {
console.log({error:e, device:code, devicename});
api.show.alert(`invalid or deprecated device: "${devicename}"`, 10);
api.show.alert(`please select a new device`, 10);
throw e;
showDevices();
}
api.function.clear();
api.event.settings();
}
function renderDevices(devices) {
let selected = api.device.get() || devices[0],
features = api.feature,
devs = setconf.get().devices,
dfilter = typeof(features.device_filter) === 'function' ? features.device_filter : undefined;
for (let local in devs) {
if (!(devs.hasOwnProperty(local) && devs[local])) {
continue;
}
let dev = devs[local],
fdmCode = dev.cmd,
fdmMode = (api.mode.get() === 'FDM');
if (dev.mode ? (dev.mode === api.mode.get()) : (fdmCode ? fdmMode : !fdmMode)) {
devices.push(local);
}
};
devices = devices.sort();
let { event, ui } = api;
event.emit('devices.render', devices);
ui.deviceSave.onclick = function() {
event.emit('device.save');
api.function.clear();
setconf.save();
settings.sync.put();
showDevices();
api.modal.hide();
};
ui.deviceAdd.onclick = function() {
api.function.clear();
cloneDevice();
showDevices();
};
ui.deviceDelete.onclick = function() {
api.function.clear();
removeLocalDevice(getSelectedDevice());
selectDevice(getModeDevices()[0]);
showDevices();
};
ui.deviceRename.onclick = function() {
api.uc.prompt(`Rename "${selected}`, selected).then(newname => {
if (newname) {
updateDeviceName(newname);
setconf.save();
settings.sync.put();
showDevices();
} else {
showDevices();
}
});
};
ui.deviceExport.onclick = function(event) {
const record = {
version: kiri.version,
device: selected,
process: api.process.code(),
profiles: event.altKey ? settings.prof() : undefined,
code: devs[selected],
time: Date.now()
};
let exp = api.util.b64enc(record);
api.device.export(exp, selected, { event, record });
};
let dedup = {};
let list_cdev = [];
let list_mdev = [];
devices.forEach(function(device, index) {
// prevent device from appearing twice
// such as local name = standard device name
if (dedup[device]) {
return;
}
dedup[device] = device;
let loc = isLocalDevice(device);
if (dfilter && dfilter(device) === false) {
return;
}
if (loc) {
list_mdev.push(h.option(device));
} else {
list_cdev.push(h.option(device));
}
});
let dev_list = $('dev-list');
h.bind(dev_list, [
h.option({ _: '-- My Devices --', disabled: true }),
...list_mdev,
h.option({ _: '-- Stock Devices --', disabled: true }),
...list_cdev
]);
let dev_opts = [...dev_list.options].map(o => o.innerText);
dev_list.selectedIndex = dev_opts.indexOf(selected);
dev_list.onchange = ev => {
const seldev = dev_list.options[dev_list.selectedIndex];
selectDevice(seldev.innerText);
api.platform.layout();
}
selectDevice(selected);
}

View file

@ -1,13 +1,8 @@
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
// dep: kiri.api
// use: kiri.selection
// use: moto.space
gapp.register("kiri.do", [], (root, events) => {
import { api } from './api.js';
import { space } from '../../moto/space.js';
const { kiri, moto } = root;
const { api } = kiri;
const { space } = moto;
const { event } = api;
let stack = [];
@ -44,7 +39,7 @@ let clear = api.doit.clear = function() {
};
function updateButtons() {
let isArrange = api.view.get() === kiri.consts.VIEWS.ARRANGE;
let isArrange = api.view.get() === api.consts.VIEWS.ARRANGE;
$('doit').style.display = isArrange && stack.length ? 'flex' : 'none';
$('undo').disabled = stpos === 0;
$('redo').disabled = stpos == stack.length;
@ -175,5 +170,3 @@ event.on('mouse.drag.done', () => {
});
moved = {x:0, y:0};
});
});

View file

@ -1,23 +1,13 @@
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
// dep: ext.md5
// dep: geo.base
// dep: data.local
// dep: kiri.consts
// dep: kiri.api
// dep: kiri.main
gapp.register("kiri.export", [], (root, exports) => {
const { base, data, kiri } = root;
const { api, consts } = kiri;
const { local } = data;
const { util } = base;
const { stats, ui } = api;
const { MODES } = consts;
kiri.export = exportFile;
import { $ } from '../../moto/webui.js';
import { api } from './api.js';
import { client } from './client.js';
import { local } from '../../data/local.js';
import { util } from '../../geo/base.js';
import { MODES } from './consts.js';
import { LASER as laser_driver } from '../mode/laser/driver.js';
import { SLA as sla_client } from '../mode/sla/client.js';
let printSeq = parseInt(local['kiri-print-seq'] || local['print-seq'] || "0") + 1;
@ -29,7 +19,7 @@ function localSet(key, val) {
return api.local.set(key, val);
}
function exportFile(options) {
export function exportFile(options) {
let mode = api.mode.get();
let names = api.widgets.all().map(w => w.meta ? w.meta.file : undefined)
.filter(v => v)
@ -53,7 +43,7 @@ function callExport(callback, mode, names) {
let gcode = [];
let section = [];
let sections = { };
kiri.client.export(api.conf.get(), (line) => {
client.export(api.conf.get(), (line) => {
if (typeof line !== 'string') {
if (line.section) {
sections[line.section] = section = [];
@ -75,7 +65,7 @@ function callExport(callback, mode, names) {
}
function callExportLaser(options, names) {
kiri.client.export(api.conf.get(), (line) => {
client.export(api.conf.get(), (line) => {
// engine export uses lines
// console.log({unexpected_line: line});
}, (output, error) => {
@ -89,14 +79,14 @@ function callExportLaser(options, names) {
}
function callExportSLA(options, names) {
kiri.client.export(api.conf.get(), (line) => {
client.export(api.conf.get(), (line) => {
api.show.progress(line.progress, "exporting");
}, (output, error) => {
api.show.progress(0);
if (error) {
api.show.alert(error, 5);
} else {
kiri.driver.SLA.printDownload(output, api, names);
sla_client.printDownload(output, api, names);
}
});
}
@ -107,7 +97,7 @@ function exportLaserDialog(data, names) {
const fileroot = names[0] || "laser";
const filename = `${fileroot}-${(printSeq.toString().padStart(3,"0"))}`;
const settings = api.conf.get();
const driver = kiri.driver.LASER;
const driver = laser_driver;
function download_svg() {
api.util.download(
@ -207,7 +197,7 @@ function exportGCodeDialog(gcode, sections, info, names) {
ajax.onreadystatechange = function() {
if (ajax.readyState === 4) {
let status = ajax.status;
stats.add(`ua_${api.mode.get_lower()}_print_octo_${status}`);
api.stats.add(`ua_${api.mode.get_lower()}_print_octo_${status}`);
if (status >= 200 && status < 300) {
api.modal.hide();
} else {
@ -278,11 +268,11 @@ function exportGCodeDialog(gcode, sections, info, names) {
)
.then(t => t.text())
.then(t => {
stats.add(`ua_${api.mode.get_lower()}_print_local_ok`);
api.stats.add(`ua_${api.mode.get_lower()}_print_local_ok`);
console.log({grid_spool_said: t});
})
.catch(e => {
stats.add(`ua_${api.mode.get_lower()}_print_local_err`);
api.stats.add(`ua_${api.mode.get_lower()}_print_local_err`);
console.log({grid_local_spool_error: e});
})
.finally(() => {
@ -394,7 +384,7 @@ function exportGCodeDialog(gcode, sections, info, names) {
xhtr.onreadystatechange = function() {
if (xhtr.readyState === 4) {
let status = xhtr.status;
stats.add(`ua_${api.mode.get_lower()}_print_grid_${status}`);
api.stats.add(`ua_${api.mode.get_lower()}_print_grid_${status}`);
if (status >= 200 && status < 300) {
let json = js2o(xhtr.responseText);
gridhost_tracker(host,json.key);
@ -481,7 +471,7 @@ function exportGCodeDialog(gcode, sections, info, names) {
$('print-filament').style.display = fdm ? '' : 'none';
$('print-filename').value = filename;
$('print-filesize').value = util.comma(info.bytes);
$('print-filament').value = Math.round(info.distance);
$('print-length').value = Math.round(info.distance);
if (set.controller.devel) {
$('code-preview-textarea').style.height = "30em";
}
@ -511,7 +501,7 @@ function exportGCodeDialog(gcode, sections, info, names) {
})
}
}
kiri.client.zip(files, progress => {
client.zip(files, progress => {
api.show.progress(progress.percent/100, "generating zip files");
}, output => {
api.show.progress(0);
@ -681,7 +671,7 @@ function exportGCodeDialog(gcode, sections, info, names) {
name: `Metadata/top_1.png`,
data: api.view.bambu.s512.png
}];
kiri.client.zip(files, progress => {
client.zip(files, progress => {
api.show.progress(progress.percent/100, "generating 3mf");
}, output => {
api.show.progress(0);
@ -742,5 +732,3 @@ function exportGCodeDialog(gcode, sections, info, names) {
// preview of the generated GCODE (first 64k max)
if (preview && gcode) $('code-preview-textarea').value = gcode.substring(0,65535);
}
});

View file

@ -1,13 +1,5 @@
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
// dep: main.kiri
// use: data.index
gapp.register("kiri.files", [], (root, exports) => {
const { kiri } = self;
class Files {
constructor(indexdb) {
let store = this;
@ -176,8 +168,8 @@ function notifyFileListeners(store) {
}
}
kiri.openFiles = function(indexdb) {
export const openFiles = function(indexdb) {
return new Files(indexdb);
};
});
export { saveFileList, notifyFileListeners };

View file

@ -1,19 +1,12 @@
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
// use: load.stl
// use: load.svg
// use: kiri.api
// use: kiri.platform
// use: kiri.settings
// use: kiri.widget
gapp.register("kiri.frame", [], (root, exports) => {
import { api } from './api.js';
import { load } from '../../load/file.js';
import { newWidget } from './widget.js';
import { VIEWS } from './consts.js';
// add frame message api listener
window.addEventListener('message', msg => {
const { load, kiri, moto } = self;
const { api, newWidget } = kiri;
const { conf, event, feature, platform, settings, show } = api;
if (!feature.frame) return;
@ -126,5 +119,3 @@ window.addEventListener('message', msg => {
show.progress(data.progress, data.message);
}
});
});

View file

@ -1,30 +1,16 @@
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
// dep: kiri.api
// dep: kiri.client
// dep: kiri.export
// dep: moto.space
// use: kiri-mode.cam.client
// dep: kiri-mode.fdm.client
// dep: kiri-mode.sla.client
// dep: kiri-mode.laser.driver
// dep: kiri-mode.drag.driver
// dep: kiri-mode.wjet.driver
// dep: kiri-mode.wedm.driver
gapp.register("kiri.function", (root, exports) => {
const { kiri } = root;
const { api, client, consts, utils } = kiri;
const { space } = moto;
const { COLOR, PMODES } = consts;
import { api } from './api.js';
import { client } from './client.js';
import { codec } from './codec.js';
import { space } from '../../moto/space.js';
import { COLOR, PMODES } from './consts.js';
import { exportFile } from './export.js';
let complete = {};
function prepareSlices(callback, scale = 1, offset = 0) {
const { conf, event, feature, hide, mode, view, platform, show } = api;
const { stacks } = kiri;
const { conf, event, feature, hide, mode, view, platform, show, stacks } = api;
if (view.is_arrange()) {
// in arrange mode, create a screenshot at the start slicing
@ -139,16 +125,43 @@ function prepareSlices(callback, scale = 1, offset = 0) {
}
function sliceWidget(widget) {
// weight each widget progress % by their # vertices
let factor = (widget.getVertices().count / defvert);
widget.slice(settings, (sliced, error) => {
function onupdate(update, msg, alert) {
if (alert) {
api.show.alert(alert);
}
if (msg && msg !== lastMsg) {
let mark = Date.now();
if (lastMsg) {
let key = slicing.length > 1 ?
`${widget.id}_${segNumber++}_${lastMsg}` :
`${segNumber++}_${lastMsg}`
segtimes[key] = mark - startTime;
}
lastMsg = msg;
startTime = mark;
}
// on update
if (update >= 0) {
track[widget.id] = (update || 0) * factor;
totalProgress = 0;
for (let w of slicing) {
totalProgress += (track[w.id] || 0);
}
show.progress(offset + (totalProgress / slicing.length) * scale, msg);
}
}
function ondone(sliced, error) {
let mark = Date.now();
// update UI info
if (sliced) {
// update segment time
if (lastMsg) {
segtimes[`${widget.id}_${segNumber++}_${lastMsg}`] = mark - startTime;
let key = slicing.length > 1 ?
`${widget.id}_${segNumber++}_${lastMsg}` :
`${segNumber++}_${lastMsg}`
segtimes[`${key}`] = mark - startTime;
}
event.emit('slice', settings.mode);
}
@ -169,28 +182,55 @@ function prepareSlices(callback, scale = 1, offset = 0) {
// start next widget slice
sliceNext();
}
}, (update, msg, alert) => {
if (alert) {
api.show.alert(alert);
}
// weight each widget progress % by their # vertices
let factor = (widget.getVertices().count / defvert);
widget.settings = settings;
widget.clearSlices();
onupdate(0.0001, "slicing");
// store slicing visuals
widget.stack = api.stacks.create(widget.id, widget.mesh);
// compensate for zcut (widget moved through floor)
widget.stack.obj.view.position.z = widget.track.zcut || 0;
// in case result of slice is nothing, do not preserve previous
widget.slices = []
// executed from kiri.js
client.slice(settings, widget, (reply) => {
if (reply.alert) {
onupdate(null, null, reply.alert);
}
if (msg && msg !== lastMsg) {
let mark = Date.now();
if (lastMsg) {
segtimes[`${widget.id}_${segNumber++}_${lastMsg}`] = mark - startTime;
}
lastMsg = msg;
startTime = mark;
if (reply.update) {
onupdate(reply.update, reply.updateStatus);
}
// on update
if (update >= 0) {
track[widget.id] = (update || 0) * factor;
totalProgress = 0;
for (let w of slicing) {
totalProgress += (track[w.id] || 0);
}
show.progress(offset + (totalProgress / slicing.length) * scale, msg);
if (reply.send_start) {
widget.xfer = {start: reply.send_start};
}
if (reply.stats) {
widget.stats = reply.stats;
}
if (reply.send_end) {
widget.stats.load_time = widget.xfer.start - reply.send_end;
}
if (reply.slice) {
widget.slices.push(codec.decode(reply.slice, {mesh:widget.mesh}));
}
if (reply.done) {
ondone(true);
}
if (reply.error) {
ondone(false, reply.error);
}
});
// discard point cache
widget.points = undefined;
}
function sliceDone() {
@ -200,7 +240,10 @@ function prepareSlices(callback, scale = 1, offset = 0) {
};
for (let widget of slicing) {
// on done
segtimes[`${widget.id}_${segNumber++}_draw`] = widget.render(widget.stack);
let key = slicing.length > 1 ?
`${widget.id}_${segNumber++}_draw` :
`${segNumber++}_draw`
segtimes[`${key}`] = widget.render(widget.stack);
// rotate stack for belt beds
if (widget.belt) {
widget.stack.obj.rotate(widget.belt);
@ -247,9 +290,7 @@ function prepareSlices(callback, scale = 1, offset = 0) {
}
function preparePreview(callback, scale = 1, offset = 0) {
const { conf, event, feature, hide, mode, view, platform, show } = api;
const { stacks } = kiri;
const { conf, event, feature, hide, mode, view, platform, show, stacks } = api;
const widgets = api.widgets.all();
const settings = conf.get();
const { device, process, controller } = settings;
@ -305,7 +346,7 @@ function preparePreview(callback, scale = 1, offset = 0) {
client.prepare(settings, (progress, message, layer) => {
if (layer) {
output.push(kiri.codec.decode(layer));
output.push(codec.decode(layer));
}
if (message && message !== lastMsg) {
const mark = Date.now();
@ -407,7 +448,7 @@ function prepareExport() {
}
api.event.emit("function.export", {mode: settings.mode});
complete.export = true;
kiri.export(...argsave);
exportFile(...argsave);
}
function cancelWorker() {
@ -417,8 +458,7 @@ function cancelWorker() {
}
function parseCode(code, type) {
const { conf, event, show, widgets, view } = api;
const { stacks } = kiri;
const { conf, event, show, stacks, widgets, view } = api;
const settings = conf.get();
event.emit("code.load", {code, type});
@ -441,8 +481,12 @@ function parseCode(code, type) {
});
}
function clear_progress() {
complete = {};
}
// extend API (api.function)
const functions = Object.assign(api.function, {
export const functions = {
slice: prepareSlices,
print: preparePreview,
prepare: preparePreview,
@ -451,7 +495,16 @@ const functions = Object.assign(api.function, {
cancel: cancelWorker,
parse: parseCode,
clear: client.clear,
clear_progress() { complete = {} }
});
clear_progress,
};
});
export {
prepareSlices as slice,
preparePreview as print,
preparePreview as prepare,
prepareAnimation as animate,
prepareExport as export,
cancelWorker as cancel,
parseCode as parse,
clear_progress,
};

1879
src/kiri/core/init.js Normal file

File diff suppressed because it is too large Load diff

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

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

View file

@ -1,11 +1,6 @@
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
gapp.register("kiri.lang", [], (root, exports) => {
const { kiri } = root;
const LANG = kiri.lang = { current: {} };
const LANG = self.lang = { current: {} };
const KDFL = 'en-us';
let lset = navigator.language.toLocaleLowerCase();
@ -78,4 +73,6 @@ LANG.set = function() {
return undefined;
}
});
export default { LANG };
export { LANG };

View file

@ -1,25 +1,9 @@
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
import { newPolygon, Polygon } from '../../geo/polygon.js';
import { polygons as POLY } from '../../geo/polygons.js';
/*
* provides the `output` abstraction for turning poly lines (open and closed)
* into primordial geometries (faces, lines, color ranges). used inside of
* workers as part of slicing and preview output.
*/
// dep: geo.base
// dep: geo.paths
// dep: geo.polygon
// dep: geo.polygons
gapp.register("kiri.layers", [], (root, exports) => {
const { base, kiri } = root;
const { polygons, newPolygon } = base;
const POLY = base.polygons;
class Layers {
export class Layers {
constructor() {
this.init();
}
@ -94,7 +78,7 @@ class Layers {
options.open = true;
const polys = [];
for (let i=0; i<lines.length-1; i += 2) {
polys.push(new base.Polygon()
polys.push(new Polygon()
.append(lines[i])
.append(lines[i+1])
.setOpen());
@ -110,11 +94,14 @@ class Layers {
// an open or closed polygon
addPoly(poly, options) {
return this.addPolys([poly], options);
return this.addPolys([ poly ], options);
}
// a polygon rendered as a webgl line
addPolys(polys, options) {
if (!Array.isArray(polys)) {
throw "polys must be an array";
}
if (polys.length === 0) {
return this;
}
@ -186,8 +173,7 @@ class Layers {
p1.setZ(poly.z);
p2.setZ(poly.z);
}
this.addPolys(p1);
this.addPolys(p2);
this.addPolys([ p1, p2 ]);
}
const color = opts.color ?
(typeof(opts.color) === 'number' ? { line: opts.color, face: opts.color } : opts.color) :
@ -277,7 +263,3 @@ function flat(polys) {
return POLY.flatten([polys.clone(true)], [], true);
}
}
kiri.Layers = Layers;
});

959
src/kiri/core/main.js Normal file
View file

@ -0,0 +1,959 @@
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
import './frame.js';
import lang from './lang.js';
import STACKS from './stacks.js';
import { $ } from '../../moto/webui.js';
import { api } from './api.js';
import { broker } from '../../moto/broker.js';
import { consts } from './consts.js';
import { Index } from '../../data/index.js';
import { local as dataLocal } from '../../data/local.js';
import { openFiles } from './files.js';
import { platform } from './platform.js';
import { selection } from './selection.js';
import { settings } from './settings.js';
import { showDevices } from './devices.js';
import { space as SPACE } from '../../moto/space.js';
import { stats } from './stats.js';
import { noop, utils } from './utils.js';
import { version } from '../../moto/license.js';
import { Widget, newWidget } from './widget.js';
import { showTools } from '../mode/cam/tools.js';
let { parseOpt, o2js, js2o, ls2o } = utils,
{ COLOR, MODES, VIEWS } = consts,
LANG = lang.current,
WIN = self.window,
DOC = self.document,
LOC = self.location,
SETUP = parseOpt(LOC.search.substring(1)),
SECURE = isSecure(LOC.protocol),
LOCAL = self.debug && !SETUP.remote,
EVENT = broker,
SDB = dataLocal,
FILES = openFiles(new Index(SETUP.d ? SETUP.d[0] : 'kiri')),
clone = Object.clone,
MODE = MODES.FDM,
viewMode = VIEWS.ARRANGE,
autoSaveTimer = null,
inits = parseInt(SDB.getItem('kiri-init') || stats.get('init') || 0) + 1;
// update version and init count
SDB.setItem('kiri-init', inits);
stats.set('init', inits);
stats.set('kiri', version);
// allow widget to straddle client / worker FOR NOW
self.kiri_catalog = FILES;
export const dialog = {
show: showModal,
hide: hideModal,
update_process_list: updateProcessList
};
export const help = {
show: showHelp,
file: showHelpFile
};
export const event = {
on(t,l) { return EVENT.on(t,l) },
emit(t,m,o) { return EVENT.publish(t,m,o) },
bind(t,m,o) { return EVENT.bind(t,m,o) },
alerts(clr) { api.alerts.update(clr) },
import: loadFile,
settings: triggerSettingsEvent
};
export const group = {
merge: groupMerge,
split: groupSplit,
};
export const hide = {
alert(rec, recs) { api.alerts.hide(...arguments) },
import: noop,
slider: hideSlider
};
export const image = {
dialog: loadImageDialog,
convert: loadImageConvert
};
export const modal = {
show: showModal,
hide: hideModal,
visible: modalShowing
};
export const mode = {
get_id() { return MODE },
get_lower: getModeLower,
get: getMode,
set: setMode,
switch: switchMode,
set_expert: noop,
is_fdm() { return MODE === MODES.FDM },
is_cam() { return MODE === MODES.CAM },
is_sla() { return MODE === MODES.SLA },
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 false ||
api.mode.is_drag() ||
api.mode.is_wedm() ||
api.mode.is_wjet() ||
api.mode.is_laser()
}
};
export const probe = {
live: "https://live.grid.space",
grid: noop,
local: noop
};
export const process = {
code: currentProcessCode,
get: currentProcessName
};
export const show = {
alert() { return api.alerts.show(...arguments) },
controls: setControlsVisible,
devices: showDevices,
import() { api.ui.import.style.display = '' },
layer: setVisibleLayer,
local: showLocal,
progress: setProgress,
slices: showSlices,
tools: showTools
};
export const space = {
reload,
auto_save,
restore: restoreWorkspace,
clear: clearWorkspace,
save: saveWorkspace,
set_focus: setFocus,
update: SPACE.update,
is_dark() { return settings.ctrl().dark }
};
export const util = {
isSecure,
download: downloadBlob,
ui2rec() { api.conf.update_from(...arguments) },
rec2ui() { api.conf.update_fields(...arguments) },
b64enc(obj) { return base64js.fromByteArray(new TextEncoder().encode(JSON.stringify(obj))) },
b64dec(obj) { return JSON.parse(new TextDecoder().decode(base64js.toByteArray(obj))) }
};
export const view = {
get() { return viewMode },
set() { setViewMode(...arguments) },
set_arrange() { api.view.set(VIEWS.ARRANGE) },
set_slice() { api.view.set(VIEWS.SLICE) },
set_preview() { api.view.set(VIEWS.PREVIEW) },
set_animate() { api.view.set(VIEWS.ANIMATE) },
is_arrange() { return viewMode === VIEWS.ARRANGE },
is_slice() { return viewMode === VIEWS.SLICE },
is_preview() { return viewMode === VIEWS.PREVIEW },
is_animate() { return viewMode === VIEWS.ANIMATE },
update_stack_labels: updateStackLabelState,
update_slider_max: updateSliderMax,
update_slider: updateSlider,
update_speeds: updateSpeeds,
hide_slices: hideSlices,
snapshot: null,
edges: setEdges,
unit_scale: unitScale,
wireframe: setWireframe
};
// add show() to catalog for API
FILES.show = showCatalog;
// patch broker for api backward compatibility
EVENT.on = (topic, listener) => {
EVENT.subscribe(topic, listener);
return EVENT;
};
function updateStackLabelState() {
const settings = api.conf.get();
// match label checkboxes to preference
for (let label of api.stacks.getLabels()) {
let check = `${settings.mode}-${api.view.get()}-${label}`;
api.stacks.setVisible(label, settings.labels[check] !== false);
}
}
function setFocus(sel, point) {
if (point) {
SPACE.platform.setCenter(point.x, point.z, point.y);
SPACE.view.setFocus(new THREE.Vector3(point.x, point.y, point.z));
return;
}
if (sel === undefined) {
sel = api.widgets.all();
} else if (!Array.isArray) {
sel = [ sel ];
} else if (sel.length === 0) {
sel = api.widgets.all();
}
let pos = { x:0, y:0, z:0 };
for (let widget of sel) {
pos.x += widget.track.pos.x;
pos.y += widget.track.pos.y;
pos.z += widget.track.pos.z;
}
if (sel.length) {
pos.x /= sel.length;
pos.y /= sel.length;
pos.z /= sel.length;
}
let cam_index = api.conf.get().process.camStockIndexed || false;
let focus_z = cam_index ? 0 : platform.top_z() / 2;
SPACE.platform.setCenter(pos.x, -pos.y, focus_z);
SPACE.view.setFocus(new THREE.Vector3(pos.x, focus_z, -pos.y));
}
function reload() {
api.event.emit('reload');
do_reload(100);
}
function do_reload(time) {
// allow time for async saves to complete and busy to to to zero
setTimeout(() => {
if (api.busy.val() === 0) {
LOC.reload();
} else {
console.log(`reload deferred on busy=${api.busy.val()}`);
do_reload(250);
}
}, time || 100);
}
function auto_save() {
if (!settings.ctrl().autoSave) {
return;
}
clearTimeout(autoSaveTimer);
autoSaveTimer = setTimeout(() => {
api.space.save(true);
}, 1000);
}
/** ******************************************************************
* Utility Functions
******************************************************************* */
function unitScale() {
return api.mode.is_cam() && settings.ctrl().units === 'in' ? 25.4 : 1;
}
function triggerSettingsEvent() {
api.event.emit('settings', settings.get());
}
function isSecure(proto) {
return proto.toLowerCase().indexOf("https") === 0;
}
function setProgress(value = 0, msg) {
value = (value * 100).round(4);
api.ui.progress.width = value+'%';
if (self.debug) {
// console.log(msg, value.round(2));
api.ui.prostatus.style.display = 'flex';
if (msg) {
api.ui.prostatus.innerHTML = msg;
} else {
api.ui.prostatus.innerHTML = '';
}
}
}
function bound(v,min,max) {
return Math.max(min,Math.min(max,v));
}
function updateSpeeds(maxSpeed, minSpeed) {
const { ui } = api;
ui.speeds.style.display =
maxSpeed &&
settings.mode !== 'SLA' &&
settings.mode !== 'LASER' &&
viewMode === VIEWS.PREVIEW &&
ui.showSpeeds.checked ? 'block' : '';
if (maxSpeed) {
const colors = [];
for (let i = 0; i <= maxSpeed; i += maxSpeed / 20) {
colors.push(Math.round(Math.max(i, 1)));
}
api.client.colors(colors, maxSpeed, speedColors => {
const list = [];
Object.keys(speedColors).map(v => parseInt(v)).sort((a, b) => b - a).forEach(speed => {
const color = speedColors[speed];
const hex = color.toString(16).padStart(6, 0);
const r = (color >> 16) & 0xff;
const g = (color >> 8) & 0xff;
const b = (color >> 0) & 0xff;
const style = `background-color:#${hex}`;
list.push(`<label style="${style}">${speed}</label>`);
});
ui.speedbar.innerHTML = list.join('');
});
api.event.emit('preview.speeds', {
min: minSpeed,
max: maxSpeed
});
}
}
function updateSlider() {
api.event.emit("slider.set", {
start: (api.var.layer_lo / api.var.layer_max),
end: (api.var.layer_hi / api.var.layer_max)
});
api.conf.update_fields_from_range();
}
function setVisibleLayer(h, l) {
h = h >= 0 ? h : api.var.layer_hi;
l = l >= 0 ? l : api.var.layer_lo;
api.var.layer_hi = bound(h, 0, api.var.layer_max);
api.var.layer_lo = bound(l, 0, h);
api.event.emit("slider.label");
updateSlider();
showSlices();
}
function setWireframe(bool, color, opacity) {
api.widgets.each(function(w) { w.setWireframe(bool, color, opacity) });
SPACE.update();
}
function setEdges(bool) {
if (bool && bool.toggle) {
api.local.toggle('model.edges');
} else {
api.local.set('model.edges', bool);
}
bool = api.local.getBoolean('model.edges');
api.widgets.each(w => w.setEdges(bool));
SPACE.update();
}
function updateSliderMax(set) {
let max = STACKS.getRange().tallest - 1;
api.var.layer_max = api.ui.sliderMax.innerText = max;
if (set || max < api.var.layer_hi) {
api.var.layer_hi = api.var.layer_max;
api.event.emit("slider.label");
updateSlider();
}
}
function hideSlices() {
STACKS.clear();
api.widgets.opacity(COLOR.model_opacity);
api.widgets.each(function(widget) {
widget.setWireframe(false);
});
}
function setWidgetVisibility(bool) {
api.widgets.each(w => {
if (bool) {
w.show();
} else {
w.hide();
}
});
}
/**
* hide or show slice-layers and their sub-elements
*
* @param {number} [layer]
*/
function showSlices(layer) {
if (viewMode === VIEWS.ARRANGE) {
return;
}
showSlider();
if (typeof(layer) === 'string' || typeof(layer) === 'number') {
layer = parseInt(layer);
} else {
layer = api.var.layer_hi;
}
layer = bound(layer, 0, api.var.layer_max);
if (layer < api.var.layer_lo) api.var.layer_lo = layer;
api.var.layer_hi = layer;
api.event.emit("slider.label");
updateSlider();
STACKS.setRange(api.var.layer_lo, api.var.layer_hi);
SPACE.update();
}
function showSlider() {
api.ui.layers.style.display = 'flex';
api.ui.slider.style.display = 'flex';
}
function hideSlider() {
api.ui.layers.style.display = 'none';
api.ui.slider.style.display = 'none';
api.ui.speeds.style.display = 'none';
}
function loadImageDialog(image, name, force) {
if (!force && image.byteLength > 2500000) {
return api.uc.confirm("Large images may fail to import<br>Consider resizing under 1000 x 1000<br>Proceed with import?").then(ok => {
if (ok) {
loadImageDialog(image, name, true);
}
});
}
const opt = {pre: [
"<div class='f-col a-center'>",
" <h3>Image Conversion</h3>",
" <p class='t-just' style='width:300px;line-height:1.5em'>",
" This will create a 3D model from a 2D PNG image. Photos must",
" be blurred to be usable. Values from 0=off to 50=high are suggested.",
" Higher values incur more processing time.",
" </p>",
" <div class='f-row t-right'><table>",
" <tr><th>blur value</th><td><input id='png-blur' value='0' size='3'></td>",
" <th>&nbsp;invert image</th><td><input id='png-inv' type='checkbox'></td></tr>",
" <tr><th>base size</th><td><input id='png-base' value='0' size='3'></td>",
" <th>&nbsp;invert alpha</th><td><input id='alpha-inv' type='checkbox'></td></tr>",
" <tr><th>border size</th><td><input id='png-border' value='0' size='3'></td>",
" <th></th><td></td></tr>",
" </table></div>",
"</div>"
]};
api.uc.confirm(undefined, {convert:true, cancel:false}, undefined, opt).then((ok) => {
if (ok) {
loadImage(image, {
file: name,
blur: parseInt($('png-blur').value) || 0,
base: parseInt($('png-base').value) || 0,
border: parseInt($('png-border').value) || 0,
inv_image: $('png-inv').checked,
inv_alpha: $('alpha-inv').checked
});
}
});
}
function loadImage(image, opt = {}) {
const info = Object.assign({settings: settings.get(), png:image}, opt);
api.client.image2mesh(info, progress => {
api.show.progress(progress, "converting");
}, vertices => {
api.show.progress(0);
const widget = newWidget().loadVertices(vertices);
widget.meta.file = opt.file;
platform.add(widget);
});
}
/** ******************************************************************
* Selection Functions
******************************************************************* */
function groupMerge() {
Widget.Groups.merge(selection.widgets(true));
}
function groupSplit() {
Widget.Groups.split(selection.widgets(false));
}
/** ******************************************************************
* Settings Functions
******************************************************************* */
// convert any image type to png
function loadImageConvert(res, name) {
let url = URL.createObjectURL(new Blob([res]));
$('mod-any').innerHTML = `<img id="xsrc" src="${url}"><canvas id="xdst"></canvas>`;
let img = $('xsrc');
let can = $('xdst');
img.onload = () => {
can.width = img.width;
can.height = img.height;
let ctx = can.getContext('2d');
ctx.drawImage(img, 0, 0);
fetch(can.toDataURL()).then(r => r.arrayBuffer()).then(data => {
loadImageDialog(data, name);
});
};
}
function loadFile(ev) {
// use modern Filesystem api when available
if (false && window.showOpenFilePicker) {
window.showOpenFilePicker().then(files => {
return Promise.all(files.map(fh => fh.getFile()))
}).then(files => {
if (files.length) {
api.platform.load_files(files);
}
}).catch(e => { /* ignore cancel */ });
return;
}
api.ui.load.click();
}
function saveWorkspace(quiet) {
api.conf.save();
const newWidgets = [];
const oldWidgets = js2o(SDB.getItem('ws-widgets'), []);
api.widgets.each(function(widget) {
if (widget.synth) return;
newWidgets.push(widget.id);
oldWidgets.remove(widget.id);
widget.saveState();
let ann = api.widgets.annotate(widget.id);
ann.file = widget.meta.file;
ann.url = widget.meta.url;
});
SDB.setItem('ws-widgets', o2js(newWidgets));
oldWidgets.forEach(wid => {
Widget.deleteFromState(wid);
});
// eliminate dangling saved widgets
FILES.deleteFilter(key => newWidgets.indexOf(key.substring(8)) < 0, "ws-save-", "ws-savf");
if (!quiet) {
api.show.alert("workspace saved", 1);
}
}
function restoreWorkspace(ondone, skip_widget_load) {
let newset = api.conf.restore(false),
camera = newset.controller.view,
toload = ls2o('ws-widgets',[]),
loaded = 0,
position = true;
api.conf.update_fields();
platform.update_size();
SPACE.view.reset();
if (camera) {
SPACE.view.load(camera);
} else {
SPACE.view.home();
}
if (skip_widget_load) {
if (ondone) {
ondone();
}
return;
}
// remove any widgets from platform
api.widgets.each(function(widget) {
platform.delete(widget);
});
// load any widget by name that was saved to the workspace
toload.forEach(function(widgetid) {
Widget.loadFromState(widgetid, function(widget) {
if (widget) {
platform.add(widget, 0, position, true);
let ann = api.widgets.annotate(widgetid);
widget.meta.file = ann.file;
widget.meta.url = ann.url;
}
if (++loaded === toload.length) {
platform.deselect();
if (ondone) {
ondone();
setTimeout(() => {
platform.update_bounds();
SPACE.update();
}, 1);
}
}
}, position);
});
return toload.length > 0;
}
function clearWorkspace() {
// free up worker cache/mem
api.client.clear();
platform.select_all();
platform.delete(selection.meshes());
}
function modalShowing() {
return api.ui.modal.style.display === 'flex';
}
function showModal(which) {
let mod = api.ui.modal,
style = mod.style,
visible = modalShowing(),
info = { pct: 0 };
// hide all modals befroe showing another
Object.keys(api.ui.modals).forEach(name => {
api.ui.modals[name].style.display = name === which ? 'flex' : '';
});
function ondone() {
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 = api.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 = '';
api.event.emit('modal.hide');
}).
start();
}
function showCatalog() {
showModal("files");
}
function editSettings(e) {
let current = settings.get(),
mode = getMode(),
name = e.target.getAttribute("name"),
load = current.sproc[mode][name],
loadstr = JSON.stringify(load,null,4).split('\n');
api.uc.prompt(`settings for "${name}"`, loadstr).then(edit => {
if (edit) {
try {
current.sproc[mode][name] = JSON.parse(edit);
if (name === settings.proc().processName) {
api.conf.load(null, name);
}
api.conf.save();
api.settings.sync.put();
} catch (e) {
console.log({ malformed_settings: e });
api.uc.alert('malformed settings object');
}
}
});
}
function exportSettings(e) {
let current = settings.get(),
mode = getMode(),
name = e.target.getAttribute("name"),
data = api.util.b64enc({
process: current.sproc[mode][name],
version,
moto: moto.id,
time: Date.now(),
mode,
name
});
api.uc.prompt("Export Process Filename", name).then(name => {
if (name) {
api.util.download(data, `${name}.km`);
}
});
}
function deleteSettings(e) {
let current = settings.get();
let name = e.target.getAttribute("del");
delete current.sproc[getMode()][name];
api.settings.sync.put();
updateProcessList();
api.conf.save();
triggerSettingsEvent();
}
function updateProcessList() {
let current = settings.get();
let list = [], s = current, sp = s.sproc[getMode()] || {}, table = api.ui.settingsList;
table.innerHTML = '';
for (let k in sp) {
if (sp.hasOwnProperty(k)) list.push(k);
}
list.filter(n => n !=='default').sort().forEach(function(sk) {
let row = DOC.createElement('div'),
load = DOC.createElement('button'),
edit = DOC.createElement('button'),
xprt = DOC.createElement('button'),
del = DOC.createElement('button'),
name = sk;
load.setAttribute('load', sk);
load.onclick = (ev) => {
api.conf.load(undefined, sk);
updateProcessList();
hideModal();
}
load.appendChild(DOC.createTextNode(sk));
if (sk == settings.proc().processName) {
load.setAttribute('class', 'selected')
}
api.ui.settingsName.value = settings.proc().processName;
del.setAttribute('del', sk);
del.setAttribute('title', "remove '"+sk+"'");
del.innerHTML = '<i class="far fa-trash-alt"></i>';
del.onclick = deleteSettings;
edit.setAttribute('name', sk);
edit.setAttribute('title', 'edit');
edit.innerHTML = '<i class="far fa-edit"></i>';
edit.onclick = editSettings;
xprt.setAttribute('name', sk);
xprt.setAttribute('title', 'export');
xprt.innerHTML = '<i class="fas fa-download"></i>';
xprt.onclick = exportSettings;
row.setAttribute("class", "flow-row");
row.appendChild(edit);
row.appendChild(load);
row.appendChild(xprt);
row.appendChild(del);
table.appendChild(row);
});
}
function showHelp() {
showHelpFile(`local`,() => {});
}
function showHelpFile(local,then) {
if (!local) {
WIN.open("//docs.grid.space/", "_help");
return;
}
const LANG = api.language.current;
$('kiri-version').innerHTML = `${LANG.version} ${version}`;
showModal('help');
api.event.emit('help.show', local);
}
function showLocal() {
showModal('local');
api.probe.local((err,data) => {
let devc = 0;
let bind = [];
let html = ['<table>'];
html.push(`<thead><tr><th>device</th><th>type</th><th>status</th><th></th></tr></thead>`);
html.push(`<tbody>`);
let recs = [];
for (let k in data) {
recs.push(data[k].stat);
}
recs.sort((a,b) => {
return a.device.name < b.device.name ? -1 : 1;
});
for (let r of recs) {
bind.push({uuid: r.device.uuid, host: r.device.addr[0], port: r.device.port});
html.push(`<tr>`);
html.push(`<td>${r.device.name}</td>`);
html.push(`<td>${r.device.mode}</td>`);
html.push(`<td>${r.state}</td>`);
html.push(`<td><button id="${r.device.uuid}">admin</button></td>`);
html.push(`</tr>`);
devc++;
}
html.push(`</tbody>`);
html.push(`</table>`);
if (devc) {
$('mod-local').innerHTML = html.join('');
} else {
$('mod-local').innerHTML = `<br><b>no local devices</b>`;
}
bind.forEach(rec => {
$(rec.uuid).onclick = () => {
window.open(`http://${rec.host}:${rec.port||4080}/`);
};
});
});
}
function setViewMode(mode) {
const isCAM = settings.mode() === 'CAM';
viewMode = mode;
platform.deselect();
selection.update_info();
// clear any bounds forced by, for example, WireEDM previews
api.platform.set_bounds();
// disable clear in non-arrange modes
['view-arrange','act-slice','act-preview','act-animate'].forEach(el => {
$(el).classList.remove('selected')
});
$('render-tools').classList.add('hide');
switch (mode) {
case VIEWS.ARRANGE:
$('view-arrange').classList.add('selected');
$('render-tools').classList.remove('hide');
api.function.clear_progress();
api.client.clear();
STACKS.clear();
hideSlider();
updateSpeeds();
setVisibleLayer();
setWidgetVisibility(true);
api.widgets.opacity(1);
api.view.edges(api.local.getBoolean('model.edges'));
break;
case VIEWS.SLICE:
$('act-slice').classList.add('selected');
updateSpeeds();
updateSliderMax();
setWidgetVisibility(true);
!isCAM && api.view.edges(false);
break;
case VIEWS.PREVIEW:
$('act-preview').classList.add('selected');
setWidgetVisibility(true);
!isCAM && api.view.edges(false);
break;
case VIEWS.ANIMATE:
$('act-animate').classList.add('selected');
!isCAM && api.view.edges(false);
break;
default:
console.log("invalid view mode: "+mode);
return;
}
api.event.emit('view.set', mode);
DOC.activeElement.blur();
}
function getMode() {
return settings.mode();
}
function getModeLower() {
return getMode().toLowerCase();
}
function switchMode(mode) {
setMode(mode, null, platform.update_size);
}
function setMode(mode, lock, then) {
if (!MODES[mode]) {
console.log("invalid mode: "+mode);
mode = 'FDM';
}
const current = settings.get();
// change mode constants
current.mode = mode;
MODE = MODES[mode];
// gcode edit area for any non-SLA mode
api.uc.setVisible($('gcode-edit'), mode !== 'SLA');
// highlight selected mode menu item
["FDM","CAM","SLA","LASER","DRAG","WJET","WEDM"].forEach(sm => {
const cl = $(`mode-${sm.toLowerCase()}`).classList;
if (sm === mode) {
cl.add('selected');
} else {
cl.remove('selected');
}
});
// restore cached device profile for this mode
if (current.cdev[mode]) {
current.device = clone(current.cdev[mode]);
api.event.emit('device.select', api.device.get());
}
// hide/show
api.uc.setVisible($('set-tools'), mode === 'CAM');
// updates right-hand menu by enabling/disabling fields
setViewMode(VIEWS.ARRANGE);
api.uc.setMode(MODE);
// sanitize and persist settings
api.conf.load();
api.conf.save();
// other housekeeping
triggerSettingsEvent();
platform.update_selected();
selection.update_bounds(api.widgets.all());
api.conf.update_fields();
// because device dialog, if showing, needs to be updated
if (modalShowing()) {
api.show.devices();
}
api.space.restore(null, true);
api.event.emit("mode.set", mode);
if (then) {
then();
}
}
function currentProcessName() {
return settings.get().cproc[getMode()];
}
function currentProcessCode() {
return settings.get().sproc[getMode()][currentProcessName()];
}
function setControlsVisible(show) {
// TODO fix
// $('mid-left').style.display = show ? 'flex' : 'none';
// $('mid-right').style.display = show ? 'flex' : 'none';
}
function downloadBlob(data, filename) {
let url = WIN.URL.createObjectURL(new Blob([data], {type: "octet/stream"}));
$('mod-any').innerHTML = `<a id="_dexport_" href="${url}" download="${filename}">x</a>`;
$('_dexport_').click();
}
// prevent safari from exiting full screen mode
DOC.onkeydown = function (evt) { if (evt.keyCode == 27) evt.preventDefault() }
export { FILES as catalog, LOCAL, SETUP, SECURE };

View file

@ -1,17 +1,6 @@
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
/**
* adapted from
* http://codeincomplete.com/posts/2011/5/7/bin_packing/
*/
gapp.register("kiri.pack", [], (root, exports) => {
const { kiri } = root;
class Packer {
export class Packer {
constructor(w, h, spacing, opt = {}) {
this.w = w;
this.h = h;
@ -150,7 +139,3 @@ class Packer {
return node;
}
}
kiri.Pack = Packer;
});

View file

@ -1,26 +1,16 @@
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
import { $, h } from '../../moto/webui.js';
import { api } from './api.js';
import { ajax, js2o } from './utils.js';
import { base } from '../../geo/base.js';
import { load } from '../../load/file.js';
import { space } from '../../moto/space.js';
import { Widget, newWidget } from './widget.js';
import { Packer } from './pack.js';
// dep: moto.space
// dep: moto.webui
// dep: kiri.api
// dep: kiri.consts
// dep: kiri.utils
// dep: kiri.widget
// dep: load.stl
// dep: load.obj
// dep: load.3mf
// dep: load.gbr
// use: kiri-mode.cam.tool
gapp.register("kiri.platform", [], (root, exports) => {
const { base, kiri, moto, load } = root;
const { api, consts, driver, utils, newWidget, Widget } = kiri;
const { ajax, js2o } = utils;
const { space } = moto;
const { util } = base;
const { COLOR, MODES } = consts;
import { COLOR, MODES } from './consts.js';
import { THREE } from '../../ext/three.js';
const V0 = new THREE.Vector3(0,0,0);
@ -525,7 +515,7 @@ function platformDelete(widget, defer) {
api.event.emit('widget.delete', widget);
return;
}
kiri.client.clear(widget);
api.client.clear(widget);
api.widgets.remove(widget);
api.selection.remove(widget);
Widget.Groups.remove(widget);
@ -719,12 +709,12 @@ function platformLayout() {
mp = [sz.x, sz.y],
ms = [mp[0] / 2, mp[1] / 2],
c = Widget.Groups.blocks().sort(),
p = new kiri.Pack(ms[0], ms[1], gap).fit(c);
p = new Packer(ms[0], ms[1], gap).fit(c);
while (!p.packed) {
ms[0] *= 1.1;
ms[1] *= 1.1;
p = new kiri.Pack(ms[0], ms[1], gap).fit(c);
p = new Packer(ms[0], ms[1], gap).fit(c);
}
for (i = 0; i < c.length; i++) {
@ -809,7 +799,7 @@ function platformLoadFiles(files, group) {
if (api.conf.get().controller.devel) {
api.event.emit('cam.parse.gerber', { data: text });
} else {
kiri.client.gerber2mesh(text, progress => {
api.client.gerber2mesh(text, progress => {
api.show.progress(progress, "converting");
}, vertices => {
api.show.progress(0);
@ -847,7 +837,7 @@ function platformLoadFiles(files, group) {
api.function.parse(data.textDecode('utf-8'), 'gcode');
load_dec();
} else if (issvg) {
loadSVGDialog(opt => {
loadSVGDialog(opt => {
group = group || [];
let svg = load.SVG.parse(data.textDecode('utf-8'), opt);
let ind = 0;
@ -921,7 +911,7 @@ function fitDeviceToWidgets() {
}
// extend API (api.platform)
const platform = Object.assign(api.platform, {
export const platform = {
fit: fitDeviceToWidgets,
add: platformAdd,
changed: platformChanged,
@ -950,6 +940,4 @@ const platform = Object.assign(api.platform, {
show_volume: space.platform.showVolume,
top_z() { return topZ },
clear() { api.space.clear(); api.space.save(true) }
});
});
};

View file

@ -1,19 +1,13 @@
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
import { arcToPath } from '../../geo/paths.js';
import { consts } from './consts.js';
import { newPoint } from '../../geo/point.js';
import { util } from '../../geo/base.js';
// dep: geo.base
// dep: geo.point
// dep: geo.polygon
// dep: geo.paths
// dep: kiri.consts
gapp.register("kiri.print", [], (root, evets) => {
const { base, kiri } = self;
const { paths, util, newPoint } = base;
const { arcToPath } = paths;
const { numOrDefault } = util;
const { beltfact } = kiri.consts;
const { beltfact } = consts;
const XAXIS = new THREE.Vector3(1,0,0);
const DEG2RAD = Math.PI / 180;
@ -463,10 +457,10 @@ class Print {
let arcPoints = arcToPath( prevPoint, point, 64,{ clockwise:g2,center}) ?? []
let emit = g2 ? 2 : 3;
// console.log("clone point",structuredClone({point,prevPoint,center,arcPoints,emit}));
// console.log("pointer point",{point,prevPoint,center,arcPoints,emit});
outputPoint(point,prevPoint,emit,{center,arcPoints});
// scope.addOutput(seq, point, emit, pos.F, tool,{center,arcPoints});
}
@ -619,10 +613,15 @@ class Print {
scope.belt = belt;
if (scope.debugE) {
console.log({ bounds, print_time: time.round(2) });
console.log({
bounds,
minf,
maxf,
print_time: time.round(2),
output: scope.output
});
}
console.log(scope.output)
done({ output: scope.output });
}
}
@ -646,8 +645,8 @@ class Output {
const { type, center, arcPoints } = (options ?? {});
//speed, tool, type, center, arcPoints
this.point = point; // point to emit
this.emit = emit; // emit (feed for printers, power for lasers, cut for cam)
this.point = point;
this.emit = Number(emit); //convert bools into 0/1
this.speed = speed;
this.tool = tool;
this.type = type;
@ -680,9 +679,7 @@ function newPrint(settings, widgets, id) {
return new Print(settings, widgets, id);
};
gapp.overlay(kiri, {
export {
Print,
newPrint
});
});
};

View file

@ -1,35 +1,24 @@
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
import { Layers } from './layers.js';
import { newPoint } from '../../geo/point.js';
import { newPolygon } from '../../geo/polygon.js';
import { newSlopeFromAngle } from '../../geo/slope.js';
/*
* uses `layers.js` to convert paths (usually preview) into primordial geometries.
* the input is based on an array (layers) of arrays containing `Output` objects
*/
// dep: geo.base
// dep: geo.point
// dep: geo.polygon
gapp.register("kiri.render", [], (root, exports) => {
const { base, kiri } = root;
const { config, util, newPolygon } = base;
const hsV = 0.9;
const XAXIS = new THREE.Vector3(1,0,0);
const DEG2RAD = Math.PI / 180;
exports({
path,
is_dark,
rate_to_color
});
function worker() {
return self.kiri_worker.current;
}
function is_cam() {
return root.worker.print.settings.mode === 'CAM';
return worker().print.settings.mode === 'CAM';
}
function is_dark() {
return root.worker.print.settings.controller.dark ? true : false;
return worker().print.settings.controller.dark ? true : false;
};
function rate_to_color(rate, max) {
@ -44,17 +33,17 @@ function rate_to_color(rate, max) {
}
};
/**
* Generate visual representation of a gcode program.
* @param {Output[][]} levels - Array of arrays containing `Output` objects.
* @param {function} update - Called with a completion percentage and the rendered layer.
* @param {{tools: Object, flat: Boolean, thin: Boolean, speed: Boolean, lineWidth: Number, toolMode: Boolean, z: Number, action: String, other: String}} [opts] - Optional parameters.
* @returns {Promise.kiri.Layers[]} - Array of layers.
*/
/**
* Generate visual representation of a gcode program.
* @param {Output[][]} levels - Array of arrays containing `Output` objects.
* @param {function} update - Called with a completion percentage and the rendered layer.
* @param {{tools: Object, flat: Boolean, thin: Boolean, speed: Boolean, lineWidth: Number, toolMode: Boolean, z: Number, action: String, other: String}} [opts] - Optional parameters.
* @returns {Promise.kiri.Layers[]} - Array of layers.
*/
async function path(levels, update, opts = {}) {
levels = levels.filter(level => level.length);
if (levels.length === 0) {
self.worker.print.maxSpeed = 0;
worker().print.maxSpeed = 0;
return [];
}
@ -107,10 +96,11 @@ async function path(levels, update, opts = {}) {
// }).reduce((a, v) => Math.max(a, v)) + 1;
// for reporting
self.worker.print.minSpeed = minspd;
self.worker.print.maxSpeed = maxspd;
self.worker.print.thinColor = thin;
self.worker.print.flatColor = flat;
let print = worker().print;
print.minSpeed = minspd;
print.maxSpeed = maxspd;
print.thinColor = thin;
print.flatColor = flat;
let lastTool = null;
let lastEnd = null;
@ -138,7 +128,8 @@ async function path(levels, update, opts = {}) {
const engages = [];
const lasers = [];
const sparks = [];
const output = new kiri.Layers();
const output = new Layers();
layers.push(output);
const pushPrint = (toolid, poly) => {
@ -172,8 +163,8 @@ async function path(levels, update, opts = {}) {
let p2 = new THREE.Vector3(point.x, point.y, point.z)
.applyAxisAngle(XAXIS, point.a * DEG2RAD);
// reconstruct point point for display without A axis
outPoint = base.newPoint(p2.x, p2.y, p2.z);
// let sp = base.newPoint(outPoint.x * 1.1, outPoint.y * 1.1, outPoint.z * 1.1);
outPoint = newPoint(p2.x, p2.y, p2.z);
// let sp = newPoint(outPoint.x * 1.1, outPoint.y * 1.1, outPoint.z * 1.1);
// sparks.push(outPoint, sp);
}
if (out.tool !== lastTool) {
@ -321,8 +312,8 @@ async function path(levels, update, opts = {}) {
.addAreas(heads.map(points => {
const {p1, p2} = points;
const slope = p2.slopeTo(p1);
const s1 = base.newSlopeFromAngle(slope.angle + 20);
const s2 = base.newSlopeFromAngle(slope.angle - 20);
const s1 = newSlopeFromAngle(slope.angle + 20);
const s2 = newSlopeFromAngle(slope.angle - 20);
const p3 = points.p2.projectOnSlope(s1, arrowSize);
const p4 = points.p2.projectOnSlope(s2, arrowSize);
return newPolygon().addPoints([p2,p3,p4]).setZ(p2.z + 0.01);
@ -543,4 +534,14 @@ function color4(rgb, inc, seg) {
}
}
});
export const render = {
path,
is_dark,
rate_to_color
};
export {
path,
is_dark,
rate_to_color
};

View file

@ -1,16 +1,9 @@
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
// dep: moto.space
// dep: kiri.api
// dep: kiri.consts
// dep: kiri.utils
gapp.register("kiri.selection", (root, exports) => {
const { kiri, moto, noop } = self;
const { api, consts, utils } = kiri;
const { space } = moto;
import { api } from './api.js';
import { space } from '../../moto/space.js';
import { THREE } from '../../ext/three.js';
import { tool as MeshTool } from '../../mesh/tool.js';
const selectedMeshes = [];
@ -214,6 +207,39 @@ function merge() {
api.platform.select(w);
}
/**
* Isolates the bodies within the selected widgets. If no widgets are selected,
* it processes all available widgets. For each widget, it checks if a tool is
* associated; if not, it creates a new MeshTool and indexes the vertices.
* The function identifies isolated bodies within each widget. If a widget has
* a single body, it remains selected. Otherwise, it creates new widgets for
* each isolated body and selects them while deleting the original widget.
*/
function isolateBodies(){
let sel = widgets();
console.log('isolate', sel);
if (sel.length === 0) {
sel = api.widgets.all();
}
for(let widget of sel){
if (!widget.tool) {
let tool = widget.tool = new MeshTool();
tool.index(widget.getGeoVertices({ unroll: true, translate:true }));
}
let bodies = widget.tool.isolateBodies()
if(bodies.length ==1){
api.platform.select(widget);
}else{
console.log(bodies,Array.from(bodies.entries()))
for(let [i,verts] of bodies.entries()){
let w = api.platform.load_verts([], verts, `isolate ${i} of ${ widget.anno.file}`);
api.platform.select(w)
}
api.platform.delete(widget);
}
}
}
function exportWidgets(format = "stl") {
let sel = widgets();
if (sel.length === 0) {
@ -296,9 +322,10 @@ function setDisabled(bool) {
}
// extend API (api.selection)
const selection = Object.assign(api.selection, {
export const selection = {
move,
merge,
isolateBodies,
scale,
rotate,
mirror,
@ -320,6 +347,4 @@ const selection = Object.assign(api.selection, {
disable() { setDisabled(true) },
opacity() { api.widgets.opacity(...arguments) },
meshes() { return selectedMeshes.slice() },
});
});
};

View file

@ -1,23 +1,20 @@
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
import { $, h } from '../../moto/webui.js';
import { api } from './api.js';
import { conf } from './conf.js';
import { codec } from './codec.js';
import { consts } from './consts.js';
import { space } from '../../moto/space.js';
import { local } from '../../data/local.js';
import { utils } from './utils.js';
import { version } from '../../moto/license.js';
import { JSZip } from '../../ext/jszip-esm.js';
// dep: kiri.api
// dep: kiri.conf
// dep: kiri.utils
// dep: moto.space
// dep: data.local
// use: kiri.widgets
// use: ext.base64
gapp.register("kiri.settings", (root, exports) => {
const { data, kiri, moto, noop } = self;
const { api, conf, consts, utils } = kiri;
const { space } = moto;
const { local } = data;
const { clone } = Object;
const { areEqual, ls2o, js2o } = utils;
const { COLOR } = consts;
const { clone } = Object;
const localFilterKey ='kiri-gcode-filters';
const localFilters = js2o(local.getItem(localFilterKey)) || [];
@ -225,7 +222,7 @@ function updateSettingsFromFields(setrec, uirec = api.ui, changes) {
}
// given a settings region, update values of matching bound UI fields
function updateFieldsFromSettings(setrec, uirec = api.ui, trace) {
function updateFieldsFromSettings(setrec, uirec = api.ui, opt = {}) {
if (!setrec) {
updateFieldsFromSettings(settings.device);
updateFieldsFromSettings(settings.process);
@ -233,6 +230,9 @@ function updateFieldsFromSettings(setrec, uirec = api.ui, trace) {
updateExtruderFields(settings.device);
return;
}
if (opt.trace) {
console.log({ setrec, uirec });
}
for (let key in setrec) {
if (!setrec.hasOwnProperty(key)) {
continue;
@ -242,6 +242,9 @@ function updateFieldsFromSettings(setrec, uirec = api.ui, trace) {
continue;
}
let uie = uirec[key], typ = uie ? uie.type : null;
if (opt.trace) {
console.log({ key, uie, typ, val });
}
if (typ === 'text') {
if (uie.setv) {
uie.setv(val);
@ -275,6 +278,8 @@ function updateFieldsFromSettings(setrec, uirec = api.ui, trace) {
} else {
uie.value = '';
}
} else if (opt.trace) {
console.log('skipped', { key, val, typ });
}
}
}
@ -506,7 +511,7 @@ function settingsExport(opts = {}) {
const widgets = api.widgets.all();
const note = opts.node || undefined;
const shot = opts.work || opts.screen ? space.screenshot() : undefined;
const work = opts.work ? kiri.codec.encode(widgets,{_json_:true}) : undefined;
const work = opts.work ? codec.encode(widgets,{_json_:true}) : undefined;
const view = opts.work ? space.view.save() : undefined;
const setn = Object.clone(settings);
// stuff in legacy annotations for re-import
@ -515,7 +520,7 @@ function settingsExport(opts = {}) {
}
const xprt = {
settings: setn,
version: kiri.version,
version: version,
screen: shot,
space: space.info,
note: note,
@ -600,7 +605,7 @@ function settingsImport(data, ask) {
work.type = 100;
}
}
kiri.codec.decode(data.work).forEach(widget => {
codec.decode(data.work).forEach(widget => {
api.platform.add(widget, 0, true, true);
});
if (data.view) {
@ -655,7 +660,7 @@ function settingsImportUrl(url, ask) {
function settingsImportZip(data, ask) {
let alert = api.show.alert("Importing Workspace");
JSZip.loadAsync(data).then(zip => {
new JSZip().loadAsync(data).then(zip => {
for (let [key,value] of Object.entries(zip.files)) {
if (key === "workspace.json") {
value.async("string").then(json => {
@ -760,9 +765,14 @@ function setEnableWASM(bool) {
api.event.emit("set.assembly", bool);
}
// extend API (api.conf)
Object.assign(api.conf, {
dbo: () => { return ls2o('ws-settings') },
// merged api for backward compatibility
const apiSet = {
dbo() { return ls2o('ws-settings') },
dev() { return settings.device },
proc() { return settings.process },
ctrl() { return settings.controller },
mode() { return settings.mode },
prof() { return settings.sproc[settings.mode] },
get: getSettings,
put: putSettings,
load: loadSettings,
@ -777,25 +787,26 @@ Object.assign(api.conf, {
restore: restoreSettings,
export: settingsExport,
import: settingsImport,
});
// extend API (api.settings)
Object.assign(api.settings, {
get: getSettings,
import: settingsImport,
import_zip: settingsImportZip,
import_url: settingsImportUrl,
import_prusa: settingsPrusaConvert,
dev() { return settings.device },
proc() { return settings.process },
ctrl() { return settings.controller },
mode() { return settings.mode },
prof() { return settings.sproc[settings.mode] },
sync: {
async get() {},
async put() {},
status: false
}
});
};
});
// for backward compatibility
apiSet.conf = apiSet;
apiSet.set = apiSet;
apiSet.settings = apiSet;
export default apiSet;
// for backward compatibility
export {
apiSet as conf,
apiSet as set,
apiSet as settings
};

View file

@ -1,14 +1,8 @@
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
// dep: geo.base
// dep: geo.polygons
gapp.register("kiri.slice", [], (root, exports) => {
const { base, kiri } = root;
const POLY = base.polygons;
import { Layers } from './layers.js';
import { newPoint } from '../../geo/point.js';
import { polygons as POLY } from '../../geo/polygons.js';
let tracker;
@ -41,7 +35,7 @@ class Slice {
*/
output() {
if (this.layers) return this.layers;
let layers = this.layers = new kiri.Layers();
let layers = this.layers = new Layers();
if (tracker) {
layers.setRotation(-tracker.rotation || 0);
}
@ -150,7 +144,7 @@ class Slice {
} else {
// create top object from object bundle passed back by slicePost()
let top = new Top(data.poly);
top.thin_fill = data.thin_fill ? data.thin_fill.map(p => base.newPoint(p.x,p.y,p.z)) : undefined;
top.thin_fill = data.thin_fill ? data.thin_fill.map(p => newPoint(p.x,p.y,p.z)) : undefined;
top.fill_lines = data.fill_lines;
top.fill_sparse = data.fill_sparse;
top.fill_off = data.fill_off;
@ -251,12 +245,10 @@ function newSlice(z, view) {
return new Slice(z, view);
}
gapp.overlay(kiri, {
export {
Top,
Slice,
newTop,
newSlice,
setSliceTracker
});
});
};

View file

@ -1,15 +1,9 @@
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
gapp.register("kiri.stack", [], (root, exports) => {
const { kiri } = root;
/*
* converts `layers.js` output data structures into three.js meshes for display
*/
class Stack {
export class Stack {
constructor(view, freeMem, shiny) {
this._view = view;
this.view = view.newGroup();
@ -245,8 +239,6 @@ class Stack {
}
}
kiri.Stack = Stack;
let shininess = 15,
specular = 0x444444,
emissive = 0x101010,
@ -301,5 +293,3 @@ function createLambertMaterial(color, flat) {
side: flat ? THREE.DoubleSide : THREE.FrontSide
});
}
});

View file

@ -1,13 +1,8 @@
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
// dep: kiri.stack
// use: kiri.api
// use: kiri.ui
gapp.register("kiri.stacks", [], (root, exports) => {
const { kiri } = root;
import { $ } from '../../moto/webui.js';
import { api } from './api.js';
import { Stack } from './stack.js';
let freeMem = true,
stacks = {},
@ -18,7 +13,7 @@ let freeMem = true,
function init() {
labels = $("layers");
API = kiri.api,
API = api,
UC = API.uc,
UI = API.ui;
}
@ -80,7 +75,7 @@ function create(name, view) {
}
const stack = stacks[name] = {
layers: [ ],
obj: new kiri.Stack(view, freeMem, kiri.api.conf.get().controller.shiny),
obj: new Stack(view, freeMem, api.conf.get().controller.shiny),
add: function(layers) {
let lmap = layers.layers;
let map = stack.obj.addLayers(layers);
@ -93,9 +88,9 @@ function create(name, view) {
mat.visible = ctrl.toggle.checked;
});
if (ctrl.toggle.checked) {
kiri.api.event.emit("stack.show", label);
api.event.emit("stack.show", label);
} else {
kiri.api.event.emit("stack.hide", label)
api.event.emit("stack.hide", label)
}
})
};
@ -155,7 +150,7 @@ function setFraction(frac) {
});
}
kiri.stacks = {
export default {
clear,
create,
rotate,
@ -170,4 +165,17 @@ kiri.stacks = {
setFreeMem
};
});
export {
clear,
create,
rotate,
remove,
getStack,
getStacks,
getRange,
setRange,
getLabels,
setVisible,
setFraction,
setFreeMem
};

View file

@ -1,20 +1,12 @@
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
// dep: moto.broker
// dep: kiri.api
// dep: kiri.utils
gapp.register("kiri.stats", [], (root, exports) => {
const { data, kiri, gapp } = root;
const { broker } = gapp;
const { api, utils } = kiri;
const { js2o, o2js } = utils;
import { local } from '../../data/local.js';
import { broker } from '../../moto/broker.js';
import { js2o, o2js } from './utils.js';
class Stats {
constructor(db) {
this.db = db || data.local;
this.db = db || local;
this.obj = js2o(this.db['stats'] || '{}');
let o = this.obj, k;
for (k in o) {
@ -56,6 +48,6 @@ class Stats {
}
}
kiri.stats = new Stats();
export const stats = new Stats();
});
export { stats as Stats };

View file

@ -1,12 +1,10 @@
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
// dep: add.three
// dep: kiri.api
gapp.register("kiri.tools", (root, exports) => {
import { api } from './api.js';
import { THREE } from '../../ext/three.js';
const { Vector3, Quaternion } = THREE;
const { kiri, moto } = root;
const { api } = kiri;
const XAXIS = new THREE.Vector3(1,0,0);
const ZAXIS = new THREE.Vector3(0,0,1);
@ -164,4 +162,5 @@ api.event.on('mouse.hover.up', (ev) => {
endIt();
});
});
export { onLayFlatSelect, onFaceUpSelect, startIt, endIt, cleanup, scale, onDone };

865
src/kiri/core/ui.js Normal file
View file

@ -0,0 +1,865 @@
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
import { $ } from '../../moto/webui.js';
import { api } from './api.js';
let DOC = self.document,
inputAction = null,
lastAddTo = null,
lastGroup = null,
lastDiv = null,
addTo = null,
bindTo = null,
groups = {},
groupSticky = false,
groupName = undefined,
heads = {}, // hideable group heads (clickable label)
hidden = {}, // hidden groups (by name)
hasModes = [],
setters = [],
lastMode = null,
lastExpert = true,
prefix = "tab",
units = 1,
lastChange = null,
lastBtn = null,
lastTxt = null,
lastPop = null;
export const UI = {
prefix: function(pre) { prefix = pre; return UI },
inputAction: function(fn) { inputAction = fn; return UI },
lastChange: function() { return lastChange },
checkpoint,
restore,
refresh,
setHidden,
setMode,
bound,
toInt,
toFloat,
toDegsFloat,
isSticky,
setSticky,
newBoolean,
newButton,
newBlank,
newDiv,
newElement,
newExpand,
endExpand,
newGCode,
newGroup,
newLabel,
newInput,
newValue,
newRange,
newRow,
newSelect,
newText,
setGroup,
addUnits,
setUnits,
confirm,
prompt,
alert,
onBlur,
setEnabled(el, bool) {
if (bool) {
el.removeAttribute('disabled');
} else {
el.setAttribute('disabled','');
}
},
setVisible(el, bool) {
UI.setClass(el, 'hide', !bool);
},
setClass(el, clazz, bool) {
if (bool) {
el.classList.add(clazz);
} else {
el.classList.remove(clazz);
}
}
};
function setHidden(map) {
hidden = map;
refresh();
for (let ctrl of Object.values(heads)) {
ctrl.update();
}
}
function onBlur(obj, fn) {
if (Array.isArray(obj)) {
for (let o of obj) onBlur(o, fn);
return;
}
obj.addEventListener('blur', fn);
}
function alert(message) {
return confirm(message, {ok:true});
}
function prompt(message, value) {
return confirm(message, {ok:true, cancel:undefined}, value);
}
function confirm(message, buttons, input, opt = {}) {
return new Promise((resolve, reject) => {
let { feature } = api;
let onkey_save = feature.on_key;
feature.on_key = key => {
// console.log({ eat_key: key });
return true;
};
let dialog = $('dialog');
let btns = buttons || {
"yes": true,
"no": false
};
let rnd = Date.now().toString(36);
let html = [
`<div class="confirm f-col a-stretch" style="padding:5px !important">`
];
if (message) {
html.push(`<label style="user-select:text">${message}</label>`);
}
if (opt.pre) {
html = opt.pre.appendAll(html);
}
let iid;
if (Array.isArray(input)) {
iid = `confirm-input-${rnd}`;
html.append(`<div><textarea rows="15" cols="40" class="grow" type="text" spellcheck="false" id="${iid}"></textarea></div>`);
} else if (input !== undefined) {
iid = `confirm-input-${rnd}`;
html.append(`<div><input class="grow" type="text" spellcheck="false" id="${iid}"/></div>`);
}
html.append(`<div class="f-row j-end">`);
Object.entries(btns).forEach((row,i) => {
html.append(`<button id="confirm-${i}-${rnd}">${row[0]}</button>`);
});
html.append(`</div></div>`);
if (opt.post) {
html.appendAll(opt.post);
}
dialog.innerHTML = html.join('');
function done(value) {
dialog.close();
feature.on_key = onkey_save;
if (value !== undefined) {
setTimeout(() => { resolve(value) }, 150);
}
}
if (iid) {
let array = Array.isArray(input);
iid = $(iid);
iid.value = array ? input.join('\n') : input;
if (!array)
iid.onkeypress = (ev) => {
if (ev.key === 'Enter' || ev.charCode === 13) {
done(ev.target.value);
}
};
}
Object.entries(btns).forEach((row,i) => {
$(`confirm-${i}-${rnd}`).onclick = (ev) => {
let value = iid && row[1] ? iid.value : row[1];
ev.preventDefault();
ev.stopPropagation();
done(value);
}
});
setTimeout(() => {
dialog.showModal();
if (iid) {
iid.focus();
iid.selectionStart = 0;
iid.selectionEnd = iid.value.length;
}
}, 150);
});
}
function refresh() {
setMode(lastMode);
setters.forEach(input => {
if (input.setv) {
input.setv(input.real);
}
});
}
function setMode(mode) {
lastMode = mode;
hasModes.forEach(div => div.setMode(mode));
}
function checkpoint(at) {
return { addTo: at || addTo, lastDiv: at || lastDiv, lastGroup, groupName };
}
function restore(opt = {}) {
addTo = opt.addTo || addTo;
bindTo = opt.bindTo || null;
lastDiv = opt.lastDiv || lastDiv;
lastGroup = opt.lastGroup || lastGroup;
groupName = opt.groupName || groupName;
}
// at present only used by the layers popup menu
function setGroup(div) {
addTo = lastDiv = div;
groupName = undefined;
lastGroup = [];
return div;
}
function newElement(type, opt = {}) {
let el = DOC.createElement(type);
if (opt.id) {
el.setAttribute("id", opt.id);
}
if (opt.class) {
for (let cl of opt.class.split(' ')) {
el.classList.add(cl);
}
}
if (opt.attr) {
for (let [key, val] of Object.entries(opt.attr)) {
el.setAttribute(key, val);
}
}
return el;
}
function newGroup(label, div, opt = {}) {
lastDiv = div = (div || lastDiv);
let group = opt.group || label,
row = DOC.createElement('div'),
dbkey = `beta-${prefix}-show-${group}`,
link;
if (opt.class) {
opt.class.split(' ').forEach(ce => {
row.classList.add(ce);
});
} else {
row.setAttribute("class", "set-header");
}
if (div && opt.driven) {
addModeControls(div, opt);
}
addTo = lastDiv;
div.appendChild(row);
if (label) {
link = DOC.createElement('a');
link.appendChild(DOC.createTextNode(label));
row.appendChild(link);
}
addModeControls(row, opt);
lastGroup = groups[group] = [];
lastGroup.key = dbkey;
groupName = group;
if (opt.hideable) {
let pad = DOC.createElement('i');
let arr = DOC.createElement('span');
pad.setAttribute('class','grow');
row.appendChild(pad);
row.appendChild(arr);
const ctrl = heads[group] = {
row,
arr,
update() {
if (!hidden[group]) {
arr.innerHTML = '<i class="fa-solid fa-caret-down"></i>';
row.classList.add('hidden');
} else {
arr.innerHTML = '<i class="fa-solid fa-caret-up"></i>';
row.classList.remove('hidden');
}
}
};
row.onclick = () => {
hidden[group] = !hidden[group];
refresh();
ctrl.update();
};
}
return row;
}
function addCollapsableElement(parent, options = {}) {
let row = newDiv(options);
if (parent) parent.appendChild(row);
if (lastGroup) lastGroup.push(row);
return row;
}
function bound(low,high) {
return function(v) {
if (isNaN(v)) return low;
return v < low ? low : v > high ? high : v;
};
}
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;
if (this.setv) {
return this.real = Math.round(nv * units);
};
return nv;
}
function toFloat() {
let nv = this.value !== '' ? parseFloat(this.value) : null;
if (nv !== null && this.bound) nv = this.bound(nv);
if (this.setv) {
return this.setv(nv * units);
} else {
this.value = nv;
}
return nv;
}
function toDegsFloat(){
let nv = this.value !== '' ? parseFloat(this.value) : null;
if (nv !== null && this.bound) nv = this.bound(nv);
nv = (nv+360)% 360; // bound the val to 0-359.99
if (this.setv) {
return this.setv(nv);
} else {
this.value = nv;
}
return nv;
}
function raw() {
return this.value !== '' ? this.value : null;
}
function setUnits(v) {
if (v !== units) {
units = v;
refresh();
}
}
function newLabel(text, opt = {}) {
let label = DOC.createElement('label');
label.appendChild(DOC.createTextNode(text));
label.setAttribute("class", "noselect");
if (opt.class) opt.class.split(' ').forEach(cl => {
label.classList.add(cl);
})
return label;
}
function newValue(size = 6, opt = {}) {
let value = DOC.createElement('input');
value.setAttribute("size", size);
value.setAttribute("readonly", '');
value.setAttribute("class", "nooutline noselect");
if (opt.class) opt.class.split(' ').forEach(cl => {
value.classList.add(cl);
})
return value;
}
function addId(el, opt = {}) {
if (opt.id) {
el.setAttribute("id", opt.id);
}
}
function safecall(fn) {
try {
return fn();
} catch (e) {
// console.log({ safecall_error: e });
return false;
}
}
function addModeControls(el, opt = {}) {
el.__opt = opt;
el.showMe = function() {
if (opt.trace) console.log({ showMe: el });
el.classList.remove('hide');
};
el.hideMe = function() {
if (opt.trace) console.log({ hideMe: el });
el.classList.add('hide');
};
el.setVisible = function(show) {
if (opt.trace) console.log({ setVisible: show });
if (show) el.showMe();
else el.hideMe();
};
el.setMode = function(mode) {
let hidn = hidden[el._group] === true;
let xprt = opt.expert === undefined || (opt.expert === lastExpert);
let show = opt.show ? safecall(opt.show) : true;
let disp = opt.visible ? opt.visible() : true;
let hmod = el.hasMode(mode);
if (opt.trace) console.log({ setMode: mode, xprt, show, disp, hmod, modes:el.modes });
if (opt.manual) return;
el.setVisible(!hidn && hmod && show && xprt && disp);
}
el.hasMode = function(mode) {
return (el.modes.length === 0) ||
(el.modes.contains && el.modes.contains(mode)) ||
(el.modes === mode);
}
el.modes = opt.modes || [];
hasModes.push(el);
}
function newDiv(opt = {}) {
let div = DOC.createElement(opt.tag || 'div');
addModeControls(div, opt);
(opt.addto || addTo).appendChild(div);
if (opt.addto) lastDiv = addTo = div;
if (opt.class) div.setAttribute('class', opt.class);
if (opt.group !== false) {
lastGroup?.push(div);
div._group = groupName;
} else {
lastGroup = undefined;
groupName = undefined;
}
return div;
}
function newExpand(label, opt = {}, opteach = {}) {
let div = DOC.createElement('details');
div.setAttribute('class', opt.class || 'f-col');
addModeControls(div, opt);
let summary = DOC.createElement('summary');
summary.setAttribute('class', opt.class || 'var-row');
summary.innerHTML = `<label>${label}</label>`;
div.appendChild( summary );
div.collapse = () => {
div.removeAttribute('open');
};
lastAddTo = addTo;
addTo.appendChild(div);
addTo = div;
return div;
}
function endExpand() {
addTo = lastAddTo;
return addTo;
}
function isSticky() {
return groupSticky;
}
function setSticky(bool) {
groupSticky = bool;
}
function newGCode(label, options) {
let opt = options || {},
btn = DOC.createElement("button"),
txt = DOC.createElement("textarea"),
area = opt.area;
txt.setAttribute("wrap", "off");
txt.setAttribute("spellcheck", "false");
txt.setAttribute("style", "resize: none");
txt.onblur = bindTo || inputAction;
txt.button = btn;
btn.setAttribute("class", "basis-50");
btn.appendChild(DOC.createTextNode(label));
btn.setAttribute("title", opt.title || undefined);
btn.onclick = function(ev) {
ev.stopPropagation();
if (ev.target === txt) {
// drop clicks on TextArea
ev.target.focus();
} else {
let fc = area.firstChild;
if (fc) area.removeChild(fc);
area.appendChild(txt);
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);
});
let showing = btn === lastBtn;
if (lastTxt) {
lastTxt.classList.remove('txt-sel');
}
if (lastBtn) {
lastBtn.classList.remove('btn-sel');
}
if (!showing) {
btn.classList.add('btn-sel');
lastTxt = btn;
lastBtn = btn;
txt.focus();
} else {
inputAction();
}
}
};
addModeControls(btn, opt);
return txt;
}
function newText(label, options) {
let opt = options || {},
inline = opt.row,
row = inline ? lastDiv : newDiv(options),
btn = DOC.createElement("button"),
pop = DOC.createElement("div"),
txt = DOC.createElement("textarea"),
area = opt.area;
txt.setAttribute("wrap", "off");
txt.setAttribute("spellcheck", "false");
txt.setAttribute("style", "resize: none");
txt.onblur = inputAction;
btn.appendChild(DOC.createTextNode(inline ? label : "edit"));
btn.onclick = function(ev) {
ev.stopPropagation();
if (ev.target === txt) {
// drop clicks on TextArea
ev.target.focus();
} else {
let fc = area.firstChild;
if (fc) area.removeChild(fc);
area.appendChild(txt);
// first time, button click / show
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);
});
let showing = pop === lastPop;
if (lastBtn) {
lastBtn.classList.remove('btn-sel');
}
if (lastTxt) {
lastTxt.classList.remove('txt-sel');
}
if (!showing) {
row.classList.add('txt-sel');
pop.style.display = "flex";
lastPop = pop;
lastTxt = row;
txt.focus();
} else {
inputAction();
}
}
};
addModeControls(btn, opt);
addId(btn, opt);
if (!inline) {
row.appendChild(newLabel(label));
row.setAttribute("class", "var-row");
}
row.appendChild(btn);
if (opt.title) row.setAttribute("title", options.title);
if (row.setVisible) {
btn.setVisible = row.setVisible;
}
return txt;
}
function newInput(label, opt = {}) {
let row = newDiv(opt),
hide = opt.hide,
size = opt.size || 5,
height = opt.height || 0,
ip = height > 1 ? DOC.createElement('textarea') : DOC.createElement('input'),
action = opt.action || bindTo || inputAction;
row.appendChild(newLabel(label));
row.appendChild(ip);
row.setAttribute("class", opt.class || "var-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");
ip.setAttribute("spellcheck", "false");
row.style.display = hide ? 'none' : '';
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) {
setSticky(true);
});
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) {
ip.blur();
}
});
ip.addEventListener('blur', function(event) {
setSticky(false);
lastChange = ip;
action(event);
if (opt.trigger) {
refresh(opt.trigger === 1 || opt.trigger === true);
}
});
if (opt.units) {
addUnits(ip, opt.round || 3);
}
}
if (!ip.convert) ip.convert = raw.bind(ip);
ip.setVisible = row.setVisible;
return ip;
}
function addUnits(input, round) {
setters.push(input);
input.setv = function(value) {
if (typeof(value) === 'number') {
input.real = value;
input.value = (value / units).round(round);
} else {
input.value = value;
}
// console.log({ value }, input.real, input.value );
return input.real;
};
return input;
}
function newRange(label, options) {
let row = newDiv(options),
ip = DOC.createElement('input'),
hide = options && options.hide,
action = bindTo || inputAction;
if (label) row.appendChild(newLabel(label));
row.appendChild(ip);
row.setAttribute("class", "var-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 = bindTo || inputAction;
row.appendChild(newLabel(label));
row.appendChild(ip);
if (Array.isArray(source)) {
ip._source = source;
} else {
row.setAttribute("source", source || "tools");
}
row.setAttribute("class", "var-row");
row.style.display = hide ? 'none' : '';
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.setVisible = row.setVisible;
ip.onchange = function(ev) {
lastChange = ip;
action();
if (options.trigger) {
refresh();
}
};
ip.onclick = (ev) => {
groupSticky = true;
};
// because firefox
ip.onmouseenter = (ev) => {
groupSticky = true;
};
return ip;
}
function newBoolean(label, action = bindTo, opt = {}) {
let row = newDiv(opt),
ip = DOC.createElement('input'),
hide = opt.hide;
if (label) {
row.appendChild(newLabel(label));
}
row.appendChild(ip);
row.setAttribute("class", "var-row");
row.style.display = hide ? 'none' : '';
ip.setAttribute("type", "checkbox");
ip.checked = false;
if (opt.disabled) {
ip.setAttribute("disabled", "true");
}
if (opt.title) {
ip.setAttribute("title", opt.title);
row.setAttribute("title", opt.title);
}
if (action) {
ip.onclick = function(ev) {
action(ip);
if (opt.trigger) {
refresh();
}
};
}
ip.setVisible = row.setVisible;
return ip;
}
function newBlank(options) {
let opt = options || {},
row = newDiv(opt),
hide = opt.hide;
row.isBlank = true;
row.style.display = hide ? 'none' : '';
if (!opt.driven) {
row.setAttribute("class", "var-row");
}
if (opt.class) {
opt.class.split(' ').forEach(ce => {
row.classList.add(ce);
});
}
return row;
}
// unlike other elements, does not auto-add to a row
function newButton(label, action, opt = {}) {
let b = DOC.createElement('button');
b.onclick = function() {
switch (typeof action) {
case "string":
api.event.emit(action);
break;
case "function":
action(...arguments);
break;
}
};
if (opt.class) {
opt.class.split(' ').forEach(ce => {
b.classList.add(ce);
});
}
if (opt.icon) {
let d = DOC.createElement('div');
d.innerHTML = opt.icon;
b.appendChild(d);
}
if (opt.title) {
b.setAttribute('title', opt.title);
}
if (label) {
b.appendChild(DOC.createTextNode(label));
}
addModeControls(b, opt);
addId(b, opt);
return b;
}
function newRow(children, options) {
let row = addCollapsableElement((options && options.noadd) ? null : addTo);
if (children) children.forEach(function (c) { row.appendChild(c) });
addModeControls(row, options);
if (options && options.class) {
options.class.split(' ').forEach(ce => {
row.classList.add(ce);
});
}
return row;
}

View file

@ -1,8 +1,7 @@
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
gapp.register("kiri.utils", [], (root, exports) => {
import { ajax as moto_ajax } from '../../moto/ajax.js';
import { local as dataLocal } from '../../data/local.js';
function parseOpt(ov) {
let opt = {}, kv, kva;
@ -28,7 +27,7 @@ function encodeOpt(opt) {
}
function ajax(url, fn, rt, po, hd) {
return moto.ajax.new(fn, rt).request(url, po, hd);
return moto_ajax.new(fn, rt).request(url, po, hd);
}
function o2js(o,def) {
@ -46,7 +45,7 @@ function js2o(s,def) {
function ls2o(key,def) {
// defer ref b/c it may run in a worker
return js2o(root.data.local.getItem(key),def);
return js2o(dataLocal.getItem(key),def);
}
// split 24 bit color into [ r, g, b ]
@ -99,11 +98,14 @@ function trackFn(fn, name) {
}
}
exports({
function noop() {}
export {
trackFn,
areEqual,
parseOpt,
encodeOpt,
noop,
ajax,
o2js,
js2o,
@ -111,6 +113,19 @@ exports({
avgc,
rgb,
a2c
});
};
});
export let utils = {
trackFn,
areEqual,
parseOpt,
encodeOpt,
noop,
ajax,
o2js,
js2o,
ls2o,
avgc,
rgb,
a2c
};

View file

@ -1,23 +1,11 @@
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
// dep: geo.base
// dep: geo.point
// dep: geo.points
// dep: geo.polygons
// dep: kiri.utils
// use: kiri.codec
// use: mesh.util
gapp.register("kiri.widget", [], (root, exports) => {
const { base, kiri } = root;
const { api, driver, utils } = kiri;
const { util, polygons } = base;
const { Mesh, newPoint, verticesToPoints } = base;
const { inRange, time } = util;
const { avgc, trackFn } = utils;
import { base } from '../../geo/base.js';
import { avgc } from './utils.js';
import { verticesToPoints } from '../../geo/points.js';
import { util as mesh_util } from '../../mesh/util.js';
const { inRange, time } = base.util;
const solid_opacity = 1.0;
const groups = [];
@ -28,12 +16,14 @@ let nextId = 0;
function newWidget(id,group) { return new Widget(id,group) }
function catalog() { return kiri.catalog }
function catalog() { return self.kiri_catalog };
function index() { return catalog().index }
function index() { return self.kiri_catalog.index }
class Widget {
constructor(id, group) {
this.api = self.kiri_api;
this.id = id || Date.now().toString(36)+(nextId++);
this.grouped = group ? true : false;
this.group = group || [];
@ -347,7 +337,7 @@ class Widget {
}
selectFaces(faces) {
let groups = mesh.util.facesToGroups(faces || []);
let groups = mesh_util.facesToGroups(faces || []);
let geo = this.mesh.geometry;
geo.clearGroups();
for (let group of groups) {
@ -503,8 +493,8 @@ class Widget {
w._move(x, y, z, abs);
});
// allow for use in engine / cli
if ((x || y || z) && api && api.event) {
api.event.emit('widget.move', {widget: this, pos: {x, y, z}, abs});
if ((x || y || z) && this.api && this.api.event) {
this.api.event.emit('widget.move', {widget: this, pos: {x, y, z}, abs});
}
}
@ -555,8 +545,8 @@ class Widget {
w._scale(x, y, z);
});
this.center(false);
if (api && api.event) {
api.event.emit('widget.scale', {widget: this, x, y, z});
if (this.api && this.api.event) {
this.api.event.emit('widget.scale', {widget: this, x, y, z});
}
}
@ -586,8 +576,8 @@ class Widget {
if (this.outline) {
this.setEdges(true);
}
if ((x || y || z) && api && api.event) {
api.event.emit('widget.rotate', {widget: this, x, y, z});
if ((x || y || z) && this.api && this.api.event) {
this.api.event.emit('widget.rotate', {widget: this, x, y, z});
}
}
@ -630,8 +620,8 @@ class Widget {
w._mirror();
});
this.center();
if (api && api.event) {
api.event.emit('widget.mirror', {widget: this});
if (this.api && this.api.event) {
this.api.event.emit('widget.mirror', {widget: this});
}
}
@ -758,113 +748,21 @@ class Widget {
return this;
}
/**
* processes points into facets, then into slices
*
* once upon a time there were multiple slicers. this was the fastest in most cases.
* lines are added to all the buckets they cross. then buckets are processed in order.
* buckets are contiguous ranges of z slicers. the advantage of this method is that
* as long as a large percentage of lines do not cross large z distances, this reduces
* the number of lines each slice has to consider thus improving speed.
*
* @params {Object} settings
* @params {Function} [ondone]
* @params {Function} [onupdate]
*/
slice(settings, ondone, onupdate) {
let widget = this;
let startTime = time();
widget.settings = settings;
widget.clearSlices();
onupdate(0.0001, "slicing");
if (kiri.client && !widget.inWorker) {
// store slicing visuals
widget.stack = kiri.stacks.create(widget.id, widget.mesh);
// compensate for zcut (widget moved through floor)
widget.stack.obj.view.position.z = widget.track.zcut || 0;
// in case result of slice is nothing, do not preserve previous
widget.slices = []
// executed from kiri.js
kiri.client.slice(settings, this, function(reply) {
if (reply.alert) {
onupdate(null, null, reply.alert);
}
if (reply.update) {
onupdate(reply.update, reply.updateStatus);
}
if (reply.send_start) {
widget.xfer = {start: reply.send_start};
}
if (reply.stats) {
widget.stats = reply.stats;
}
if (reply.send_end) {
widget.stats.load_time = widget.xfer.start - reply.send_end;
}
if (reply.slice) {
widget.slices.push(kiri.codec.decode(reply.slice, {mesh:widget.mesh}));
}
if (reply.done) {
ondone(true);
}
if (reply.error) {
ondone(false, reply.error);
}
});
}
if (kiri.server) {
// executed from kiri-worker.js
let catchdone = function(error) {
if (error) {
return ondone(error);
}
onupdate(1.0, "transfer");
widget.stats.slice_time = time() - startTime;
ondone();
};
let catchupdate = function(progress, message, alert) {
onupdate(progress, message, alert);
};
let drv = driver[settings.mode.toUpperCase()];
if (drv) {
let promise = drv.slice(settings, widget, catchupdate, catchdone);
if (promise) promise.catch(error => ondone(error));
} else {
console.log('invalid mode: '+settings.mode);
ondone('invalid mode: '+settings.mode);
}
}
// discard point cache
widget.points = undefined;
}
/**
* render to provided stack
*/
render(stack) {
const mark = Date.now();
if (this.slices)
this.slices.forEach(slice => {
for (let slice of this.slices || []) {
if (slice.layers) {
stack.add(slice.layers);
}
});
}
return Date.now() - mark;
}
setEdges(set) {
if (!(api && api.conf)) {
if (!(this.api && this.api.conf)) {
// missing api features in engine mode
return;
}
@ -878,8 +776,8 @@ class Widget {
}
if (set) {
let dark = api.space.is_dark();
let angle = api.conf.get().controller.edgeangle || 20;
let dark = this.api.space.is_dark();
let angle = this.api.conf.get().controller.edgeangle || 20;
let edges = new THREE.EdgesGeometry(mesh.geometry, angle);
let material = new THREE.LineBasicMaterial({ color: 0 });
this.outline = new THREE.LineSegments(edges, material);
@ -889,7 +787,7 @@ class Widget {
}
setWireframe(set, color, opacity) {
if (!(api && api.conf)) {
if (!(this.api && this.api.conf)) {
// missing api features in engine mode
return;
}
@ -901,7 +799,7 @@ class Widget {
this.wire = null;
}
if (set) {
let dark = api.space.is_dark();
let dark = this.api.space.is_dark();
let mat = new THREE.MeshBasicMaterial({
wireframe: true,
color: dark ? 0xaaaaaa : 0,
@ -911,7 +809,7 @@ class Widget {
let wire = widget.wire = new THREE.Mesh(mesh.geometry.shallowClone(), mat);
mesh.add(wire);
}
if (api.view.is_arrange()) {
if (this.api.view.is_arrange()) {
this.setColor(this.color);
} else {
this.setColor(0x888888,undefined,false);
@ -1066,7 +964,4 @@ Widget.deleteFromState = function(id,ondone) {
index().remove('ws-save-'+id, ondone);
};
kiri.Widget = Widget;
kiri.newWidget = newWidget;
});
export { Widget, newWidget };

View file

@ -1,14 +1,9 @@
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
// use: load.file
// use: kiri.selection
// use: kiri.platform
gapp.register("kiri.widgets", (root, exports) => {
const { data, kiri, moto, noop } = root;
const { api, consts, utils, newWidget, Widget } = kiri;
import { $ } from '../../moto/webui.js';
import { api } from './api.js';
import { load } from '../../load/file.js';
import { Widget, newWidget } from './widget.js';
let WIDGETS = [];
@ -36,7 +31,7 @@ function rename(sel) {
return;
}
let widget = widgets[0];
kiri.ui.prompt("new widget name", widget.meta.file || "no name").then(newname => {
api.uc.prompt("new widget name", widget.meta.file || "no name").then(newname => {
if (newname) {
widget.meta.file = newname;
api.platform.changed();
@ -89,7 +84,7 @@ function meshes() {
function opacity(value) {
api.widgets.each(w => w.setOpacity(value));
moto.space.update();
api.space.update();
}
function setIndexed(value) {
@ -101,7 +96,7 @@ function setAxisIndex(value) {
}
// extend API (api.widgets)
const widgets = Object.assign(api.widgets, {
export const widgets = {
load: Widget.loadFromCatalog,
new: newWidget,
map,
@ -120,6 +115,4 @@ const widgets = Object.assign(api.widgets, {
each(fn) { WIDGETS.slice().forEach(widget => fn(widget)) },
for(fn) { widgets.each(fn) },
forid(id) { return WIDGETS.filter(w => w.id === id)[0] }
});
});
};

View file

@ -0,0 +1,22 @@
{
"file-ext": "nc",
"token-space": " ",
"strip-comments": true,
"pre":[
"G21 ; set units to MM (required)",
"G90 ; absolute position mode (required)"
],
"post":[
"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
}
}

View file

@ -0,0 +1,24 @@
{
"file-ext": "ngc",
"token-space": " ",
"strip-comments": true,
"pre":[
"G21 ; set units to MM (required)",
"G90 ; absolute position mode (required)",
"M03 S20000 ; spindle on"
],
"post":[
"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
}
}

View file

@ -0,0 +1,22 @@
{
"file-ext": "nc",
"token-space": " ",
"strip-comments": true,
"pre":[
"G21 ; set units to MM (required)",
"G90 ; absolute position mode (required)"
],
"post":[
"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
}
}

View file

@ -0,0 +1,22 @@
{
"file-ext": "nc",
"token-space": " ",
"strip-comments": true,
"pre":[
"G21 ; set units to MM (required)",
"G90 ; absolute position mode (required)"
],
"post":[
"M30 ; program end"
],
"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
}
}

View file

@ -0,0 +1,22 @@
{
"file-ext": "nc",
"token-space": " ",
"strip-comments": true,
"pre":[
"G21 ; set units to MM (required)",
"G90 ; absolute position mode (required)"
],
"post":[
"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
}
}

View file

@ -0,0 +1,22 @@
{
"file-ext": "nc",
"token-space": " ",
"strip-comments": true,
"pre":[
"G21 ; set units to MM (required)",
"G90 ; absolute position mode (required)"
],
"post":[
"M30 ; program end"
],
"tool-change":[
"M6 T{tool} ; change tool to '{tool_name}'"
],
"dwell":[
"G4 P{time} ; dwell for {time}ms"
],
"settings": {
"bed_width": 830,
"bed_depth": 400
}
}

View file

@ -0,0 +1,22 @@
{
"file-ext": "nc",
"token-space": " ",
"strip-comments": true,
"pre":[
"G21 ; set units to MM (required)",
"G90 ; absolute position mode (required)"
],
"post":[
"M30 ; program end"
],
"tool-change":[
"M6 T{tool} ; change tool to '{tool_name}'"
],
"dwell":[
"G4 P{time} ; dwell for {time}ms"
],
"settings": {
"bed_width": 830,
"bed_depth": 830
}
}

View file

@ -0,0 +1,24 @@
{
"file-ext": "nc",
"token-space": " ",
"strip-comments": true,
"pre":[
"G21 ; set units to MM (required)",
"G90 ; absolute position mode (required)"
],
"post":[
"M5 ; spindle off",
"M30 ; program end"
],
"dwell":[
"G4 P{time} ; dwell for {time}ms"
],
"spindle": [
"M3 S{speed}"
],
"settings": {
"bed_width": 300,
"bed_depth": 180,
"spindle_max": 1000
}
}

View file

@ -0,0 +1,24 @@
{
"file-ext": "nc",
"token-space": " ",
"strip-comments": true,
"pre":[
"G21 ; set units to MM (required)",
"G90 ; absolute position mode (required)"
],
"post":[
"M5 ; spindle off",
"M30 ; program end"
],
"dwell":[
"G4 P{time} ; dwell for {time}ms"
],
"spindle": [
"M3 S{speed}"
],
"settings": {
"bed_width": 400,
"bed_depth": 300,
"spindle_max": 1000
}
}

View file

@ -0,0 +1,24 @@
{
"file-ext": "nc",
"token-space": " ",
"strip-comments": true,
"pre":[
"G21 ; set units to MM (required)",
"G90 ; absolute position mode (required)"
],
"post":[
"M30 ; program end"
],
"tool-change":[
"M6 T{tool} ; change tool to '{tool_name}'"
],
"dwell":[
"G4 P{time} ; dwell for {time}ms"
],
"settings": {
"origin_center": false,
"spindle_max": 12000,
"bed_width": 290,
"bed_depth": 200
}
}

View file

@ -0,0 +1,22 @@
{
"file-ext": "nc",
"token-space": " ",
"strip-comments": true,
"pre":[
"G21 ; set units to MM (required)",
"G90 ; absolute position mode (required)"
],
"post":[
"M30 ; program end"
],
"tool-change":[
"M6 T{tool} ; change tool to '{tool_name}'"
],
"dwell":[
"G4 P{time} ; dwell for {time}ms"
],
"settings": {
"bed_width": 1000,
"bed_depth": 1000
}
}

View file

@ -0,0 +1,22 @@
{
"file-ext": "nc",
"token-space": " ",
"strip-comments": true,
"pre":[
"G21 ; set units to MM (required)",
"G90 ; absolute position mode (required)"
],
"post":[
"M30 ; program end"
],
"tool-change":[
"M6 T{tool} ; change tool to '{tool_name}'"
],
"dwell":[
"G4 P{time} ; dwell for {time}ms"
],
"settings": {
"bed_width": 500,
"bed_depth": 500
}
}

View file

@ -0,0 +1,32 @@
{
"mode": "CAM",
"internal": 0,
"bedHeight": 2.5,
"bedWidth": 500,
"bedDepth": 500,
"maxHeight": 150,
"originCenter": false,
"spindleMax": 8000,
"gcodePre": [
"G21 ; set units to MM (required)",
"G90 ; absolute position mode (required)",
"M03 S20000 ; spindle on"
],
"gcodePost": [
"M05 ; spindle off",
"M30 ; program end"
],
"gcodeDwell": [
"G4 P{time} ; dwell for {time}ms"
],
"gcodeSpindle": [],
"gcodeChange": [],
"gcodeFExt": "nc",
"gcodeSpace": true,
"gcodeStrip": true,
"new": false,
"deviceName": "Langmuir MR-1",
"imageURL": "",
"useLaser": false,
"profiles": []
}

View file

@ -0,0 +1,179 @@
{
"mode": "CAM",
"internal": 0,
"bedHeight": 2.5,
"bedWidth": 360,
"bedDepth": 240,
"originCenter": false,
"spindleMax": 20000,
"gcodePre": [
"G21 ; set units to MM (required)",
"G90 ; absolute position mode (required)",
"G0 F2000 ; default rapid move speed",
"G1 F1000 ; default cutting speed"
],
"gcodePost": [
"M5 ; spindle off",
"G0 F4000 ; default rapid move speed",
"G1 F1000 ; default cutting speed",
"M30 ; program end"
],
"gcodeDwell": [
"G4 P{time} ; dwell for {time}ms"
],
"gcodeSpindle": [
"M3 S{spindle}"
],
"gcodeChange": [
"M6 T{tool} ; change tool to '{tool_name}'"
],
"gcodeFExt": "nc",
"gcodeSpace": true,
"gcodeStrip": false,
"new": false,
"deviceName": "My Makera Carvera",
"maxHeight": 150,
"useLaser": true,
"imageURL": "",
"bedBelt": false,
"bedRound": false,
"fwRetract": false,
"profiles": [
{
"processName": "default",
"camLevelTool": 1000,
"camLevelSpindle": 1000,
"camLevelOver": 0,
"camLevelSpeed": 1000,
"camLevelDown": 0,
"camRoughTool": 1666284436865,
"camRoughSpindle": 20000,
"camRoughDown": 3,
"camRoughOver": 0.25,
"camRoughSpeed": 1000,
"camRoughPlunge": 250,
"camRoughStock": 0,
"camRoughVoid": false,
"camRoughFlat": false,
"camRoughTop": false,
"camRoughIn": false,
"camRoughOn": true,
"camOutlineTool": 1665437735549,
"camOutlineSpindle": 0,
"camOutlineDown": 1,
"camOutlineOver": 0.4,
"camOutlineSpeed": 2000,
"camOutlinePlunge": 500,
"camOutlineWide": false,
"camOutlineDogbone": false,
"camOutlineOmitThru": false,
"camOutlineOut": false,
"camOutlineIn": false,
"camOutlineOn": true,
"camContourTool": 1666284436865,
"camContourSpindle": 20000,
"camContourOver": 0.15,
"camContourSpeed": 1500,
"camContourAngle": 85,
"camContourCurves": true,
"camContourIn": false,
"camContourXOn": true,
"camContourYOn": true,
"camTraceTool": 1002,
"camTraceSpindle": 1000,
"camTraceType": "clear",
"camTraceOver": 0.5,
"camTraceDown": 1,
"camTraceSpeed": 750,
"camTracePlunge": 200,
"camTraceLines": false,
"camDrillTool": 1000,
"camDrillSpindle": 1000,
"camDrillDownSpeed": 250,
"camDrillDown": 2,
"camDrillDwell": 250,
"camDrillLift": 2,
"camDrillingOn": false,
"camRegisterSpeed": 1000,
"camFlipAxis": "X",
"camFlipOther": "",
"camTabsWidth": 20,
"camTabsHeight": 5,
"camTabsDepth": 10,
"camTabsMidline": false,
"camDepthFirst": true,
"camEaseDown": false,
"camOriginTop": true,
"camZAnchor": "middle",
"camZOffset": 0,
"camZBottom": 0,
"camZClearance": 1,
"camZThru": 0,
"camFastFeed": 3000,
"camFastFeedZ": 500,
"camTolerance": 0,
"camStockX": 0,
"camStockY": 0,
"camStockZ": 0,
"camStockOffset": true,
"camStockClipTo": false,
"camStockOn": true,
"camConventional": false,
"camOriginCenter": false,
"outputInvertX": false,
"outputInvertY": false,
"camExpertFast": false,
"ops": [],
"op2": [
{
"type": "flip",
"axis": "X",
"invert": true,
"disabled": false
}
],
"camTrueShadow": false,
"camDrillMark": true,
"camPocketSpindle": 10000,
"camPocketTool": 1001,
"camPocketOver": 0.25,
"camPocketDown": 5,
"camPocketSpeed": 2000,
"camPocketPlunge": 500,
"camPocketExpand": 0,
"camContourBottom": false,
"camTraceBottom": false,
"cmaPocketOutline": false,
"camRegisterThru": 5,
"camFlatness": 0.001,
"camContourBridge": 10,
"camForceZMax": false,
"camPocketSmooth": 1,
"camPocketContour": true,
"cmaPocketRefine": 20,
"camPocketEngrave": false,
"camLaserEnable": [
"M321"
],
"camLaserDisable": "M322",
"camLaserOn": [
"M3"
],
"camLaserOff": [
"M5"
],
"camLaserSpeed": 100,
"camLaserPower": 1,
"camLaserAdaptive": true,
"camLaserAdaptMod": true,
"camLaserFlatten": false,
"camLaserFlatZ": 0,
"camLaserPowerMin": 1,
"camLaserPowerMax": 0.1,
"camLaserZMin": 0,
"camLaserZMax": 0,
"camOutlineTop": false,
"X": "X"
}
]
}

View file

@ -0,0 +1,30 @@
{
"file-ext": "nc",
"token-space": " ",
"strip-comments": true,
"pre":[
"G21 ; set units to MM (required)",
"G90 ; absolute position mode (required)"
],
"post":[
"M5 ; spindle off",
"M9 ; coolant off",
"M30 ; program end"
],
"tool-change":[
"M6 T{tool} ; change tool to '{tool_name}'"
],
"dwell":[
"G4 P{time} ; dwell for {time}ms"
],
"spindle":[
"M3 S{speed}"
],
"settings": {
"origin_center":false,
"bed_width": 950,
"bed_depth": 600,
"build_height": 180,
"spindle_max": 24000
}
}

View file

@ -0,0 +1,30 @@
{
"file-ext": "nc",
"token-space": " ",
"strip-comments": false,
"pre":[
"G21 ; set units to MM (required)",
"G90 ; absolute position mode (required)",
"G94 ; set unit to mm/minute",
"G0 F3000 ; default rapid move speed",
"; M3 S15000 ; Uncomment if you want to turn the spindle on by default"
],
"post":[
"M5 ; spindle off",
"M30 ; program end"
],
"tool-change":[
"M6 T{tool} ; change tool to '{tool_name}'"
],
"dwell":[
"G4 P{time} ; dwell for {time}ms"
],
"spindle":[
"M3 S{speed}"
],
"settings": {
"bed_width": 744,
"bed_depth": 750,
"build_height": 90
}
}

View file

@ -0,0 +1,22 @@
{
"file-ext": "rml",
"token-space": "",
"strip-comments": true,
"pre":[
"PA;PA;VS4;!VZ4;!PZ0,80;!MC1;"
],
"post":[
"PA;PA;!PZ0,2420;PU0,6096;!MC0;"
],
"dwell":[
"W{time};"
],
"spindle": [
"!RC{speed};"
],
"settings": {
"bed_width": 400,
"bed_depth": 305,
"spindle_max": 10000
}
}

View file

@ -0,0 +1,45 @@
{
"mode": "CAM",
"internal": 0,
"bedHeight": 2.5,
"bedWidth": 2400,
"bedDepth": 1200,
"maxHeight": 150,
"originCenter": false,
"spindleMax": 0,
"gcodePre": [
"'UNITS:MM",
"'",
"CN, 90 'Set program to absolute coordinate mode",
"&Tool =1 'Tool number to change to",
"C9 'Change tool",
"TR,4000 'Set spindle RPM",
"C6 'Spindle on",
"PAUSE 2",
"'"
],
"gcodePost": [
"'Turning router OFF",
"C7",
"END",
"'",
"UNIT_ERROR:",
"CN, 91 'Run file explaining unit error",
"END"
],
"gcodeDwell": [
"G4 P{time} ; dwell for {time}ms"
],
"gcodeSpindle": [],
"gcodeChange": [
"M6 T{tool} ; change tool to '{tool_name}'"
],
"gcodeFExt": ".sbp",
"gcodeSpace": true,
"gcodeStrip": true,
"new": false,
"deviceName": "ShopBot.Basic",
"imageURL": "",
"useLaser": false,
"profiles": []
}

View file

@ -0,0 +1,30 @@
{
"file-ext": "nc",
"token-space": " ",
"strip-comments": false,
"pre":[
"G21 ; set units to MM (required)",
"G90 ; absolute position mode (required)",
"G0 F15000 ; default rapid move speed",
"G1 F4000 ; default cutting speed"
],
"post":[
"M5 ; spindle off",
"M9 ; coolant off",
"M30 ; program end"
],
"tool-change":[
"M6 T{tool} ; change tool to '{tool_name}'"
],
"dwell":[
"G4 P{time} ; dwell for {time}ms"
],
"spindle":[
"M3 S{speed}"
],
"settings": {
"bed_width": 1260,
"bed_depth": 1248,
"build_height": 170
}
}

View file

@ -0,0 +1,27 @@
{
"file-ext": "nc",
"token-space": " ",
"strip-comments": false,
"pre":[
"G21 ; set units to MM (required)",
"G90 ; absolute position mode (required)",
"G0 F5500 ; default rapid move speed",
"G1 F2000 ; default cutting speed"
],
"post":[
"M5 ; spindle off",
"M9 ; coolant 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": 810,
"bed_depth": 855,
"build_height": 120
}
}

View file

@ -0,0 +1,30 @@
{
"file-ext": "nc",
"token-space": " ",
"strip-comments": false,
"pre":[
"G21 ; set units to MM (required)",
"G90 ; absolute position mode (required)",
"G0 F4000 ; default rapid move speed",
"G1 F1500 ; default cutting speed"
],
"post":[
"M5 ; spindle off",
"M9 ; coolant off",
"M30 ; program end"
],
"tool-change":[
"M6 T{tool} ; change tool to '{tool_name}'"
],
"dwell":[
"G4 P{time} ; dwell for {time}ms"
],
"settings": {
"image_url": "/decal/longmill.png",
"image_scale": 200,
"image_anchor": 8,
"bed_width": 770,
"bed_depth": 820,
"build_height": 110
}
}

View file

@ -0,0 +1,27 @@
{
"file-ext": "nc",
"token-space": " ",
"strip-comments": false,
"pre":[
"G21 ; set units to MM (required)",
"G90 ; absolute position mode (required)",
"G0 F1800 ; default rapid move speed",
"G1 F800 ; default cutting speed"
],
"post":[
"M5 ; spindle off",
"M9 ; coolant 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": 235,
"bed_depth": 185,
"build_height": 100
}
}

View file

@ -0,0 +1,27 @@
{
"file-ext": "gcode",
"token-space": " ",
"strip-comments": true,
"pre":[
"G21 ; set units to MM (required)",
"G90 ; absolute position mode (required)"
],
"post":[
"M5 ; complete moves, stop spindle",
"M30 ; program end"
],
"tool-change":[],
"dwell":[
"G4 P{time} ; dwell for {time}ms"
],
"spindle":[
"M3 P{spindle} ; uniquely uses percentage not RPM"
],
"settings": {
"origin_center": false,
"bed_width": 90,
"bed_depth": 90,
"build_height": 50,
"spindle_max": 100
}
}

View file

@ -0,0 +1,22 @@
{
"file-ext": "ncd",
"token-space": " ",
"strip-comments": true,
"pre":[
"G21 ; set units to MM (required)",
"G90 ; absolute position mode (required)"
],
"post":[
"M30 ; program end"
],
"tool-change":[
"M6 T{tool} ; change tool to '{tool_name}'"
],
"dwell":[
"G4 P{time} ; dwell for {time}ms"
],
"settings": {
"bed_width": 250,
"bed_depth": 300
}
}

View file

@ -0,0 +1,32 @@
{
"file-ext": "nc",
"token-space": " ",
"strip-comments": false,
"pre":[
"G20 ; set units to inches (required)",
"G90 ; absolute position mode (required)"
],
"post":[
"M05 ; spindle off",
"M30 ; program end"
],
"tool-change":[
"M05 ; spindle off",
"M6 T{tool} ; change tool to '{tool_name}'",
"G37; get tool offset with ETS"
],
"spindle": [
"M3 S{speed} ; spindle on at {spindle} rpm"
],
"dwell":[
"G4 P{time} ; dwell for {time}ms"
],
"settings": {
"origin_center":false,
"bed_width": 678.18,
"bed_depth": 1524,
"build_height":150,
"spindle_max": 24000
},
"deviceName": "Tormach 24R with ETS"
}

View file

@ -0,0 +1,24 @@
{
"file-ext":"nc",
"token-space":" ",
"strip-comments":true,
"pre":[
"G21 ; set units to MM (required)",
"G90 ; absolute position mode (required)"
],
"post":[
"M30 ; program end"
],
"tool-change":[
"M6 T{tool} ; change tool to '{tool_name}'"
],
"dwell":[
"G4 P{time} ; dwell for {time}ms"
],
"settings":{
"origin_center":false,
"bed_width":1220,
"bed_depth":2400,
"build_height":80
}
}

View file

@ -0,0 +1,24 @@
{
"file-ext":"nc",
"token-space":" ",
"strip-comments":true,
"pre":[
"G21 ; set units to MM (required)",
"G90 ; absolute position mode (required)"
],
"post":[
"M30 ; program end"
],
"tool-change":[
"M6 T{tool} ; change tool to '{tool_name}'"
],
"dwell":[
"G4 P{time} ; dwell for {time}ms"
],
"settings":{
"origin_center":false,
"bed_width":450,
"bed_depth":330,
"build_height":81
}
}

View file

@ -0,0 +1,21 @@
{
"file-ext": "gcode",
"token-space": " ",
"pre":[
"G21 ; set units to MM (required)",
"G90 ; absolute position mode (required)"
],
"post":[
"M30 ; program end"
],
"laser-on":[
"M106 S{power}"
],
"laser-off":[
"M107"
],
"settings": {
"bed_width": 300,
"bed_depth": 300
}
}

View file

@ -0,0 +1,46 @@
{
"pre":[
"M104 S{temp} T{tool} ; set extruder temperature",
"M140 S{bed_temp} T{tool} ; set bed temperature",
"G90 ; set absolute positioning mode",
"M83 ; set relative positioning for extruder",
"M107 ; turn off filament cooling fan",
"G28 ; home axes",
"G92 X0 Y0 Z0 E0 ; reset all axes positions",
"G1 X0 Y0 Z0.25 F180 ; move xy to 0,0 and z 0.25mm over bed",
"G92 E0 ; zero the extruded",
"M190 S{bed_temp} T{tool} ; wait for bed to reach target temp",
"M109 S{temp} T{tool} ; wait for extruder to reach target temp",
"G1 E15 F200 ; purge 15mm from extruder",
"G92 E0 ; zero the extruded",
"G1 F225 ; set feed speed"
],
"post":[
"M107 ; turn off filament cooling fan",
"M104 S0 T{tool} ; turn off right extruder",
"M140 S0 T{tool} ; turn off bed",
"G1 Z{z_max} F1200 ; drop bed",
"G28 X0 Y0 ; home XY axes",
"M84 ; disable stepper motors"
],
"extruders":[
{
"nozzle": 0.4,
"filament": 1.75,
"offset_x": 0,
"offset_y": 0
},{
"nozzle": 0.4,
"filament": 1.75,
"offset_x": 30,
"offset_y": 0
}
],
"cmd":{
"fan_power": "M106 S{fan_speed}"
},
"settings":{
"origin_center": false,
"extrude_abs": false
}
}

View file

@ -0,0 +1,46 @@
{
"pre":[
"M104 S{temp} T{tool} ; set extruder temperature",
"M140 S{bed_temp} T{tool} ; set bed temperature",
"G90 ; set absolute positioning mode",
"M83 ; set relative positioning for extruder",
"M107 ; turn off filament cooling fan",
"G28 ; home axes",
"G92 X0 Y0 Z0 E0 ; reset all axes positions",
"G1 X0 Y0 Z0.25 F180 ; move xy to 0,0 and z 0.25mm over bed",
"G92 E0 ; zero the extruded",
"M190 S{bed_temp} T{tool} ; wait for bed to reach target temp",
"M109 S{temp} T{tool} ; wait for extruder to reach target temp",
"G1 E15 F200 ; purge 15mm from extruder",
"G92 E0 ; zero the extruded",
"G1 F225 ; set feed speed"
],
"post":[
"M107 ; turn off filament cooling fan",
"M104 S0 T{tool} ; turn off right extruder",
"M140 S0 T{tool} ; turn off bed",
"G1 Z{z_max} F1200 ; drop bed",
"G28 X0 Y0 ; home XY axes",
"M84 ; disable stepper motors"
],
"extruders":[
{
"nozzle": 0.4,
"filament": 1.75,
"offset_x": 0,
"offset_y": 0
},{
"nozzle": 0.4,
"filament": 1.75,
"offset_x": 30,
"offset_y": 0
}
],
"cmd":{
"fan_power": "M106 S{fan_speed}"
},
"settings":{
"origin_center": false,
"extrude_abs": false
}
}

View file

@ -0,0 +1,55 @@
{
"pre":[
"M107 ; turn off fan",
"M140 S{bed_temp} T{tool}",
"M105 ; update temperature",
"M190 S{bed_temp} T{tool}",
"M104 S{temp} T{tool}",
"M105 ; update temperature",
"M109 S{temp} T{tool}",
"G21 ; set metric values",
"G91 ; relative positioning",
"G1 F1000 Z5 ; lift 5mm before homing",
"G90 ; set absolute positioning",
"M82 ; set extruder to absolute mode",
"G28 X0 Y0 ; home X & Y",
"G28 Z0 ; home Z",
"G1 Z15 F1000 ; move the platform down 15mm",
"G1 F4000 ; set default feed rate",
"G92 E0 ; zero extruder",
";G5 ; uncomment to enable resume after power failure",
"M117 Printing..."
],
"post":[
"M107 ; turn off fan",
"M104 S0 T{tool} ; turn off extruder",
"M140 S0 T{tool} ; turn off bed",
"G92 E0 ; zero extruder",
"G91 ; relative positioning",
"G1 E-2 F300 ; retract filament",
"G1 Z0.5 E-5 ; retract filament, move z up",
"G90 ; absolute positioning",
"G1 X0 Y400 ; move to best position for part removal",
"M82 ; absolute extrusion mode",
"M84 ; disable stepper motors"
],
"extruders":[
{
"nozzle": 0.4,
"filament": 1.75,
"offset_x": 0,
"offset_y": 0
}
],
"cmd":{
"fan_power": "M106 S{fan_speed}"
},
"settings":{
"origin_center": false,
"extrude_abs": true,
"bed_circle": false,
"bed_width": 400,
"bed_depth": 400,
"build_height": 450
}
}

View file

@ -0,0 +1,184 @@
{
"mode": "FDM",
"internal": 0,
"bedHeight": 2.5,
"bedWidth": 200,
"bedDepth": 200,
"bedRound": false,
"bedBelt": false,
"maxHeight": 250,
"originCenter": false,
"gcodeFan": [
"M106 S{fan_speed}"
],
"gcodeTrack": [
"M117 {progress}% layer {layer} / {layers}"
],
"gcodeLayer": [],
"gcodePre": [
"M201 X2500 Y2500 Z800 E2500 ; sets maximum accelerations, mm/sec^2",
"M203 X250 Y250 Z8 E80 ; sets maximum feedrates, mm / sec",
"M204 P2500 R2500 T2500 ; sets acceleration (P, T) and retract acceleration (R), mm/sec^2",
"M205 X8.00 Y8.00 Z0.40 E8.00 ; sets the jerk limits, mm/sec",
"M205 S0 T0 ; sets the minimum extruding and travel feed rate, mm/sec",
"M107 ; fan off",
"M190 S{bed_temp} ; set bed temperature and wait for it to be reached",
"M104 S{temp} ; set temperature",
"M109 S{temp} ; set temperature and wait for it to be reached",
"G21 ; set units to millimeters",
"G90 ; use absolute coordinates",
"M82 ; use absolute distances for extrusion",
"G92 E0",
"G28 ; home all axes\\nG1 Z5 F5000 ; lift nozzle\\n",
"G1 Z0.24 ; lift nozzle a bit ",
"G92 E0 ; zero the extruded length ",
"G1 X5 Y0 F3000",
"G1 X50 Y0 E60 F500 ; Extrude 25mm of filament in a 5cm line. ",
"G92 E0 ; zero the extruded length again ",
"G1 E-4.5 F4800 ; Retract a little ",
"G92 E0",
"G1 X120 F4000 ; Quickly wipe away from the filament line`"
],
"gcodePost": [
"M104 S0 ; Extruder off ",
"M140 S0 ; Heatbed off ",
"M107 ; Fan off ",
"G91 ; relative positioning ",
"G1 E-2 F3000 ",
"G1 Z+0.3 F3000 ; lift print head ",
"G28 X0 F3000",
"M84 ; disable stepper motors",
"M117 Cooling down...",
"M104 S0 ; turn off extruder",
"M107 ; Fan off",
"M84 ; disable motors",
"G91 ; relative positioning",
"G1 E-1 F300 ; retract the filament a bit before lifting the nozzle, to release some of the pressure",
"G1 Z+0.5 E-5 ;X-20 Y-20 F240 ; move Z up a bit and retract filament even more",
"G28 X0 ; move X to min endstops, so the head is out of the way",
"G90 ; Absolute positionning",
"G1 Y200 F3000 ; Present print",
"M84 ; steppers off",
"M300 P300 S4000",
"M117 Finished."
],
"gcodeProc": "",
"gcodeFExt": "gcode",
"extruders": [
{
"extFilament": 1.75,
"extNozzle": 0.4,
"extOffsetX": 0,
"extOffsetY": 0
}
],
"deviceName": "Anycubic Kobra 2",
"fwRetract": false,
"extras": {
"palette": {
"printer": "6c99ea036da",
"ping": null,
"feed": null,
"push": null,
"offset": null,
"heat": null,
"cool": null,
"press": null
}
},
"new": false,
"imageURL": "",
"filamentSource": "direct",
"deviceZMax": 0,
"gcodeTime": 1,
"gcodeFeature": [],
"profiles": [
{
"processName": "default",
"sliceHeight": 0.25,
"sliceShells": 3,
"sliceShellOrder": "in-out",
"sliceLayerStart": "last",
"sliceLayerStartX": 0,
"sliceLayerStartY": 0,
"sliceLineWidth": 0,
"sliceFillGrow": 0,
"sliceFillAngle": 45,
"sliceFillWidth": 1,
"sliceFillOverlap": 0.35,
"sliceFillSparse": 0.25,
"sliceFillRepeat": 1,
"sliceFillRate": 0,
"sliceSolidRate": 0,
"sliceFillType": "hex",
"sliceSupportDensity": 0.1,
"sliceSupportOffset": 1,
"sliceSupportGap": 1,
"sliceSupportSize": 5,
"sliceSupportArea": 0.1,
"sliceSupportSpan": 5,
"sliceSupportGrow": 0,
"sliceSupportExtra": 0,
"sliceSupportAngle": 50,
"sliceSupportNozzle": 0,
"sliceSupportEnable": false,
"sliceSupportOutline": true,
"sliceSolidMinArea": 1,
"sliceBottomLayers": 3,
"sliceTopLayers": 3,
"firstSliceHeight": 0.25,
"firstLayerRate": 30,
"firstLayerFillRate": 35,
"firstLayerPrintMult": 1,
"firstLayerLineMult": 1,
"firstLayerYOffset": 0,
"firstLayerNozzleTemp": 0,
"firstLayerBedTemp": 0,
"firstLayerBrim": 0,
"firstLayerBrimIn": 0,
"firstLayerBrimTrig": 0,
"firstLayerBrimGap": 0,
"firstLayerBeltLead": 3,
"firstLayerBeltBump": 0,
"firstLayerFanSpeed": 0,
"firstLayerFlatten": 0,
"outputRaft": false,
"outputRaftSpacing": 0.2,
"outputDraftShield": false,
"outputTemp": 200,
"outputBedTemp": 60,
"outputFeedrate": 50,
"outputFinishrate": 50,
"outputSeekrate": 80,
"outputShellMult": 1.25,
"outputFillMult": 1.25,
"outputSparseMult": 1.25,
"outputFanLayer": 1,
"outputFanSpeed": 255,
"outputRetractDist": 1.5,
"outputRetractSpeed": 40,
"outputRetractWipe": 0,
"outputRetractDwell": 20,
"outputBrimCount": 2,
"outputBrimOffset": 2,
"outputShortPoly": 100,
"outputMinSpeed": 10,
"outputCoastDist": 0,
"outputPurgeTower": 0,
"outputBeltFirst": false,
"outputAvoidGaps": true,
"outputAlternating": false,
"outputLayerRetract": false,
"outputLoops": 0,
"outputInvertX": false,
"outputInvertY": false,
"sliceDetectThin": "off",
"sliceMinHeight": 0,
"sliceAdaptive": false,
"zHopDistance": 0.2,
"arcTolerance": 0,
"antiBacklash": 1,
"ranges": []
}
]
}

View file

@ -0,0 +1,79 @@
{
"noclone": false,
"mode": "FDM",
"internal": 0,
"bedHeight": 2.5,
"bedWidth": 222,
"bedDepth": 222,
"bedRound": false,
"bedBelt": false,
"resolutionX": 1600,
"resolutionY": 900,
"maxHeight": 222,
"originCenter": false,
"extrudeAbs": false,
"gcodeFan": [
"M106 S{fan_speed}"
],
"gcodeTrack": [
"M117 {progress}% layer {layer} / {layers}"
],
"gcodeLayer": [],
"gcodePre": [
"M107 ; turn off filament cooling fan",
"M104 S{temp} T0 ; set extruder temperature",
"M140 S{bed_temp} T0 ; set bed temperature",
"G90 ; set absolute positioning mode",
"M83 ; set relative positioning for extruder",
"G28 ; home axes",
"G1 F3000 ; set default move speed",
"G1 Z1 F6000 ; pause above the bed",
"M190 S{bed_temp} T0 ; wait for bed to reach target temp",
"M109 S{temp} T0 ; wait for extruder to reach target temp",
"G92 E0 ; set extruder position to 0"
],
"gcodePost": [
"M107 ; turn off filament cooling fan",
"M104 S0 T0 ; turn off extruder",
"M140 S0 T0 ; turn off bed",
"G91 ; relative movement",
"G1 Z10 F1200 ; drop bed 10mm",
"G90 ; absolute positioning",
"G28 X0 Y0 ; home XY axes",
"M84 ; disable stepper motors"
],
"gcodeExt": [],
"gcodeInt": [],
"gcodeProc": "",
"gcodePause": [],
"gcodeDwell": [],
"gcodeSpindle": [],
"gcodeChange": [],
"gcodeFExt": "gcode",
"gcodeSpace": true,
"gcodeStrip": false,
"gcodeLaserOn": [],
"gcodeLaserOff": [],
"extruders": [
{
"extFilament": 1.75,
"extNozzle": 0.4,
"extOffsetX": 0,
"extOffsetY": 0
}
],
"deviceName": "Anycubic Kobra",
"fwRetract": false,
"extras": {
"palette": {
"printer": "6c99ea036da",
"ping": null,
"feed": null,
"push": null,
"offset": null,
"heat": null,
"cool": null,
"press": null
}
}
}

View file

@ -0,0 +1,56 @@
{
"pre":[
"M140 S{bed_temp} T{tool}",
"M105 ; update temperature",
"M190 S{bed_temp} T{tool}",
"M104 S{temp} T{tool}",
"M105 ; update temperature",
"M109 S{temp} T{tool}",
"M82 ; set extruder to absolute mode",
"G21 ; set metric values",
"G90 ; set absolute positioning",
"M82 ; set extruder to absolute mode",
"M107 ; turn off fan",
"G28 ; home",
"G1 Z15 F1000 ; move the platform down 15mm",
"G92 E0 ; zero extruder",
"G1 F200 E3 ; extrude 3mm of feed stock",
"G92 E0 ; zero extruder",
"G1 F4000 ; set default feed rate",
"G92 E0 ; zero extruder",
";G5 ; uncomment to enable resume after power failure",
"M117 Printing..."
],
"post":[
"M107 ; turn off fan",
"M104 S0 T{tool} ; turn off extruder",
"M140 S0 T{tool} ; turn off bed",
"G91 ; relative positioning",
"G92 E0 ; zero extruder",
"G1 E-2 F300 ; retract filament",
"G1 Z0.5 E-5 ; retract filament, move z up",
"G28 ; home all axes",
"G90 ; absolute positioning",
"M82 ; absolute extrusion mode",
"M84 ; disable stepper motors"
],
"extruders":[
{
"nozzle": 0.4,
"filament": 1.75,
"offset_x": 0,
"offset_y": 0
}
],
"cmd":{
"fan_power": "M106 S{fan_speed}"
},
"settings":{
"origin_center": true,
"extrude_abs": true,
"bed_circle": true,
"bed_width": 370,
"bed_depth": 370,
"build_height": 455
}
}

View file

@ -0,0 +1,51 @@
{
"pre":[
"M105 ; update temperature",
"M104 S{temp} T{tool}",
"M140 S{bed_temp} T{tool}",
"M109 S{temp} T{tool}",
"M190 S{bed_temp} T{tool}",
"M105 ; update temperature",
"G21 ; set metric values",
"G90 ; set absolute positioning",
"M82 ; set extruder to absolute mode",
"M107 ; turn off fan",
"G28 X0 Y0 ; move X/Y to min",
"G28 Z0 ; move Z to min",
"G1 Z15.0 F100 ; move the platform down 15mm",
"G92 E0 ; zero extruder",
"G1 F200 E3 ; extrude 3mm of feed stock",
"G92 E0 ; zero extruder",
"G1 F100 ; set default feed rate",
"G0 Y20 ; wipe move to Y20",
"G92 E0 ; zero extruder",
";G5 ; uncomment to enable resume after power failure",
"M117 Printing..."
],
"post":[
"M107 ; turn off fan",
"M104 S0 T{tool} ; turn off extruder",
"M140 S0 T{tool} ; turn off bed",
"G1 Z{z_max} F1200 ; drop bed",
"G28 X0 Y0 ; home XY axes",
"M84 ; disable stepper motors"
],
"extruders":[
{
"nozzle": 0.4,
"filament": 1.75,
"offset_x": 0,
"offset_y": 0
}
],
"cmd":{
"fan_power": "M106 S{fan_speed}"
},
"settings":{
"origin_center": false,
"extrude_abs": true,
"bed_width": 210,
"bed_depth": 210,
"build_height": 205
}
}

View file

@ -0,0 +1,27 @@
{
"pre":[
"M104 S{temp} ; set extruder temperature",
"M140 S{bed_temp} ; set bed temperature",
"G28 ; Home",
"G1 F5000 Z50 ; lift nozzle",
"G0 X0 Y-100 Z50 ; parking",
"G0 Z20 ; parking",
"G92 E0 ; zero the extruded length",
"G1 F200 E3 ; extrude 3mm of feed stock"
],
"post":[
"M107 ; turn off filament cooling fan",
"M104 S0 ; turn off right extruder",
"M140 S0 ; turn off bed"
],
"cmd":{
"fan_power": "M106 S{fan_speed}"
},
"settings":{
"origin_center": true,
"bed_width": 210,
"bed_depth": 210,
"bed_circle": true,
"build_height": 320
}
}

View file

@ -0,0 +1,816 @@
{
"mode": "FDM",
"internal": 0,
"bedHeight": 2.5,
"bedWidth": 256,
"bedDepth": 256,
"bedRound": false,
"maxHeight": 256,
"originCenter": false,
"gcodeFan": [
"M106 P1 S{fan_speed}"
],
"gcodeTrack": [
"M73 P{progress}"
],
"gcodeLayer": [
"; ===== CHANGE_LAYER ==============================",
"; layer num/total_layer_count: {layer}/{layers}",
"M622.1 S1 ; for prev firware, default turned on",
"M1002 judge_flag timelapse_record_flag",
"M622 J1",
"M971 S11 C10 O0 ; timelapse without wipe tower",
"M623",
"M73 L{layer}",
"M991 S0 P{layer-1} ; notify layer change",
";; IF { layer == 0 }",
"M204 S500 ; reduce first layer acceleration",
";; ELSE",
"M204 S5000 ; faster acceleration",
";; END"
],
"gcodePre": [
"; total layer number: {layers}",
"; model label id: {model_labels}",
";; PREAMBLE",
";; DEFINE BAMBU-AMS 0,1,2,3",
"; ===== HEADER ====================================",
"M73 P0 R24 ; Initial progress and time remaining",
"M201 X12000 Y12000 Z1500 E5000 ; Set max acceleration",
"M203 X500 Y500 Z30 E30 ; Set max feed rates",
"M204 P12000 R5000 T12000 ; Set acceleration",
"M205 X9.00 Y9.00 Z3.00 E2.50 ; Set advanced settings",
"M106 S0 ; Set part fan speed to 0",
"M106 P2 S0 ; Turn off aux fan",
";===== Machine: A1 ================================",
"G392 S0 ; Disable clog detection",
"M9833.2 ; Custom command (unknown function)",
";===== Start Heating ==============================",
"M1002 gcode_claim_action : 2",
"M1002 set_filament_type:PLA ; Set filament type to PLA",
"M104 S140 ; Set nozzle temperature",
"M140 S65 ; Set bed temperature",
";===== Startup Sound ==============================",
"M17 ; Enable steppers",
"M400 S1 ; Wait for movements to complete",
"M1006 S1 ; Start printer sound",
"M1006 A0 B10 L100 C37 D10 M60 E37 F10 N60",
"M1006 A0 B10 L100 C41 D10 M60 E41 F10 N60",
"M1006 A0 B10 L100 C44 D10 M60 E44 F10 N60",
"M1006 A0 B10 L100 C0 D10 M60 E0 F10 N60",
"M1006 A43 B10 L100 C46 D10 M70 E39 F10 N80",
"M1006 A0 B10 L100 C0 D10 M60 E0 F10 N80",
"M1006 A0 B10 L100 C43 D10 M60 E39 F10 N80",
"M1006 A0 B10 L100 C0 D10 M60 E0 F10 N80",
"M1006 A0 B10 L100 C41 D10 M80 E41 F10 N80",
"M1006 A0 B10 L100 C44 D10 M80 E44 F10 N80",
"M1006 A0 B10 L100 C49 D10 M80 E49 F10 N80",
"M1006 A0 B10 L100 C0 D10 M80 E0 F10 N80",
"M1006 A44 B10 L100 C48 D10 M60 E39 F10 N80",
"M1006 A0 B10 L100 C0 D10 M60 E0 F10 N80",
"M1006 A0 B10 L100 C44 D10 M80 E39 F10 N80",
"M1006 A0 B10 L100 C0 D10 M60 E0 F10 N80",
"M1006 A43 B10 L100 C46 D10 M60 E39 F10 N80",
"M1006 W ; Play audio",
"M18 ; Disable steppers",
";===== Avoid End Stop =============================",
"G91 ; Set relative positioning",
"G380 S2 Z40 F1200 ; Move Z up to 40mm",
"G380 S3 Z-15 F1200 ; Move Z down to -15mm",
"G90 ; Set absolute positioning",
";===== Reset Machine Status =======================",
"M204 S6000 ; Set acceleration to 6000 mm/s^2",
"M630 S0 P0 ; Custom command (unknown function)",
"G91 ; Set relative positioning",
"M17 Z0.3 ; Lower Z motor current",
"G90 ; Set absolute positioning",
"M17 X0.65 Y1.2 Z0.6 ; Reset motor currents",
"M960 S5 P1 ; Turn on logo lamp",
"G90 ; Set absolute positioning",
"M220 S100 ; Reset feedrate",
"M221 S100 ; Reset flowrate",
"M73.2 R1.0 ; Reset estimated time remaining",
";===== Enable Noise Reduction =====================",
"M982.2 S1 ; Turn on noise reduction",
";===== Home XY & Prepare Print ====================",
"M1002 gcode_claim_action : 13",
"G28 X ; Home X-axis",
"G91 ; Set relative positioning",
"G1 Z5 F1200 ; Move Z up by 5mm",
"G90 ; Set absolute positioning",
"G0 X128 F30000 ; Move X to 128mm",
"G0 Y254 F3000 ; Move Y to 254mm",
"G91 ; Set relative positioning",
"G1 Z-5 F1200 ; Move Z down by 5mm",
"M109 S25 H140 ; Set tool preheat temperature",
"M17 E0.3 ; Set extruder motor current",
"M83 ; Set extruder to relative mode",
"G1 E10 F1200 ; Extrude 10mm",
"G1 E-0.5 F30 ; Retract 0.5mm",
"M17 D ; Restore motor current",
";===== Home Z with Low Precision ==================",
"G28 Z P0 T140 ; Home Z with low precision",
"M104 S220 ; Set nozzle temperature",
";===== Build Plate Detection ======================",
"M1002 judge_flag build_plate_detect_flag",
"M622 S1",
" G39.4 ; Custom build plate detection command",
" G90 ; Set absolute positioning",
" G1 Z5 F1200 ; Move Z up by 5mm",
"M623",
";===== Prepare Print Temperature & Material =======",
"M1002 gcode_claim_action : 24",
"M400 ; Wait for all movements to complete",
"M211 X0 Y0 Z0 ; Turn off soft endstops",
"M975 S1 ; Enable tool vibration suppression",
"G90 ; Set absolute positioning",
"G1 X-28.5 F30000 ; Move X-axis",
"G1 X-48.2 F3000 ; Move further on X",
"M620 M ; Enable material remap",
"M620 S0A ; Switch material if AMS exists",
" M1002 gcode_claim_action : 4",
" M400 ; Wait for heating",
" M1002 set_filament_type:UNKNOWN ; Set filament type as unknown",
" M109 S220 ; Set and wait hotend temperature",
" M104 S250 ; Set nozzle purge temp",
" M400 ; Wait for heating",
" T0 ; Select Tool 0",
" G1 X-48.2 F3000 ; Move X again",
" M400 ; Wait for completion",
" M620.1 E F523.843 T240 ; Extrude for purge sequence",
" M109 S250 ; Wait for nozzle flush temp",
" M106 P1 S0 ; Turn off nozzle cooling fan",
" G92 E0 ; Reset extruder position",
" G1 E50 F200 ; Extrude 50mm to clear nozzle",
" M400 ; Wait for all movements to complete",
" M1002 set_filament_type:PLA ; Confirm filament type",
"M621 S0A ; Confirm material switch",
"M109 S240 H300 ; Set nozzle temp",
"G92 E0 ; Reset extruder position",
"G1 E50 F200 ; Extrude 50mm slowly to prevent clog",
"M400 ; Wait for completion",
"M106 P1 S178 ; Set nozzle cooling fan speed",
"G92 E0 ; Reset extruder position",
"G1 E5 F200 ; Extrude 5mm slowly",
"M104 S220 ; Lower nozzle temperature",
"G92 E0 ; Reset extruder position",
"G1 E-0.5 F300 ; Retract filament slightly",
";===== Wipe and Shake Nozzle ======================",
"G1 X-28.5 F30000 ; Move X-axis",
"M73 P1 R23 ; Update print progress",
"G1 X-48.2 F3000 ; Move back on X-axis",
"M73 P2 R23 ; Update print progress",
"G1 X-28.5 F30000 ; Wipe nozzle",
"G1 X-48.2 F3000 ; Move back on X",
"G1 X-28.5 F30000 ; Wipe nozzle",
"G1 X-48.2 F3000 ; Move back on X",
"M400 ; Wait for all movements to complete",
"M106 P1 S0 ; Turn off nozzle cooling fan",
";===== Auto Extrude Calibration Start =============",
"M975 S1 ; Enable extruder calibration",
"G90 ; Set absolute positioning",
"M83 ; Set extruder to relative mode",
"T1000 ; Select tool 1000",
"G1 X-48.2 Y0 Z10 F10000 ; Move to calibration start position",
"M400 ; Wait for all moves to complete",
"M1002 set_filament_type:UNKNOWN ; Set filament type to unknown",
"M412 S1 ; Enable filament runout detection",
"M400 P10 ; Wait for 10ms",
"M620.3 W1 ; Enable filament tangle detection",
"M400 S2 ; Wait for 2ms",
"M1002 set_filament_type:PLA ; Set filament type to PLA",
"M1002 judge_flag extrude_cali_flag ; Check extruder calibration flag",
"M622 J1",
" M1002 gcode_claim_action : 8",
" M109 S220 ; Set hotend temperature",
" G1 E10 F377.08 ; Extrude 10mm at 377.08 mm/min",
" M983 F6.28466 A0.3 H0.4 ; Perform dynamic extrusion compensation",
" M106 P1 S255 ; Set nozzle cooling fan to max speed",
" M400 S5 ; Wait for 5 seconds",
" G1 X-28.5 F18000 ; Move X for wipe",
" G1 X-48.2 F3000 ; Move X back",
" G1 X-28.5 F18000 ; Wipe motion",
" G1 X-48.2 F3000 ; Move X back",
" M73 P3 R23 ; Update progress",
" G1 X-28.5 F12000 ; Wipe and shake",
" G1 X-48.2 F3000 ; Move X back",
" M400 ; Wait for all movements to complete",
" M106 P1 S0 ; Turn off nozzle cooling fan",
" M1002 judge_last_extrude_cali_success",
" M622 J0",
" M983 F6.28466 A0.3 H0.4 ; Perform dynamic extrusion compensation",
" M106 P1 S255 ; Set nozzle cooling fan to max speed",
" M400 S5 ; Wait for 5 seconds",
" G1 X-28.5 F18000 ; Move X for wipe",
" G1 X-48.2 F3000 ; Move X back",
" G1 X-28.5 F18000 ; Wipe motion",
" G1 X-48.2 F3000 ; Move X back",
" G1 X-28.5 F12000 ; Wipe and shake",
" M400 ; Wait for all movements to complete",
" M106 P1 S0 ; Turn off nozzle cooling fan",
" M623 ; End of calibration routine",
" M73 P4 R23 ; Update progress",
" G1 X-48.2 F3000 ; Move X back",
" M400 ; Wait for all movements to complete",
" M984 A0.1 E1 S1 F6.28466 H0.4 ; Apply extruder calibration parameters",
" M106 P1 S178 ; Set nozzle cooling fan to moderate speed",
" M400 S7 ; Wait for 7 seconds",
" G1 X-28.5 F18000 ; Move X for wipe",
" G1 X-48.2 F3000 ; Move X back",
" G1 X-28.5 F18000 ; Wipe motion",
" G1 X-48.2 F3000 ; Move X back",
" G1 X-28.5 F12000 ; Wipe and shake",
" G1 X-48.2 F3000 ; Move X back",
" M400 ; Wait for all movements to complete",
" M106 P1 S0 ; Turn off nozzle cooling fan",
"M623 ; End of extruder calibration process",
"M104 S170 ; Prepare to wipe nozzle",
"M106 S255 ; Turn on fan",
";===== Mech Mode Fast Check Start =================",
"M1002 gcode_claim_action : 3",
"G1 X128 Y128 F20000 ; Move to check position",
"G1 Z5 F1200 ; Raise Z-axis",
"M400 P200 ; Wait for movements to complete",
"M970.3 Q1 A5 K0 O3 ; Execute fast check routine",
"M974 Q1 S2 P0 ; Confirm fast check step",
"M970.2 Q1 K1 W58 Z0.1 ; Additional fast check",
"M974 S2 ; Confirm step",
"G1 X128 Y128 F20000 ; Repeat move to check position",
"G1 Z5 F1200 ; Raise Z-axis",
"M400 P200 ; Wait for movements to complete",
"M970.3 Q0 A10 K0 O1 ; Execute another fast check routine",
"M974 Q0 S2 P0 ; Confirm step",
"M970.2 Q0 K1 W78 Z0.1 ; Another additional check",
"M974 S2 ; Confirm step",
"M975 S1 ; Confirm vibration suppression",
"G1 F30000 ; Set movement speed",
"G1 X0 Y5 ; Move to next step",
"G28 X ; Re-home XY",
"G1 Z4 F1200 ; Lower Z-axis",
";===== Wipe Nozzle ================================",
"M1002 gcode_claim_action : 14",
"M975 S1 ; Enable wipe mode",
"M106 S255 ; Turn on fan (G28 turns off fan)",
"M211 S ; Push soft endstop status",
"M211 X0 Y0 Z0 ; Turn off Z-axis endstop",
";===== Remove Waste by Touching Start =============",
"M104 S170 ; Set nozzle temp",
"M83 ; Set extruder to relative mode",
"G1 E-1 F500 ; Retract filament",
"G90 ; Set absolute positioning",
"M83 ; Set extruder to relative mode",
"M109 S170 ; Set nozzle temperature",
"G0 X108 Y-0.5 F30000 ; Move to wipe position",
"G380 S3 Z-5 F1200 ; Lower nozzle to wipe",
"; Repeat wipe sequence",
"G1 Z2 F1200",
"G1 X110 F10000",
"G380 S3 Z-5 F1200",
"M73 P22 R18",
"G1 Z2 F1200",
"G1 X112 F10000",
"G380 S3 Z-5 F1200",
"G1 Z2 F1200",
"G1 X114 F10000",
"G380 S3 Z-5 F1200",
"G1 Z2 F1200",
"G1 X116 F10000",
"G380 S3 Z-5 F1200",
"G1 Z2 F1200",
"G1 X118 F10000",
"G380 S3 Z-5 F1200",
"G1 Z2 F1200",
"G1 X120 F10000",
"G380 S3 Z-5 F1200",
"G1 Z2 F1200",
"G1 X122 F10000",
"G380 S3 Z-5 F1200",
"G1 Z2 F1200",
"G1 X124 F10000",
"G380 S3 Z-5 F1200",
"G1 Z2 F1200",
"G1 X126 F10000",
"G380 S3 Z-5 F1200",
"G1 Z2 F1200",
"G1 X128 F10000",
"G380 S3 Z-5 F1200",
"G1 Z2 F1200",
"G1 X130 F10000",
"G380 S3 Z-5 F1200",
"G1 Z2 F1200",
"G1 X132 F10000",
"G380 S3 Z-5 F1200",
"G1 Z2 F1200",
"G1 X134 F10000",
"G380 S3 Z-5 F1200",
"G1 Z2 F1200",
"G1 X136 F10000",
"G380 S3 Z-5 F1200",
"G1 Z2 F1200",
"G1 X138 F10000",
"G380 S3 Z-5 F1200",
"G1 Z2 F1200",
"G1 X140 F10000",
"G380 S3 Z-5 F1200",
"G1 Z2 F1200",
"G1 X142 F10000",
"G380 S3 Z-5 F1200",
"G1 Z2 F1200",
"G1 X144 F10000",
"G380 S3 Z-5 F1200",
"G1 Z2 F1200",
"G1 X146 F10000",
"G380 S3 Z-5 F1200",
"G1 Z2 F1200",
"G1 X148 F10000",
"G380 S3 Z-5 F1200",
"G1 Z5 F30000 ; Raise Z",
";===== Remove Waste by Touching End ===============",
"G1 Z10 F1200 ; Lift nozzle",
"G0 X118 Y261 F30000 ; Move to safe position",
"G1 Z5 F1200 ; Lower Z",
"M109 S170 ; Set nozzle temperature",
"G28 Z P0 T300 ; Home Z with low precision",
"G29.2 S0 ; Turn off ABL",
"M104 S140 ; Prepare for auto bed leveling",
"G0 Z5 F20000 ; Lift Z",
"G0 X128 Y261 F20000 ; Move to exposed steel surface",
"G0 Z-1.01 F1200 ; Lower nozzle to stop position",
"G91 ; Set relative positioning",
"G2 I1 J0 X2 Y0 F2000.1 ; Execute wipe motion",
"G2 I-0.75 J0 X-1.5",
"G2 I1 J0 X2",
"G2 I-0.75 J0 X-1.5",
"G2 I1 J0 X2",
"G2 I-0.75 J0 X-1.5",
"G2 I1 J0 X2",
"G2 I-0.75 J0 X-1.5",
"G2 I1 J0 X2",
"G2 I-0.75 J0 X-1.5",
"G2 I1 J0 X2",
"G2 I-0.75 J0 X-1.5",
"G2 I1 J0 X2",
"G2 I-0.75 J0 X-1.5",
"G2 I1 J0 X2",
"G2 I-0.75 J0 X-1.5",
"G2 I1 J0 X2",
"G2 I-0.75 J0 X-1.5",
"G2 I1 J0 X2",
"G2 I-0.75 J0 X-1.5",
"G90 ; Set absolute positioning",
"G1 Z10 F1200 ; Raise Z",
";===== Brush Material Wipe Nozzle =================",
"G90 ; Set absolute positioning",
"G1 Y250 F30000 ; Move to brush position",
"G1 X55 ; Move X",
"G1 Z1.300 F1200 ; Lower nozzle",
"G1 Y262.5 F6000 ; Wipe motion",
"G91 ; Set relative positioning",
"G1 X-35 F30000 ; Move along brush",
"G1 Y-0.5",
"G1 X45",
"G1 Y-0.5",
"G1 X-45",
"G1 Y-0.5",
"G1 X45",
"G1 Y-0.5",
"G1 X-45",
"G1 Y-0.5",
"G1 X45",
"G1 Z5.000 F1200 ; Lift nozzle",
"G90 ; Set absolute positioning",
"G1 X30 Y250.000 F30000 ; Move to brush position",
"G1 Z1.300 F1200 ; Lower nozzle",
"G1 Y262.5 F6000 ; Wipe motion",
"G91 ; Set relative positioning",
"G1 X35 F30000 ; Move along brush",
"G1 Y-0.5",
"G1 X-45",
"G1 Y-0.5",
"G1 X45",
"G1 Y-0.5",
"G1 X-45",
"G1 Y-0.5",
"G1 X45",
"G1 Y-0.5",
"G1 X-45",
"G1 Z10.000 F1200 ; Lift nozzle",
";===== Brush Material Wipe Nozzle End ============",
"G90 ; Set absolute positioning",
"G1 Y250 F30000 ; Move to safe position",
"G1 X138",
"G1 Y261",
"G0 Z-1.01 F1200 ; Stop nozzle",
"G91 ; Set relative positioning",
"G2 I1 J0 X2 Y0 F2000.1",
"G2 I-0.75 J0 X-1.5",
"G2 I1 J0 X2",
"G2 I-0.75 J0 X-1.5",
"G2 I1 J0 X2",
"G2 I-0.75 J0 X-1.5",
"G2 I1 J0 X2",
"G2 I-0.75 J0 X-1.5",
"G2 I1 J0 X2",
"G2 I-0.75 J0 X-1.5",
"G2 I1 J0 X2",
"G2 I-0.75 J0 X-1.5",
"M73 P23 R18",
"G2 I1 J0 X2",
"G2 I-0.75 J0 X-1.5",
"G2 I1 J0 X2",
"G2 I-0.75 J0 X-1.5",
"G2 I1 J0 X2",
"G2 I-0.75 J0 X-1.5",
"G2 I1 J0 X2",
"G2 I-0.75 J0 X-1.5",
"M109 S140 ; Set nozzle temperature",
"M106 S255 ; Turn on fan (G28 turns off fan)",
"M211 R ; Restore soft endstop status",
";===== Bed Leveling ===============================",
"M1002 judge_flag g29_before_print_flag ; Check bed leveling flag",
"G90 ; Set absolute positioning",
"G1 Z5 F1200 ; Lift nozzle",
"G1 X0 Y0 F30000 ; Move to home position",
"G29.2 S1 ; Turn on ABL (auto bed level)",
"M190 S65 ; Set and wait bed temp",
"M109 S140 ; Set and wait nozzle temp",
"M106 S0 ; Turn off fan (reduce noise)",
"M622 J1",
" M1002 gcode_claim_action : 1",
" G29 A1 X115.2 Y115.2 I25.6 J25.6 ; Perform bed leveling",
" M400 ; Wait for all movements to complete",
" M500 ; Save calibration data",
"M623 ; End bed leveling",
";===== Home After Wipe Mouth ======================",
"M1002 judge_flag g29_before_print_flag ; Check if bed leveling was performed",
"M622 J0 ; Signal start of sequence",
" M1002 gcode_claim_action : 13 ; Claim home action",
" G28 ; Home all axes",
"M623 ; End sequence",
";===== Home After Wipe Mouth End ==================",
"G1 X108.000 Y-0.500 F30000 ; Move to start position",
"G1 Z0.300 F1200 ; Lower Z for calibration",
"M400 ; Wait for moves to complete",
"G2814 Z0.32 ; Set Z offset",
"M104 S220 ; Set nozzle temperature to 220°C for printing",
";===== Nozzle Load Line ===========================",
";G90 ; Set absolute positioning",
";M83 ; Set extruder to relative mode",
";G1 Z5 F1200 ; Raise Z before priming",
";G1 X88 Y-0.5 F20000 ; Move to priming position",
";G1 Z0.3 F1200 ; Lower nozzle for priming",
";M109 S220 ; Wait for nozzle temperature to reach 220°C",
";G1 E2 F300 ; Extrude filament",
";G1 X168 E4.989 F6000 ; Extrude along the line",
";G1 Z1 F1200 ; Lift Z after priming",
";===== Extrude Calibration Test ====================",
"M400 ; Wait for all commands to complete",
"M900 S ; Start calibration",
"M900 C ; Start calibration cycle",
"G90 ; Set absolute positioning",
"M83 ; Set extruder to relative mode",
"M109 S220 ; Set and wait nozzle temp",
"G0 X128 E8 F904.991 ; Extrude calibration test pattern",
"G0 X133 E.3742 F1508.32",
"G0 X138 E.3742 F6033.27",
"G0 X143 E.3742 F1508.32",
"G0 X148 E.3742 F6033.27",
"G0 X153 E.3742 F1508.32",
"G91 ; Set relative positioning",
"G1 X1 Z-0.300 ; Lower nozzle slightly",
"G1 X4 ",
"G1 Z1 F1200 ; Raise back up",
"G90 ; Return to absolute positioning",
"M400 ; Wait for completion",
"M900 R ; Reset calibration",
"M1002 judge_flag extrude_cali_flag ; Check calibration status",
"M622 J1 ; Signal start of sequence",
" G90 ; Set absolute positioning",
" G1 X108.000 Y1.000 F30000 ; Move to calibration position",
" G91 ; Set relative positioning",
" G1 Z-0.700 F1200 ; Lower nozzle slightly",
" G90 ; Return to absolute positioning",
" M83 ; Set extruder to relative mode",
" G0 X128 E10 F904.991 ; Run extrusion test",
" G0 X133 E.3742 F1508.32",
" G0 X138 E.3742 F6033.27",
" G0 X143 E.3742 F1508.32",
" G0 X148 E.3742 F6033.27",
" G0 X153 E.3742 F1508.32",
" G91 ; Set relative positioning",
" G1 X1 Z-0.300 ; Lower slightly",
" G1 X4",
" G1 Z1 F1200 ; Raise back up",
" G90 ; Return to absolute positioning",
" M400 ; Wait for completion",
"M623 ; End sequence",
"G1 Z0.2 ; Lower nozzle slightly",
"M1002 gcode_claim_action : 0 ; Claim action",
"M400 ; Wait for actions to complete",
";===== Final Print Prep ===========================",
"G29.1 Z-0.02 ; Adjust Z height for PEI plate",
"M960 S1 P0 ; Turn off laser",
"M960 S2 P0 ; Turn off laser",
"M106 S0 ; Turn off fan",
"M106 P2 S0 ; Turn off auxiliary fan",
"M106 P3 S0 ; Turn off chamber fan",
"M975 S1 ; Enable mechanical suppression mode",
"G90 ; Set absolute positioning",
"M83 ; Set extruder to relative mode",
"T1000 ; Tool selection",
"M211 X0 Y0 Z0 ; Disable soft endstops",
"M1007 S1 ; Enable mass estimation",
"G29.4 ; Start additional leveling routine",
"G90 ; Set absolute positioning",
"G21 ; Set units to millimeters",
"M83 ; Set extruder to relative mode",
"M106 P3 S200 ; Set chamber fan speed",
"M981 S1 P20000 ; Open spaghetti detector"
],
"gcodePost": [
"; ===== FOOTER ====================================",
"M204 S6000 ; Set acceleration to 6000 mm/s^2",
"M1003 S0 ; Disable power loss recovery",
"M106 S0 ; Turn off part cooling fan",
"M106 P2 S0 ; Turn off auxiliary cooling fan",
"M981 S0 P20000 ; Close spaghetti detector",
"M106 P3 S0 ; Turn off chamber fan",
"G392 S0 ; Turn off nozzle clog detection",
"M400 ; Wait for buffer to clear",
"G92 E0 ; Zero the extruder",
"G1 E-0.8 F1800 ; Retract filament by 0.8mm",
"G1 Z26.1 F900 ; Raise Z-axis slightly",
"G1 X0 Y128 F18000 ; Move to safe position",
"G1 X-13.0 F3000 ; Move to another safe position",
";===== Timelapse Sequence ========================",
"M1002 judge_flag timelapse_record_flag",
"M622 J1",
" M400 P100",
" M971 S11 C11 O0",
" M991 S0 P-1 ; End timelapse at safe pos",
"M623 ; End conditional block",
";===== End of Print ==============================",
"M140 S0 ; Turn off heated bed",
"M106 S0 ; Turn off all cooling fans",
"M106 P2 S0 ; Turn off auxiliary cooling fan",
"M106 P3 S0 ; Turn off chamber cooling fan",
";===== Pull Back Filament ========================",
"M620 S255 ; Retract filament to AMS",
"G1 X267 F15000 ; Move to retract position",
"T255 ; Select tool 255 (AMS retract)",
"G1 X-28.5 F18000",
"G1 X-48.2 F3000",
"G1 X-28.5 F18000",
"G1 X-48.2 F3000",
"M621 S255 ; Complete filament unload",
"M104 S0 ; Turn off hotend",
"M400 ; Wait for all motion to complete",
"M17 S ; Enable steppers",
"M17 Z0.4 ; Reduce Z stepper motor current",
"G1 Z125.6 F600 ; Move Z-axis up",
"G1 Z123.6",
"M400 P100",
"M17 R ; Restore Z motor current",
"G90 ; Set absolute positioning",
"G1 X-48 Y180 F3600 ; Move to parking position",
"M220 S100 ; Reset feedrate to 100%",
"M201.2 K1.0 ; Reset acceleration magnitude",
"M73.2 R1.0 ; Reset remaining time estimation",
"M1002 set_gcode_claim_speed_level : 0",
";===== Printer Finish Sound ======================",
"M17",
"M400 S1",
"M1006 S1",
"M1006 A0 B20 L100 C37 D20 M40 E42 F20 N60",
"M1006 A0 B10 L100 C44 D10 M60 E44 F10 N60",
"M1006 A0 B10 L100 C46 D10 M80 E46 F10 N80",
"M1006 A44 B20 L100 C39 D20 M60 E48 F20 N60",
"M1006 A0 B10 L100 C44 D10 M60 E44 F10 N60",
"M1006 A0 B10 L100 C0 D10 M60 E0 F10 N60",
"M1006 A0 B10 L100 C39 D10 M60 E39 F10 N60",
"M1006 A0 B10 L100 C0 D10 M60 E0 F10 N60",
"M1006 A0 B10 L100 C44 D10 M60 E44 F10 N60",
"M1006 A0 B10 L100 C0 D10 M60 E0 F10 N60",
"M1006 A0 B10 L100 C39 D10 M60 E39 F10 N60",
"M1006 A0 B10 L100 C0 D10 M60 E0 F10 N60",
"M1006 A0 B10 L100 C48 D10 M60 E44 F10 N80",
"M1006 A0 B10 L100 C0 D10 M60 E0 F10 N80",
"M1006 A44 B20 L100 C49 D20 M80 E41 F20 N80",
"M1006 A0 B20 L100 C0 D20 M60 E0 F20 N80",
"M1006 A0 B20 L100 C37 D20 M30 E37 F20 N60",
"M1006 W",
"M400 ; Wait for completion",
"M18 X Y Z ; Disable motors",
"M73 P100 R0 ; Set progress to 100%"
],
"gcodeChange": [
"; BEGIN tool change from {last_tool} to {tool}",
"M620 S{tool}A ; prepare tool change",
"M204 S9000 ; Set acceleration to 9000 mm/s^2",
"M620.11 S0 ; Reset filament retraction state",
"M400 ; wait for moves to complete",
"M620.1 E F187 T240 ; set purge rate 187 temp 240",
"T{tool} ; initiate tool change",
"M620.1 E F374 T240 ; set purge rate 374 temp 240",
"M620.11 S0 ; Reset filament retraction state",
"G92 E0 ; reset extruder position",
"M400 ; wait for moves to complete",
" ; -- PURGE --",
"M109 S240 ; Set nozzle temperature to 240°C",
"G1 E23.7 F187 ; Extrude 23.7mm of filament at flowrate 187",
"G1 E0.914611 F50 ; Pulsatile extrusion",
"G1 E10.518 F187 ; Continue extrusion at flowrate 187",
"G1 E0.914611 F50 ; Pulsatile extrusion",
"G1 E10.518 F374 ; Continue extrusion at flowrate 374",
"G1 E0.914611 F50 ; Pulsatile extrusion",
"G1 E10.518 F374 ; Continue extrusion at flowrate 374",
"G1 E0.914611 F50 ; Pulsatile extrusion",
"G1 E10.518 F374 ; Continue extrusion at flowrate 374",
"G1 E-2 F1800 ; Retract filament by 2mm",
"G1 E2 F300 ; Recover retraction slowly",
"M400 ; Wait for all movements to complete",
"M109 S{temp} ; Set nozzle temperature back to print temp",
" ; -- SHAKE --",
"M106 P1 S255 ; Turn on nozzle cooling fan to full speed",
"M400 S3 ; Wait for all movements to complete",
"G1 X70 F5000 ; Move to X70",
"G1 X90 F3000 ; Move to X90",
"G1 Y255 F4000 ; Move to Y255",
"G1 X105 F5000 ; Move to X105",
"G1 Y265 ; Move to Y265",
"G1 X70 F10000 ; Rapid move to X70",
"G1 X100 F5000 ; Move to X100",
"G1 X70 F10000 ; Rapid move back to X70",
"G1 X100 F5000 ; Move to X100",
"G1 X70 F10000 ; Shake filament residue",
"G1 X80 F15000",
"G1 X60",
"G1 X80",
"G1 X60",
"G1 X80 ; Shake to put down garbage",
"G1 X100 F5000 ; Move to X100",
"G1 X165 F15000 ; Wipe and shake",
"G1 Y256 ; Move Y aside to prevent collision",
"M400 ; Wait for all movements to complete",
"M204 S10000 ; Set acceleration to 10000 mm/s^2",
"M621 S{tool}A ; complete tool change",
"; END tool change"
],
"gcodeProc": "",
"gcodeFExt": "gcode",
"extruders": [
{
"extFilament": 1.75,
"extNozzle": 0.4,
"extOffsetX": 0,
"extOffsetY": 0
},
{
"extFilament": 1.75,
"extNozzle": 0.4,
"extOffsetX": 0,
"extOffsetY": 0
},
{
"extFilament": 1.75,
"extNozzle": 0.4,
"extOffsetX": 0,
"extOffsetY": 0
},
{
"extFilament": 1.75,
"extNozzle": 0.4,
"extOffsetX": 0,
"extOffsetY": 0
}
],
"new": false,
"deviceName": "Bambu A1",
"bedBelt": false,
"fwRetract": false,
"filamentSource": "direct",
"extras": {
"bbl": {
"luke": {
"host": "10.20.20.75",
"code": "20709223",
"serial": "01P09C482401767",
"modified": true
},
"leia": {
"host": "10.20.20.76",
"code": "35129782",
"serial": "01P09C461603301",
"modified": true
},
"vader": {
"host": "10.20.20.77",
"code": "17711811",
"serial": "01P00A413100516",
"modified": true
},
"Scrappy": {
"host": "10.10.2.5",
"serial": "01S00A292500224",
"code": "38373335",
"modified": true
}
}
},
"imageURL": "",
"deviceZMax": 0,
"gcodeTime": 1,
"gcodeFeature": [],
"profiles": [
{
"processName": "Bambu PLA",
"sliceHeight": 0.2,
"sliceShells": 2,
"sliceShellOrder": "in-out",
"sliceLayerStart": "last",
"sliceFillAngle": 45,
"sliceFillOverlap": 0.35,
"sliceFillSparse": 0.1,
"sliceFillType": "grid",
"sliceAdaptive": false,
"sliceMinHeight": 0,
"sliceSupportDensity": 0.5,
"sliceSupportOffset": 0.4,
"sliceSupportGap": 1,
"sliceSupportSize": 5,
"sliceSupportArea": 0.25,
"sliceSupportExtra": 0,
"sliceSupportAngle": 60,
"sliceSupportNozzle": 0,
"sliceSolidMinArea": 0,
"sliceBottomLayers": 2,
"sliceTopLayers": 3,
"firstLayerRate": 20,
"firstLayerPrintMult": 1,
"firstLayerYOffset": 0,
"firstLayerBrim": 0,
"firstLayerBeltLead": 0,
"firstLayerFanSpeed": 0,
"outputTemp": 220,
"outputBedTemp": 65,
"outputFanSpeed": 255,
"outputFeedrate": 120,
"outputFinishrate": 90,
"outputSeekrate": 200,
"outputShellMult": 1.2,
"outputFillMult": 1.2,
"outputSparseMult": 1.2,
"outputRetractDist": 2,
"outputRetractSpeed": 80,
"outputRetractWipe": 0,
"outputRetractDwell": 0,
"outputShortPoly": 100,
"outputMinSpeed": 5,
"outputCoastDist": 0,
"outputLayerRetract": false,
"zHopDistance": 0,
"antiBacklash": 0,
"sliceFillWidth": 1,
"sliceFillRate": 0,
"sliceSupportEnable": false,
"firstSliceHeight": 0.3,
"firstLayerFillRate": 80,
"firstLayerLineMult": 1,
"firstLayerNozzleTemp": 210,
"firstLayerBedTemp": 60,
"firstLayerBrimTrig": 0,
"firstLayerBrimGap": 0,
"outputRaft": false,
"outputRaftSpacing": 0.2,
"outputBrimCount": 0,
"outputBrimOffset": 2,
"outputPurgeTower": 0,
"outputInvertX": false,
"outputInvertY": false,
"arcTolerance": 0,
"ranges": [],
"sliceLineWidth": 0,
"sliceFillRepeat": 2,
"firstLayerBrimIn": 0,
"firstLayerBeltBump": 0,
"outputBeltFirst": false,
"outputLoops": 0,
"sliceFillGrow": 0,
"sliceSolidRate": 0,
"sliceSupportSpan": 5,
"sliceSupportOutline": true,
"firstLayerFlatten": 0,
"outputDraftShield": false,
"outputAvoidGaps": true,
"sliceDetectThin": "off",
"outputAlternating": false,
"sliceLayerStartX": 0,
"sliceLayerStartY": 0,
"sliceSupportGrow": 0,
"outputFanLayer": 1,
"outputNozzle": 0,
"sliceAngle": 45,
"sliceZInterleave": false
}
]
}

View file

@ -0,0 +1,502 @@
{
"mode": "FDM",
"internal": 0,
"bedHeight": 2.5,
"bedWidth": 256,
"bedDepth": 256,
"bedRound": false,
"maxHeight": 256,
"originCenter": false,
"gcodeFan": [
"M106 S{fan_speed}"
],
"gcodeTrack": [
"M73 P{progress}"
],
"gcodeLayer": [
"; CHANGE_LAYER",
"; layer num/total_layer_count: {layer}/{layers}",
"M622.1 S1 ; for prev firware, default turned on",
"M1002 judge_flag timelapse_record_flag",
"M622 J1",
"M971 S11 C10 O0 ; timelapse without wipe tower",
"M623",
"M73 L{layer}",
"M991 S0 P{layer-1} ; notify layer change",
";; IF { layer == 0 }",
"M204 S500",
";; ELSE",
"M204 S5000",
";; END"
],
"gcodePre": [
"; total layer number: {layers}",
"; model label id: {model_labels}",
";; PREAMBLE",
";; DEFINE BAMBU-AMS 0,1,2,3",
"; ===== HEADER ====================================",
"M73 P0 R14 ; Initial progress and time remaining",
"M201 X20000 Y20000 Z500 E5000 ; Set max acceleration",
"M203 X500 Y500 Z20 E30 ; Set max feedrates",
"M204 P20000 R5000 T20000 ; Set acceleration",
"M205 X9.00 Y9.00 Z3.00 E2.50 ; Set advanced settings",
"M106 S0 ; Set part fan speed to 0",
"M106 P2 S0 ; Turn off aux fan",
";===== machine: P1S ===============================",
"M104 S75 ; Set extruder temp to turn on HB fan, prevent filament oozing",
"M710 A1 S255 ; Turn on MC fan by default (P1S)",
";===== Reset machine status =======================",
"M290 X40 Y40 Z2.6666666 ; Set baby stepping offsets",
"G91 ; Set to relative positioning",
"M17 Z0.4 ; Lower Z-motor current",
"G380 S2 Z30 F300 ; Lower hotbed (G380 like G38)",
"G380 S2 Z-25 F300 ; Continue to lower bed",
"G1 Z5 F300 ; Raise bed by 5mm",
"G90 ; Set to absolute positioning",
"M17 X1.2 Y1.2 Z0.75 ; Reset motor current to default",
"M960 S5 P1 ; Turn on logo lamp",
"M220 S100 ; Reset feedrate to 100%",
"M221 S100 ; Reset flowrate to 100%",
"M73.2 R1.0 ; Reset remaining time magnitude",
"M1002 set_gcode_claim_speed_level : 5 ; Set G-code claim speed level",
"M221 X0 Y0 Z0 ; Turn off soft endstop to prevent logic issues",
"G29.1 Z0 ; Clear Z-trim value",
"M204 S10000 ; Initialize acceleration to 10 m/s^2",
";===== Heatbed preheat ============================",
"M1002 gcode_claim_action : 2 ; Claim action for preheating",
"M140 S{bed_temp} ; Set bed temperature to 65°C",
"M190 S{bed_temp} ; Wait for bed temperature to reach 65°C",
";===== Turn on fans to prevent PLA jamming ========",
"M106 P3 S180 ; set chamber fan speed to prevent PLA jamming",
"M106 P2 S100 ; Turn on aux fan to cool toolhead",
";===== Prepare print temperature and material =====",
"M104 S{temp} ; Set extruder temp to 220°C",
"G91 ; Set to relative positioning",
"G0 Z10 F1200 ; Raise Z by 10mm",
"G90 ; Set to absolute positioning",
"G28 X ; Home X axis",
"M975 S1 ; Turn on feature (guess: vibration suppression)",
"M73 P31 R9 ; Update progress and time remaining",
"G1 X60 F12000 ; Fast move to X60",
"G1 Y245 ; Move to Y245",
"G1 Y265 F3000 ; Move to Y265 slowly",
"M620 M ; Custom command (guess: material management)",
"M620 S{tool}A ; Switch material if AMS present",
"M109 S{temp} ; Wait for extruder to reach 220°C",
"G1 X120 F12000 ; Fast move to X120",
"G1 X20 Y50 F12000 ; Fast move to X20 Y50",
"G1 Y-3 ; Move down Y-axis by 3",
"T{tool} ; Select starting tool",
"G1 X54 F12000 ; Fast move to X54",
"G1 Y265 ; Move to Y265",
"M400 ; Wait for all moves to finish",
"M621 S{tool}A ; Custom command",
"M620.1 E F523.843 T240 ; Extrude command with custom parameters",
"M412 S1 ; Turn on filament runout detection",
"M109 S250 ; Set nozzle to common flush temp",
"M106 P1 S0 ; Turn off nozzle fan",
"G92 E0 ; Reset extruder position",
"G1 E50 F200 ; Extrude 50mm of filament",
"M400 ; Wait for moves to finish",
"M104 S{temp} ; Set nozzle temperature to 220°C",
"G92 E0 ; Reset extruder position",
"G1 E50 F200 ; Extrude 50mm of filament",
"M400 ; Wait for moves to finish",
"M106 P1 S255 ; Turn on nozzle fan to full speed",
"G92 E0 ; Reset extruder position",
"G1 E5 F300 ; Extrude 5mm of filament",
"M109 S200 ; Drop nozzle temperature to 200°C to shrink filament",
"G92 E0 ; Reset extruder position",
"M73 P33 R9 ; Update progress and time remaining",
"G1 E-0.5 F300 ; Retract filament by 0.5mm",
"M73 P35 R9 ; Update progress and time remaining",
"G1 X70 F9000 ; Fast move to X70",
"G1 X76 F15000 ; Fast move to X76",
"G1 X65 F15000 ; Fast move to X65",
"G1 X76 F15000 ; Repeat movements to shake and clean nozzle",
"G1 X65 F15000 ; Shake to put down garbage",
"G1 X80 F6000 ; Move to X80",
"G1 X95 F15000 ; Fast move to X95",
"G1 X80 F15000 ; Return to X80",
"G1 X165 F15000 ; Wipe and shake",
"M400 ; Wait for all moves to finish",
"M106 P1 S0 ; Turn off nozzle fan",
";===== Wipe nozzle ===============================",
"M1002 gcode_claim_action : 14 ; Claim action for nozzle wipe",
"M975 S1 ; Turn on feature (guess: vibration suppression)",
"M106 S255 ; Turn on part fan to full speed",
"G1 X65 Y230 F18000 ; Fast move to start of wipe",
"G1 Y264 F6000 ; Wipe along Y-axis",
"M109 S200 ; Set nozzle temperature to 200°C",
"G1 X100 F18000 ; Wipe first pass",
"G0 X135 Y253 F20000 ; Move to exposed steel surface edge",
"G28 Z P0 T300 ; Home Z with low precision, permit 300°C temperature",
"G29.2 S0 ; Turn off ABL (auto bed leveling)",
"G0 Z5 F20000 ; Raise Z by 5mm",
"G1 X60 Y265 ; Move to X60 Y265",
"G92 E0 ; Reset extruder position",
"G1 E-0.5 F300 ; Retract more",
"G1 X100 F5000 ; Second wipe pass",
"G1 X70 F15000 ; Repeat movements for further wiping",
"G1 X100 F5000",
"G1 X70 F15000",
"G1 X100 F5000",
"G1 X70 F15000",
"G1 X90 F5000",
"G0 X128 Y261 Z-1.5 F20000 ; Move to exposed steel surface, stop nozzle",
"M104 S140 ; Set temp down to heatbed acceptable",
"M106 S255 ; Turn on part fan (G28 turned off fan)",
"M221 S ; Push soft endstop status",
"M221 Z0 ; Turn off Z axis endstop",
"G0 Z0.5 F20000 ; Raise Z by 0.5mm",
"G0 X125 Y259.5 Z-1.01 ; Move to wiping position",
"G0 X131 F211",
"G0 X124",
"G0 Z0.5 F20000",
"G0 X125 Y262.5",
"G0 Z-1.01",
"G0 X131 F211",
"G0 X124",
"G0 Z0.5 F20000",
"G0 X125 Y260.0",
"G0 Z-1.01",
"G0 X131 F211",
"G0 X124",
"G0 Z0.5 F20000",
"G0 X125 Y262.0",
"G0 Z-1.01",
"G0 X131 F211",
"G0 X124",
"G0 Z0.5 F20000",
"G0 X125 Y260.5",
"G0 Z-1.01",
"G0 X131 F211",
"G0 X124",
"G0 Z0.5 F20000",
"G0 X125 Y261.5",
"G0 Z-1.01",
"G0 X131 F211",
"G0 X124",
"G0 Z0.5 F20000",
"G0 X125 Y261.0",
"G0 Z-1.01",
"G0 X131 F211",
"G0 X124",
"G0 X128",
"G2 I0.5 J0 F300 ; Arc movements for final cleaning",
"M73 P36 R8 ; Update progress and time remaining",
"G2 I0.5 J0 F300",
"G2 I0.5 J0 F300",
"G2 I0.5 J0 F300",
"M109 S140 ; Wait for nozzle temp to reach heatbed acceptable temp",
"G2 I0.5 J0 F3000 ; More arc movements",
"G2 I0.5 J0 F3000",
"G2 I0.5 J0 F3000",
"G2 I0.5 J0 F3000",
"M221 R ; Pop softend status",
"G1 Z10 F1200 ; Raise Z by 10mm",
"M400 ; Wait for all moves to finish",
"G1 Z10 ; Raise Z by 10mm",
"G1 F30000 ; Set fast feedrate",
"G1 X230 Y15 ; Move to X230 Y15",
"G29.2 S1 ; Turn on ABL",
"M106 S0 ; Turn off part fan, too noisy",
";===== Bed leveling ===============================",
"M1002 judge_flag g29_before_print_flag ; Judge flag before leveling",
"M622 J1",
" M1002 gcode_claim_action : 1 ; Claim action for bed leveling",
" G29 A X115.2 Y115.2 I25.6 J25.6 ; Perform bed leveling",
" M400 ; Wait for all moves to finish",
" M500 ; Save calibration data",
"M623",
";===== Home after wipe mouth ======================",
"M1002 judge_flag g29_before_print_flag ; Judge flag before homing",
"M622 J0",
" M1002 gcode_claim_action : 13 ; Claim action for homing",
" G28 ; Home all axes",
"M623",
";===== Home after wipe mouth end ==================",
"M975 S1 ; Turn on vibration suppression",
";===== Turn on fans to prevent PLA jamming ========",
"M106 P3 S180 ; set chamber fan speed to Prevent PLA jamming",
"M106 P2 S100 ; Turn on aux fan to cool toolhead",
"M104 S{temp} ; Set extruder temp to 220°C earlier, reduce wait time",
";===== Mech mode fast check =======================",
"G1 X128 Y128 Z10 F20000 ; Move to center for check",
"M400 P200 ; Wait and perform check",
"M970.3 Q1 A7 B30 C80 H15 K0 ; Custom command (mechanical check)",
"M974 Q1 S2 P0 ; Custom command",
"G1 X128 Y128 Z10 F20000 ; Move again to center for check",
"M400 P200 ; Wait and perform another check",
"M970.3 Q0 A7 B30 C90 Q0 H15 K0 ; Custom command",
"M974 Q0 S2 P0 ; Custom command",
"M975 S1 ; Turn on feature (vibration suppression)",
"G1 F30000 ; Set fast feedrate",
"M73 P37 R8 ; Update progress and time remaining",
"G1 X230 Y15 ; Move to X230 Y15",
"G28 X ; Re-home X and Y",
";===== Nozzle load line ===========================",
"M975 S1 ; Turn on vibration suppression",
"G90 ; Set to absolute positioning",
"M83 ; Set extruder to relative mode",
"T1000 ; Custom command",
"G1 X18.0 Y1.0 Z0.8 F18000 ; Move to start position",
"M109 S{temp} ; Set extruder temp to 220°C",
"G1 Z0.2 ; Lower Z to 0.2mm",
"G0 E2 F300 ; Extrude 2mm of filament",
"G0 X240 E25 F5539.96 ; Move to X240 while extruding",
"G0 Y15 E1.166 F1384.99 ; Move along Y while extruding",
"G0 X239.5 ; Move to X239.5",
"G0 E0.2 ; Extrude 0.2mm of filament",
"G0 Y1.5 E1.166 ; Move along Y while extruding",
"G0 X18 E25 F5539.96 ; Return to start position while extruding",
"M400 ; Wait for all moves to finish",
";===== Final Preparations =========================",
";G29.1 Z-0.04 ; Adjust Z-offset for textured PEI plate",
"M1002 gcode_claim_action : 0 ; Claim action",
"M106 S0 ; Turn off part fan",
"M106 P2 S0 ; Turn off aux fan",
"M106 P3 S0 ; Turn off chamber fan",
"M975 S1 ; Turn on mechanical mode suppression",
"G90 ; Set to absolute positioning",
"G21 ; Set units to millimeters",
"M83 ; Use relative distances for extrusion",
"M106 P3 S200 ; Set chamber fan speed to 200 (prevents PLA jamming)",
"M981 S1 P20000 ; Open spaghetti detector"
],
"gcodePost": [
"; ===== FOOTER =====================================",
"M106 S0 ; Turn off part cooling fan",
"M106 P2 S0 ; Turn off auxiliary cooling fan",
"M981 S0 P20000 ; Close spaghetti detector",
"M106 P3 S0 ; Turn off chamber fan",
"M400 ; Wait for buffer to clear",
"G92 E0 ; Zero the extruder",
"G1 E-0.8 F1800 ; Retract filament by 0.8mm",
"G91 ; relative moves",
"G1 Z5 F900 ; drop bed 5mm",
"G90 ; absolute moves",
"G1 X65 Y245 F12000 ; Move to safe position X65 Y245",
"G1 Y265 F3000 ; Move to Y265 slowly",
"G1 X65 Y245 F12000 ; Move back to X65 Y245",
"G1 Y265 F3000 ; Move to Y265 slowly again",
"M140 S0 ; Turn off heated bed",
"M106 S0 ; Turn off part cooling fan",
"M106 P2 S0 ; Turn off auxiliary cooling fan",
"M106 P3 S0 ; Turn off chamber cooling fan",
"G1 X100 F12000 ; Wipe nozzle",
"M620 S255 ; Pull back filament to AMS",
"G1 X20 Y50 F12000 ; Move to X20 Y50",
"G1 Y-3 ; Move down Y-axis by 3",
"T255 ; Tool change command (educated guess)",
"G1 X65 F12000 ; Move to X65",
"G1 Y265 ; Move to Y265",
"G1 X100 F12000 ; Wipe nozzle again",
"M621 S255 ; Custom command (educated guess)",
"M104 S0 ; Turn off hotend",
"M622.1 S1 ; Enable feature (default for older firmware)",
"M1002 judge_flag timelapse_record_flag ; Check if timelapse recording is needed",
"M622 J1 ; Enable timelapse",
" M400 ; Wait for all motions to complete",
" M991 S0 P-1 ; End smooth timelapse at safe position",
" M400 S3 ; Wait for last picture to be taken",
"M623 ; End of \"timelapse_record_flag\"",
"M400 ; Wait for all motions to complete",
"M17 S ; Engage stepper motors",
"M17 Z0.4 ; Lower Z motor current to reduce impact if obstruction exists",
"G1 Z{z_max} F600 ; Drop bed",
"M400 P100 ; Wait for 100ms",
"M17 R ; Restore Z motor current",
"M220 S100 ; Reset feedrate magnitude to 100%",
"M201.2 K1.0 ; Reset acceleration magnitude",
"M73.2 R1.0 ; Reset remaining time magnitude",
"M1002 set_gcode_claim_speed_level : 0 ; Set G-code claim speed level to 0",
"M17 X0.8 Y0.8 Z0.5 ; Lower motor current to 45% power",
"M73 P100 R0 ; Set progress to 100% with 0 remaining time"
],
"gcodeChange": [
"; BEGIN tool change from {last_tool} to {tool}",
"M620 S{tool}A ; prepare tool change",
"M204 S9000 ; Set acceleration to 9000 mm/s^2",
"M620.11 S0 ; Reset filament retraction state",
"M400 ; wait for moves to complete",
"M620.1 E F187 T240 ; set purge rate 187 temp 240",
"T{tool} ; initiate tool change",
"M620.1 E F374 T240 ; set purge rate 374 temp 240",
"M620.11 S0 ; Reset filament retraction state",
"G92 E0 ; reset extruder position",
"M400 ; wait for moves to complete",
" ; -- PURGE --",
"M109 S240 ; Set nozzle temperature to 240°C",
"G1 E23.7 F187 ; Extrude 23.7mm of filament at flowrate 187",
"G1 E0.914611 F50 ; Pulsatile extrusion",
"G1 E10.518 F187 ; Continue extrusion at flowrate 187",
"G1 E0.914611 F50 ; Pulsatile extrusion",
"G1 E10.518 F374 ; Continue extrusion at flowrate 374",
"G1 E0.914611 F50 ; Pulsatile extrusion",
"G1 E10.518 F374 ; Continue extrusion at flowrate 374",
"G1 E0.914611 F50 ; Pulsatile extrusion",
"G1 E10.518 F374 ; Continue extrusion at flowrate 374",
"G1 E-2 F1800 ; Retract filament by 2mm",
"G1 E2 F300 ; Recover retraction slowly",
"M400 ; Wait for all movements to complete",
"M109 S{temp} ; Set nozzle temperature back to print temp",
" ; -- SHAKE --",
"M106 P1 S255 ; Turn on nozzle cooling fan to full speed",
"M400 S3 ; Wait for all movements to complete",
"G1 X70 F5000 ; Move to X70",
"G1 X90 F3000 ; Move to X90",
"G1 Y255 F4000 ; Move to Y255",
"G1 X105 F5000 ; Move to X105",
"G1 Y265 ; Move to Y265",
"G1 X70 F10000 ; Rapid move to X70",
"G1 X100 F5000 ; Move to X100",
"G1 X70 F10000 ; Rapid move back to X70",
"G1 X100 F5000 ; Move to X100",
"G1 X70 F10000 ; Shake filament residue",
"G1 X80 F15000",
"G1 X60",
"G1 X80",
"G1 X60",
"G1 X80 ; Shake to put down garbage",
"G1 X100 F5000 ; Move to X100",
"G1 X165 F15000 ; Wipe and shake",
"G1 Y256 ; Move Y aside to prevent collision",
"M400 ; Wait for all movements to complete",
"M204 S10000 ; Set acceleration to 10000 mm/s^2",
"M621 S{tool}A ; complete tool change",
"; END tool change"
],
"gcodeProc": "",
"gcodeFExt": "gcode",
"extruders": [
{
"extFilament": 1.75,
"extNozzle": 0.4,
"extOffsetX": 0,
"extOffsetY": 0
},
{
"extFilament": 1.75,
"extNozzle": 0.4,
"extOffsetX": 0,
"extOffsetY": 0
},
{
"extFilament": 1.75,
"extNozzle": 0.4,
"extOffsetX": 0,
"extOffsetY": 0
},
{
"extFilament": 1.75,
"extNozzle": 0.4,
"extOffsetX": 0,
"extOffsetY": 0
}
],
"new": false,
"deviceName": "Bambu P1S",
"bedBelt": false,
"fwRetract": false,
"filamentSource": "direct",
"extras": {
"bbl": {}
},
"imageURL": "",
"deviceZMax": 0,
"gcodeTime": 1,
"gcodeFeature": [],
"profiles": [
{
"processName": "Bambu PLA",
"sliceHeight": 0.2,
"sliceShells": 2,
"sliceShellOrder": "in-out",
"sliceLayerStart": "last",
"sliceFillAngle": 45,
"sliceFillOverlap": 0.35,
"sliceFillSparse": 0.1,
"sliceFillType": "hex",
"sliceAdaptive": false,
"sliceMinHeight": 0,
"sliceSupportDensity": 0.2,
"sliceSupportOffset": 0.4,
"sliceSupportGap": 1,
"sliceSupportSize": 5,
"sliceSupportArea": 0.25,
"sliceSupportExtra": 0,
"sliceSupportAngle": 60,
"sliceSupportNozzle": 0,
"sliceSolidMinArea": 0,
"sliceBottomLayers": 2,
"sliceTopLayers": 3,
"firstLayerRate": 20,
"firstLayerPrintMult": 1,
"firstLayerYOffset": 0,
"firstLayerBrim": 0,
"firstLayerBeltLead": 0,
"firstLayerFanSpeed": 0,
"outputTemp": 210,
"outputBedTemp": 60,
"outputFanSpeed": 255,
"outputFeedrate": 110,
"outputFinishrate": 90,
"outputSeekrate": 200,
"outputShellMult": 1.2,
"outputFillMult": 1.2,
"outputSparseMult": 1.2,
"outputRetractDist": 1,
"outputRetractSpeed": 80,
"outputRetractWipe": 0,
"outputRetractDwell": 0,
"outputShortPoly": 50,
"outputMinSpeed": 5,
"outputCoastDist": 0,
"outputLayerRetract": false,
"zHopDistance": 0,
"antiBacklash": 0,
"sliceFillWidth": 1,
"sliceFillRate": 0,
"sliceSupportEnable": false,
"firstSliceHeight": 0.3,
"firstLayerFillRate": 80,
"firstLayerLineMult": 1,
"firstLayerNozzleTemp": 220,
"firstLayerBedTemp": 65,
"firstLayerBrimTrig": 0,
"firstLayerBrimGap": 0,
"outputRaft": false,
"outputRaftSpacing": 0.2,
"outputBrimCount": 0,
"outputBrimOffset": 2,
"outputPurgeTower": 0,
"outputInvertX": false,
"outputInvertY": false,
"arcTolerance": 0,
"ranges": [],
"sliceLineWidth": 0,
"sliceFillRepeat": 2,
"firstLayerBrimIn": 0,
"firstLayerBeltBump": 0,
"outputBeltFirst": false,
"outputLoops": 0,
"sliceFillGrow": 0,
"sliceSolidRate": 0,
"sliceSupportSpan": 5,
"sliceSupportOutline": false,
"firstLayerFlatten": 0,
"outputDraftShield": false,
"outputAvoidGaps": true,
"sliceDetectThin": "off",
"outputAlternating": false,
"sliceLayerStartX": 0,
"sliceLayerStartY": 0,
"sliceSupportGrow": 0,
"outputFanLayer": 1,
"outputNozzle": 0,
"sliceAngle": 45,
"sliceZInterleave": false
}
]
}

View file

@ -0,0 +1,51 @@
{
"pre":[
"M140 S{bed_temp} ; Set bed temp",
"M105 ; Report Temps",
"M190 S{bed_temp} ; Wait for bed to reach target",
"M104 S{temp} ; Set hot end temp",
"M105 ; Report Temps",
"M109 S{temp} ; Wait for hot end to reach target",
"M82 ; Absolute extrusion mode",
"G28 ; Home",
"G29 ; Auto bed Level",
"G92 E0 ; Reset Extruder",
"G1 Z2.0 F3000 ; Move Z Axis up",
"G1 X10.1 Y20 Z0.28 F5000.0 ; Move to start position",
"G1 X10.1 Y200.0 Z0.28 F1500.0 E15 ; Draw the first line",
"G1 X10.4 Y200.0 Z0.28 F5000.0 ; Move to side a little",
"G1 X10.4 Y20 Z0.28 F1500.0 E30 ; Draw the second line",
"G92 E0 ; Reset Extruder",
"G1 Z2.0 F3000 ; Move Z Axis up",
"G92 E0 ; Reset Extruder"
],
"post":[
"M107 ; Turn off cooling fan",
"G91 ; Relative positioning",
"G1 E-2 F2700 ; Retract",
"G1 Z10 ; Raise Z",
"G90 ; Absolute positioning",
"G1 X0 Y300 ; Eject print",
"M104 S0 ; Turn-off hot end",
"M140 S0 ; Turn-off bed",
"M84 X Y E ; Disable steppers except Z"
],
"extruders":[
{
"nozzle": 0.4,
"filament": 1.75,
"offset_x": 0,
"offset_y": 0
}
],
"cmd":{
"fan_power": "M106 S{fan_speed}"
},
"settings":{
"origin_center": false,
"extrude_abs": true,
"bed_width": 300,
"bed_depth": 300,
"build_height": 400
}
}

View file

@ -0,0 +1,50 @@
{
"pre":[
"M140 S{bed_temp} ; Set bed temp",
"M105 ; Report Temps",
"M190 S{bed_temp} ; Wait for bed to reach target",
"M104 S{temp} ; Set hot end temp",
"M105 ; Report Temps",
"M109 S{temp} ; Wait for hot end to reach target",
"M82 ; Absolute extrusion mode",
"G28 ; Home",
"G92 E0 ; Reset Extruder",
"G1 Z2.0 F3000 ; Move Z Axis up",
"G1 X10.1 Y20 Z0.28 F5000.0 ; Move to start position",
"G1 X10.1 Y200.0 Z0.28 F1500.0 E15 ; Draw the first line",
"G1 X10.4 Y200.0 Z0.28 F5000.0 ; Move to side a little",
"G1 X10.4 Y20 Z0.28 F1500.0 E30 ; Draw the second line",
"G92 E0 ; Reset Extruder",
"G1 Z2.0 F3000 ; Move Z Axis up",
"G92 E0 ; Reset Extruder"
],
"post":[
"M107 ; Turn off cooling fan",
"G91 ; Relative positioning",
"G1 E-2 F2700 ; Retract",
"G1 Z10 ; Raise Z",
"G90 ; Absolute positioning",
"G1 X0 Y300 ; Eject print",
"M104 S0 ; Turn-off hot end",
"M140 S0 ; Turn-off bed",
"M84 X Y E ; Disable steppers except Z"
],
"extruders":[
{
"nozzle": 0.4,
"filament": 1.75,
"offset_x": 0,
"offset_y": 0
}
],
"cmd":{
"fan_power": "M106 S{fan_speed}"
},
"settings":{
"origin_center": false,
"extrude_abs": true,
"bed_width": 300,
"bed_depth": 300,
"build_height": 400
}
}

View file

@ -0,0 +1,172 @@
{
"pre":[
"G28 ; home axes",
"G1 Y50 F1000 ; lift y axis off belt for heating",
"M107 ; turn off filament cooling fan",
"M140 S{bed_temp} ; set bed temp",
"M104 S{temp} ; set hot end temp",
"M105 ; report temps",
"M190 S{bed_temp} ; wait for bed",
"M105 ; report temps",
"M109 S{temp} ; wait for hot end",
"M82 ; absolute extrusion mode",
"G90 ; absolute positioning mode",
"G21 ; use metric values",
"G92 E0 Z0 ; zero E/Z axes",
"G1 Y0.15 ; move head to belt",
"G1 X200 E35 F800 ; extruder purge line",
"G1 Z0.3 ; shift belt away 0.3mm",
"G1 X0 E70 ; extruder purge line",
"G92 Z0 E0 ; reset bed + extruder position",
"M117 CR-30 Printing..."
],
"post":[
"M107 ; disable cooling fan",
"M106 P0 S0 ; disable cooling fan",
"M104 S0 ; shut down hot end",
"M140 S0 ; shut down bed",
"G92 E1 ; set filament position",
"G1 E-1 F300 ; retract filament",
"G28 X ; home X axis",
"G1 Y50 F1000 ; lift y axis",
"M84 ; disable stepper motors"
],
"extruders":[
{
"nozzle": 0.4,
"filament": 1.75,
"offset_x": 0,
"offset_y": 0
}
],
"cmd":{
"fan_power": "M106 S{fan_speed}",
"progress": "M117 {progress}% layer {layer} / {layers}",
"layer": [
";; --- layer {layer} {height} @ {z} ---",
"M117 {progress}% layer {layer} / {layers}"
]
},
"settings":{
"image_url": "/decal/3dprintmill.png",
"image_anchor": 0,
"image_scale": 1,
"origin_center": false,
"extrude_abs": true,
"bed_belt": true,
"bed_width": 220,
"bed_depth": 350,
"build_height": 170
},
"profiles":[{
"processName": "CR30 PLA",
"sliceHeight": 0.20,
"sliceShells": 3,
"sliceShellOrder": "in-out",
"sliceLayerStart": "last",
"sliceFillAngle": 45,
"sliceFillOverlap": 0.3,
"sliceFillSparse": 0.2,
"sliceFillType": "linear",
"sliceFillRepeat": 3,
"sliceAdaptive": false,
"sliceMinHeight": 0,
"sliceSupportDensity": 0.25,
"sliceSupportOffset": 0.4,
"sliceSupportGap": 0,
"sliceSupportSize": 6,
"sliceSupportArea": 0.25,
"sliceSupportExtra": 0,
"sliceSupportAngle": 1,
"sliceSupportNozzle": 0,
"sliceSolidMinArea": 5,
"sliceSolidLayers": 3,
"sliceBottomLayers": 3,
"sliceTopLayers": 3,
"firstLayerRate": 10,
"firstLayerPrintMult": 1.0,
"firstLayerYOffset": 0,
"firstLayerBrim": 0,
"firstLayerBeltLead": 0,
"firstLayerFanSpeed": 0,
"outputLoops": 0,
"outputTemp": 210,
"outputFanMax": 255,
"outputBedTemp": 70,
"outputFanSpeed": 255,
"outputFeedrate": 30,
"outputFinishrate": 20,
"outputSeekrate": 80,
"outputShellMult": 1.15,
"outputFillMult": 1.15,
"outputSparseMult": 1.15,
"outputFanLayer": 0,
"outputRetractDist": 6,
"outputRetractSpeed": 70,
"outputRetractWipe": 0,
"outputRetractDwell": 0,
"outputShortPoly": 50.0,
"outputMinSpeed": 5.0,
"outputCoastDist": 0.3,
"outputWipeDistance": 0,
"outputLayerRetract": false,
"detectThinWalls": false,
"zHopDistance": 0,
"antiBacklash": 0
},{
"processName": "CR30 PETG",
"sliceHeight": 0.20,
"sliceShells": 3,
"sliceShellOrder": "in-out",
"sliceLayerStart": "last",
"sliceFillAngle": 45,
"sliceFillOverlap": 0.3,
"sliceFillSparse": 0.2,
"sliceFillType": "linear",
"sliceFillRepeat": 3,
"sliceAdaptive": false,
"sliceMinHeight": 0,
"sliceSupportDensity": 0.25,
"sliceSupportOffset": 0.4,
"sliceSupportGap": 0,
"sliceSupportSize": 6,
"sliceSupportArea": 0.25,
"sliceSupportExtra": 0,
"sliceSupportAngle": 1,
"sliceSupportNozzle": 0,
"sliceSolidMinArea": 5,
"sliceSolidLayers": 3,
"sliceBottomLayers": 3,
"sliceTopLayers": 3,
"firstLayerRate": 10,
"firstLayerPrintMult": 1.0,
"firstLayerYOffset": 0,
"firstLayerBrim": 0,
"firstLayerBeltLead": 0,
"firstLayerFanSpeed": 0,
"outputLoops": 0,
"outputTemp": 240,
"outputFanMax": 0,
"outputBedTemp": 70,
"outputFanSpeed": 0,
"outputFeedrate": 30,
"outputFinishrate": 30,
"outputSeekrate": 80,
"outputShellMult": 1.15,
"outputFillMult": 1.15,
"outputSparseMult": 1.15,
"outputFanLayer": 0,
"outputRetractDist": 6,
"outputRetractSpeed": 70,
"outputRetractWipe": 0,
"outputRetractDwell": 0,
"outputShortPoly": 50.0,
"outputMinSpeed": 5.0,
"outputCoastDist": 0.3,
"outputWipeDistance": 0,
"outputLayerRetract": false,
"detectThinWalls": false,
"zHopDistance": 0,
"antiBacklash": 0
}]
}

View file

@ -0,0 +1,153 @@
{
"deviceName": "Creality Ender 3",
"new": false,
"mode": "FDM",
"internal": 0,
"bedWidth": 220,
"bedDepth": 220,
"maxHeight": 300,
"bedRound": false,
"bedBelt": false,
"deviceZMax": 0,
"originCenter": false,
"extrudeAbs": true,
"spindleMax": 0,
"gcodeFan": [
"M106 S{fan_speed}"
],
"gcodeTrack": [
"M73 P{progress}"
],
"gcodeLayer": [
";; LAYER {layer} of {layers}",
"M117 Layer {layer} of {layers}"
],
"gcodePre": [
"M104 S160 ; set extruder temp",
"M140 S{bed_temp} ; set bed temp",
"M190 S{bed_temp} ; wait for bed temp",
"G28 W ; home all without mesh bed level",
"G80 ; mesh bed leveling",
"G90 ; set absolute positioning mode",
"M83 ; set relative positioning for extruder",
"G1 F1000 ; set feedrate",
"G1 Y-3.0 Z0.5 ; park outside print area",
"M104 S{temp} ; set extruder actual required temp",
"M109 S{temp} ; wait for extruder actual required temp",
"G1 X60.0 E9.0 ; purge line",
"G1 X100.0 E12.5 ; purge line",
"M117 Printing"
],
"gcodePost": [
"G0 E-1 F900 ; retract slightly",
"M104 S0 ; turn off nozzle heat",
"M140 S0 ; turn off bed heat",
"M107 ; turn off fan",
"G0 F3000 ; set feedrate",
"G0 Y210 Z210 ; serve up print",
"G4 ; wait",
"M84 ; disable steppers",
"M117 Print Done"
],
"gcodeProc": "",
"gcodeDwell": [],
"gcodeSpindle": [],
"gcodeChange": [],
"gcodeFExt": "gcode",
"gcodeSpace": true,
"gcodeStrip": false,
"gcodeLaserOn": [],
"gcodeLaserOff": [],
"extruders": [
{
"extFilament": 1.75,
"extNozzle": 0.4,
"extOffsetX": 0,
"extOffsetY": 0
}
],
"fwRetract": false,
"profiles": [
{
"processName": "Ender 3 PLA",
"sliceHeight": 0.2,
"sliceShells": 3,
"sliceShellOrder": "in-out",
"sliceLayerStart": "center",
"sliceFillAngle": 45,
"sliceFillOverlap": 0.35,
"sliceFillSparse": 0.1,
"sliceFillType": "hex",
"sliceAdaptive": false,
"sliceMinHeight": 0,
"sliceSupportDensity": 0.25,
"sliceSupportOffset": 0.4,
"sliceSupportGap": 0,
"sliceSupportSize": 6,
"sliceSupportArea": 0.25,
"sliceSupportExtra": 0,
"sliceSupportAngle": 1,
"sliceSupportNozzle": 0,
"sliceSolidMinArea": 5,
"sliceSolidLayers": 2,
"sliceBottomLayers": 2,
"sliceTopLayers": 3,
"firstLayerRate": 10,
"firstLayerPrintMult": 1,
"firstLayerYOffset": 0,
"firstLayerBrim": 0,
"firstLayerBeltLead": 200,
"firstLayerFanSpeed": 0,
"outputTemp": 205,
"outputBedTemp": 70,
"outputFanSpeed": 255,
"outputFeedrate": 80,
"outputFinishrate": 30,
"outputSeekrate": 150,
"outputShellMult": 1.35,
"outputFillMult": 1.3,
"outputSparseMult": 1.3,
"outputRetractDist": 4,
"outputRetractSpeed": 60,
"outputRetractWipe": 2,
"outputRetractDwell": 0,
"outputShortPoly": 50,
"outputMinSpeed": 1,
"outputCoastDist": 0.05,
"outputLayerRetract": false,
"zHopDistance": 0.1,
"antiBacklash": 0,
"sliceFillWidth": 1,
"sliceFillRate": 0,
"sliceSupportEnable": false,
"firstSliceHeight": 0.2,
"firstLayerFillRate": 35,
"firstLayerLineMult": 1,
"firstLayerNozzleTemp": 0,
"firstLayerBedTemp": 0,
"firstLayerBrimTrig": 0,
"firstLayerBrimGap": 0,
"outputRaft": false,
"outputRaftSpacing": 0.2,
"outputBrimCount": 0,
"outputBrimOffset": 2,
"outputPurgeTower": 0,
"outputInvertX": false,
"outputInvertY": false,
"arcTolerance": 0,
"ranges": [],
"outputLoops": 0,
"firstLayerBrimIn": 0,
"firstLayerBeltBump": 0,
"outputBeltFirst": false,
"sliceFillRepeat": 4,
"sliceLineWidth": 0,
"sliceSupportSpan": 5,
"sliceSupportOutline": true,
"firstLayerFlatten": 0,
"outputDraftShield": false,
"outputAvoidGaps": true,
"sliceDetectThin": "off"
}
]
}

View file

@ -0,0 +1,38 @@
{
"pre":[
"M107 ; turn off filament cooling fan",
"G90 ; set absolute positioning mode",
"M82 ; set absolute positioning for extruder",
"M104 S{temp} T{tool} ; set extruder temperature",
"M140 S{bed_temp} T{tool} ; set bed temperature",
"G28 ; home axes",
"G92 E0 ; reset extruder position",
"M109 S{temp} T{tool} ; wait for extruder to reach target temp",
"M190 S{bed_temp} T{tool} ; wait for bed to reach target temp"
],
"post":[
"M107 ; turn off filament cooling fan",
"M104 S0 T{tool} ; turn off right extruder",
"M140 S0 T{tool} ; turn off bed",
"G28 XY ; home XY",
"M84 ; disable stepper motors"
],
"extruders":[
{
"nozzle": 0.4,
"filament": 1.75,
"offset_x": 0,
"offset_y": 0
}
],
"cmd":{
"fan_power": "M106 S{fan_speed}"
},
"settings":{
"origin_center": false,
"extrude_abs": true,
"bed_width": 220,
"bed_depth": 220,
"build_height": 300
}
}

View file

@ -0,0 +1,38 @@
{
"pre":[
"M107 ; turn off filament cooling fan",
"M82 ; set absolute positioning for extruder",
"M104 S{temp} T{tool} ; set extruder temperature",
"M140 S{bed_temp} T{tool} ; set bed temperature",
"G28 ; home axes",
"G92 E0 ; reset extruder position",
"G0 Z2 ; park Z at 2mm over bed for heating",
"M109 S{temp} T{tool} ; wait for extruder to reach target temp",
"M190 S{bed_temp} T{tool} ; wait for bed to reach target temp"
],
"post":[
"M107 ; turn off filament cooling fan",
"M104 S0 T{tool} ; turn off right extruder",
"M140 S0 T{tool} ; turn off bed",
"G28 XY ; home XY",
"M84 ; disable stepper motors"
],
"extruders":[
{
"nozzle": 0.4,
"filament": 1.75,
"offset_x": 0,
"offset_y": 0
}
],
"cmd":{
"fan_power": "M106 S{fan_speed}"
},
"settings":{
"origin_center": false,
"extrude_abs": true,
"bed_width": 250,
"bed_depth": 250,
"build_height": 400
}
}

View file

@ -0,0 +1,51 @@
{
"mode": "FDM",
"internal": 0,
"imageURL": "",
"bedHeight": 2.5,
"bedWidth": 220,
"bedDepth": 220,
"bedRound": false,
"bedBelt": false,
"deviceZMax": 0,
"gcodeTime": 1,
"maxHeight": 250,
"originCenter": false,
"gcodeFan": [
"M106 S{fan_speed}"
],
"gcodeFeature": [],
"gcodeTrack": [],
"gcodeLayer": [],
"gcodePre": [
"M140 S0",
"M104 S0 ",
"START_PRINT EXTRUDER_TEMP=220.000000 BED_TEMP=45.000000",
"G92 E0",
"G1 F2400 E-0.5"
],
"gcodePost": [
"M106 S0",
"M106 P2 S0",
"M106 P1 S0",
"END_PRINT",
"M82 ;absolute extrusion mode",
"M104 S0"
],
"gcodeProc": "",
"gcodeFExt": "gcode",
"extruders": [
{
"extFilament": 1.75,
"extNozzle": 0.4,
"extOffsetX": 0,
"extOffsetY": 0
}
],
"new": false,
"deviceName": "Creality K1",
"fwRetract": false,
"filamentSource": "direct",
"profiles": [],
"extras": {}
}

View file

@ -0,0 +1,152 @@
{
"pre":[
"M107 ; turn off filament cooling fan",
"G90 ; set absolute positioning mode",
"M82 ; set absolute positioning for extruder",
"M104 S{temp} T{tool} ; set extruder temperature",
"M140 S{bed_temp} T{tool} ; set bed temperature",
"G28 ; home axes",
"G92 E0 ; reset extruder position",
"M109 S{temp} T{tool} ; wait for extruder to reach target temp",
"M190 S{bed_temp} T{tool} ; wait for bed to reach target temp"
],
"post":[
"M107 ; turn off filament cooling fan",
"M104 S0 T{tool} ; turn off right extruder",
"M140 S0 T{tool} ; turn off bed",
"G28 XY ; home XY",
"M84 ; disable stepper motors"
],
"extruders":[
{
"nozzle": 0.4,
"filament": 1.75,
"offset_x": 0,
"offset_y": 0
}
],
"cmd":{
"fan_power": "M106 S{fan_speed}"
},
"settings":{
"origin_center": false,
"extrude_abs": true,
"bed_width": 280,
"bed_depth": 260,
"build_height": 310
},
"profiles":[{
"processName": "Sermoon PLA",
"sliceHeight": 0.25,
"sliceShells": 3,
"sliceShellOrder": "in-out",
"sliceLayerStart": "last",
"sliceFillAngle": 45,
"sliceFillWidth": 1,
"sliceFillOverlap": 0.35,
"sliceFillSparse": 0.2,
"sliceFillType": "hex",
"sliceAdaptive": false,
"sliceMinHeight": 0,
"sliceSupportDensity": 0.25,
"sliceSupportOffset": 0.6,
"sliceSupportGap": 1,
"sliceSupportSize": 6,
"sliceSupportArea": 0.25,
"sliceSupportExtra": 0,
"sliceSupportAngle": 50,
"sliceSupportNozzle": 0,
"sliceSolidMinArea": 1,
"sliceSolidLayers": 3,
"sliceBottomLayers": 3,
"sliceTopLayers": 3,
"firstLayerNozzleTemp": 0,
"firstLayerBedTemp": 0,
"firstLayerRate": 20,
"firstLayerFillRate": 35,
"firstLayerPrintMult": 1.10,
"firstLayerLineMult": 1.0,
"firstLayerFanSpeed": 0,
"outputRaft": false,
"outputRaftSpacing": 0.2,
"outputTemp": 210,
"outputFanMax": 255,
"outputBedTemp": 70,
"outputFanSpeed": 255,
"outputFeedrate": 55,
"outputFinishrate": 50,
"outputSeekrate": 80,
"outputShellMult": 1.2,
"outputFillMult": 1.3,
"outputSparseMult": 1.3,
"outputBrimCount": 2,
"outputBrimOffset": 2,
"outputRetractDist": 1,
"outputRetractSpeed": 50,
"outputRetractWipe": 0,
"outputRetractDwell": 10,
"outputShortPoly": 50.0,
"outputMinSpeed": 10.0,
"outputCoastDist": 0,
"outputLayerRetract": false,
"detectThinWalls": false,
"zHopDistance": 0,
"antiBacklash": 0
},{
"processName": "Sermoon PETG",
"sliceHeight": 0.25,
"sliceShells": 3,
"sliceShellOrder": "in-out",
"sliceLayerStart": "last",
"sliceFillAngle": 45,
"sliceFillWidth": 1,
"sliceFillOverlap": 0.35,
"sliceFillSparse": 0.2,
"sliceFillType": "hex",
"sliceAdaptive": false,
"sliceMinHeight": 0,
"sliceSupportDensity": 0.25,
"sliceSupportOffset": 0.6,
"sliceSupportGap": 1,
"sliceSupportSize": 6,
"sliceSupportArea": 0.25,
"sliceSupportExtra": 0,
"sliceSupportAngle": 50,
"sliceSupportNozzle": 0,
"sliceSolidMinArea": 1,
"sliceSolidLayers": 3,
"sliceBottomLayers": 3,
"sliceTopLayers": 3,
"firstLayerNozzleTemp": 0,
"firstLayerBedTemp": 0,
"firstLayerRate": 20,
"firstLayerFillRate": 35,
"firstLayerPrintMult": 1.10,
"firstLayerLineMult": 1.0,
"firstLayerFanSpeed": 0,
"outputRaft": false,
"outputRaftSpacing": 0.2,
"outputTemp": 230,
"outputFanMax": 255,
"outputBedTemp": 85,
"outputFanSpeed": 255,
"outputFeedrate": 55,
"outputFinishrate": 50,
"outputSeekrate": 100,
"outputShellMult": 1.2,
"outputFillMult": 1.3,
"outputSparseMult": 1.3,
"outputBrimCount": 2,
"outputBrimOffset": 2,
"outputRetractDist": 1.5,
"outputRetractSpeed": 50,
"outputRetractWipe": 0,
"outputRetractDwell": 10,
"outputShortPoly": 50.0,
"outputMinSpeed": 10.0,
"outputCoastDist": 0,
"outputLayerRetract": false,
"detectThinWalls": false,
"zHopDistance": 0,
"antiBacklash": 0
}]}

View file

@ -0,0 +1,37 @@
{
"pre":[
"M104 S{temp} T{tool} ; set extruder temperature",
"M140 S{bed_temp} T{tool} ; set bed temperature",
"M190 S{bed_temp} T{tool} ; set bed temperature",
"M109 S{temp} T{tool} ; set extruder temperature",
"M901 S35 ; set chamber temperature to 35 (standard)",
"G90 ; set absolute positioning mode",
"M82 ; set absolute positioning for extruder",
"M107 ; turn off filament cooling fan",
"G28 ; home axes",
"G29 ; level bed",
"G92 E0 ; reset all axes positions",
"G1 X0 Y0 Z0.25 F180 ; move xy to 0,0 and z 0.25mm over bed",
"G92 E0 ; zero the extruder",
"G1 E15 F200 ; purge 15mm from extruder",
"G92 E0 ; zero the extruded"
],
"post":[
"M107 ; turn off filament cooling fan",
"M104 S0 T{tool} ; turn off right extruder",
"M140 S0 ; turn off bed",
"M904 ; park extruder",
"M84 ; disable stepper motors"
],
"cmd":{
"fan_power": "M106 S{fan_speed}"
},
"file-ext": "hvs",
"settings":{
"origin_center": false,
"extrude_abs": true,
"bed_width": 240,
"bed_depth": 190,
"build_height": 200
}
}

View file

@ -0,0 +1,32 @@
{
"pre":[
"T{tool} ; select extruder #0",
"M104 S{temp} ; set nozzle temp",
"M140 S{bed_temp} T{tool} ; set bed temperature",
"M109 S{temp} ; wait for nozzle to heat",
"S210 T{tool} ; wait for heating?",
"M82 ; absolute extrusion mode",
"G28 ; home",
"G1 Z15 F6000 ; lower platform 15mm",
"G92 E0 ; zero out extruder position",
"G1 F200 E3 ; prime the extruder 3mm"
],
"post":[
"M107 ; turn off filament cooling fan",
"M104 S0 T{tool} ; turn off right extruder",
"M140 S0 ; turn off bed",
"M904 ; park extruder",
"M84 ; disable stepper motors"
],
"cmd":{
"fan_power": "M106 S{fan_speed}"
},
"file-ext": "hvs",
"settings":{
"origin_center": false,
"extrude_abs": true,
"bed_width": 150,
"bed_depth": 150,
"build_height": 150
}
}

View file

@ -0,0 +1,166 @@
{
"mode": "FDM",
"internal": 0,
"bedHeight": 2.5,
"bedWidth": 205,
"bedDepth": 205,
"bedRound": false,
"bedBelt": false,
"deviceZMax": 0,
"gcodeTime": 1,
"maxHeight": 205,
"originCenter": false,
"gcodeFan": [],
"gcodeFeature": [],
"gcodeTrack": [],
"gcodeLayer": [],
"gcodePre": [
"G90",
"M106 S255",
"G28 X Y",
"G1 X50",
"M109 R90",
"G28",
"M104 S{temp}",
"G29",
"M107",
"G1 X100 Y20 F3000",
"G1 Z0.5",
"M109 S{temp}",
"M82",
"G92 E0",
"G1 F200 E10",
"G92 E0",
"G1 Z3",
"G1 F6000"
],
"gcodePost": [
"M106 S255",
"M140 S0",
"G91",
"G1 E-1 F300",
"G1 Z+3 F3000",
"G90",
"G28 X Y",
"M107",
"M84"
],
"gcodeProc": "",
"gcodeFExt": "gcode",
"extruders": [
{
"extFilament": 1.75,
"extNozzle": 0.4,
"extOffsetX": 0,
"extOffsetY": 0
}
],
"new": false,
"deviceName": "Dagoma Disco Ult V2",
"imageURL": "",
"fwRetract": false,
"filamentSource": "direct",
"profiles": [
{
"processName": "dagoma draft",
"sliceHeight": 0.2,
"sliceShells": 3,
"sliceShellOrder": "in-out",
"sliceLayerStart": "last",
"sliceLayerStartX": 0,
"sliceLayerStartY": 0,
"sliceLineWidth": 0,
"sliceFillGrow": 0,
"sliceFillAngle": 45,
"sliceFillWidth": 1,
"sliceFillOverlap": 0.25,
"sliceFillSparse": 0.1,
"sliceFillRepeat": 1,
"sliceFillRate": 0,
"sliceSolidRate": 0,
"sliceFillType": "hex",
"sliceSupportDensity": 0.15,
"sliceSupportOffset": 0,
"sliceSupportGap": 1,
"sliceSupportSize": 2,
"sliceSupportArea": 0.1,
"sliceSupportSpan": 5,
"sliceSupportGrow": 0,
"sliceSupportExtra": 0,
"sliceSupportAngle": 60,
"sliceSupportNozzle": 0,
"sliceSupportEnable": false,
"sliceSupportOutline": false,
"sliceSolidMinArea": 1,
"sliceBottomLayers": 3,
"sliceTopLayers": 3,
"firstSliceHeight": 0.05,
"firstLayerRate": 17,
"firstLayerFillRate": 17,
"firstLayerPrintMult": 1,
"firstLayerLineMult": 1,
"firstLayerYOffset": 0,
"firstLayerNozzleTemp": 205,
"firstLayerBedTemp": 0,
"firstLayerBrim": 0,
"firstLayerBrimIn": 0,
"firstLayerBrimTrig": 0,
"firstLayerBrimGap": 0,
"firstLayerBeltLead": 3,
"firstLayerBeltBump": 0,
"firstLayerFanSpeed": 0,
"firstLayerFlatten": 0,
"outputRaft": false,
"outputRaftSpacing": 0.2,
"outputDraftShield": false,
"outputTemp": 220,
"outputBedTemp": 0,
"outputFeedrate": 60,
"outputFinishrate": 60,
"outputSeekrate": 120,
"outputShellMult": 1,
"outputFillMult": 1,
"outputSparseMult": 1,
"outputFanSpeed": 255,
"outputRetractDist": 3.5,
"outputRetractSpeed": 50,
"outputRetractWipe": 0,
"outputRetractDwell": 20,
"outputBrimCount": 2,
"outputBrimOffset": 2,
"outputShortPoly": 100,
"outputMinSpeed": 10,
"outputCoastDist": 0,
"outputPurgeTower": 0,
"outputBeltFirst": false,
"outputAvoidGaps": true,
"outputAlternating": false,
"outputLayerRetract": false,
"outputLoops": 0,
"outputInvertX": false,
"outputInvertY": false,
"sliceDetectThin": "off",
"sliceMinHeight": 0.2,
"sliceAdaptive": false,
"zHopDistance": 0.2,
"arcTolerance": 0,
"antiBacklash": 1,
"ranges": [],
"outputFanLayer": 1,
"sliceAngle": 45,
"outputNozzle": 0
}
],
"extras": {
"palette": {
"printer": "ee5dd1884e2d",
"ping": null,
"feed": null,
"push": null,
"offset": null,
"heat": null,
"cool": null,
"press": null
}
}
}

View file

@ -0,0 +1,31 @@
{
"pre":[
"M104 S{temp} T{tool} ; set extruder temperature",
"G21 ; Make sure we're in metric mode",
"G90 ; set absolute positioning mode",
"M83 ; set relative positioning for extruder",
"G28 ; home axes",
"G92 E0 ; zero the extruded",
"M109 S{temp} T{tool} ; wait for extruder to reach target temp",
"G1 F200 E3.5 ; set feed speed, prime nozzle",
"G92 E0 ; zero the extruded",
"G1 Z30 ; position near the bed before first position"
],
"post":[
"G28 ; home axes",
"M104 S0 T{tool} ; turn off right extruder",
"M140 S0 T{tool} ; turn off bed",
"M84 ; disable stepper motors"
],
"cmd":{
"fan_power": "M106 S{fan_speed}"
},
"settings":{
"nozzle_size": 0.5,
"origin_center": true,
"bed_width": 240,
"bed_depth": 240,
"bed_circle": true,
"build_height": 480
}
}

View file

@ -0,0 +1,31 @@
{
"pre":[
"M104 S{temp} T{tool} ; set extruder temperature",
"G21 ; Make sure we're in metric mode",
"G90 ; set absolute positioning mode",
"M83 ; set relative positioning for extruder",
"G28 ; home axes",
"G92 E0 ; zero the extruded",
"M109 S{temp} T{tool} ; wait for extruder to reach target temp",
"G1 F200 E3.5 ; set feed speed, prime nozzle",
"G92 E0 ; zero the extruded",
"G1 Z30 ; position near the bed before first position"
],
"post":[
"G28 ; home axes",
"M104 S0 T{tool} ; turn off right extruder",
"M140 S0 T{tool} ; turn off bed",
"M84 ; disable stepper motors"
],
"cmd":{
"fan_power": "M106 S{fan_speed}"
},
"settings":{
"nozzle_size": 0.35,
"origin_center": true,
"bed_width": 240,
"bed_depth": 240,
"bed_circle": true,
"build_height": 260
}
}

View file

@ -0,0 +1,40 @@
{
"pre":[
"M104 S{temp} T0 ; set extruder temperature",
"M140 S{bed_temp} T0 ; set bed temperature",
"M190 S{bed_temp} T0 ; wait for bed to reach target temp",
"M109 S{temp} T0 ; wait for extruder to reach target temp",
"M105 ; report temperatures",
"M82 ; absolute extrusion mode",
"G21 ; metric values",
"G90 ; absolute positioning",
"M82 ; set extruder to absolute mode",
"M107 ; start with the fan off",
"G28 ; Home all axes (max endstops)",
"G1 Z15.0 F9000 ; move the platform down 15mm",
"G92 E0 ; zero the extruded length",
"G1 F200 E3 ; extrude 3mm of feed stock",
"G92 E0 ; zero the extruded length again",
"G1 F9000 ; set default move speed",
"M117 Printing...",
"G92 E0"
],
"post":[
"G28 ; home axes",
"M104 S0 T{tool} ; turn off right extruder",
"M140 S0 T{tool} ; turn off bed",
"M107 ; fan off",
"M84 ; disable stepper motors"
],
"cmd":{
"fan_power": "M106 S{fan_speed}"
},
"settings":{
"nozzle_size": 0.4,
"origin_center": true,
"bed_width": 260,
"bed_depth": 260,
"bed_circle": true,
"build_height": 320
}
}

View file

@ -0,0 +1,29 @@
{
"pre":[
"M118 X15.00 Y15.00 Z10.00 T{tool}",
"M104 S{temp} T{tool}",
"M107",
"G90",
"M132 X Y Z A B",
"M907 X100 Y100 Z40 A80 B20",
"; pre-extrude",
"G1 X-75 Y-75 Z0.35 F400",
"G1 Y75 E30 F1800"
],
"post":[
"M107",
"M104 S0 T{tool}",
"G162 Z",
"M18"
],
"cmd":{
"fan_power": "M106 S{fan_speed}"
},
"settings":{
"origin_center": true,
"extrude_abs": true,
"bed_width": 140,
"bed_depth": 140,
"build_height": 140
}
}

View file

@ -0,0 +1,43 @@
{
"pre":[
"; set bed and nozzle temps",
"M104 S{temp} T{tool}",
"M140 S{bed_temp}",
"; absolute positioning and home",
"G90",
"G28",
"; wait for nozzle and bed to reach target temps",
"M190 S{bed_temp}",
"M109 S{temp} T{tool}",
"M7 T{tool}",
"M6 T{tool}",
"; select nozzle 0",
"M108 T{tool}",
"G92 E0",
"G1 E0 F300",
"; purge nozzle",
"G1 X150 Y75 Z15 E-2 F500",
"G1 Y125 Z0.5 F600",
"G1 Y50 E40 F600"
],
"post":[
"; stop fan, cool nozzle and bed",
"M107",
"M104 S0 T{tool}",
"M140 S0",
"; slow descent of bed",
"G0 F300",
"; end print",
"M18"
],
"cmd":{
"fan_power": "M106 S{fan_speed}"
},
"settings":{
"origin_center": true,
"extrude_abs": true,
"bed_width": 280,
"bed_depth": 250,
"build_height": 300
}
}

View file

@ -0,0 +1,39 @@
{
"pre":[
"M117 Heating",
"M104 S{temp} T{tool} ; set extruder temperature",
"M140 S{bed_temp} T{tool} ; set bed temperature",
"G90 ; set absolute positioning mode",
"M83 ; set relative positioning for extruder",
"M107 ; turn off filament cooling fan",
"G28 ; home axes",
"G92 X0 Y0 Z0 E0 ; reset all axes positions",
"G1 X0 Y5 Z3 ; move XY to 0,5 and Z 3mm over bed",
"M190 S{bed_temp} T{tool} ; wait for bed to reach target temp",
"M109 S{temp} T{tool} ; wait for extruder to reach target temp",
"G0 Z0.25 ; position 0.25mm over bed",
"M117 Purge Nozzle ; announce purge",
"G1 X100 E30 F600 ; purge 30mm from extruder"
],
"post":[
"M117 Done ; announce done",
"M107 ; turn off filament cooling fan",
"M104 S0 T{tool} ; turn off extruder",
"M140 S0 T{tool} ; turn off bed",
"G91 ; relative movement",
"G1 Z10 F1200 ; drop bed 10mm",
"G90 ; absolute positioning",
"G28 X0 Y0 ; home XY axes",
"M84 ; disable stepper motors"
],
"cmd":{
"fan_power": "M106 S{fan_speed}",
"progress": "M117 {progress}% layer {layer} / {layers}"
},
"settings":{
"origin_center": false,
"bed_width": 300,
"bed_depth": 300,
"build_height": 300
}
}

View file

@ -0,0 +1,43 @@
{
"pre":[
"M117 Heating ; announce heating",
"M107 ; turn off filament cooling fan",
"M104 S{temp} T0 ; set extruder temperature",
"M140 S{bed_temp} T0 ; set bed temperature",
"G90 ; set absolute positioning mode",
"M83 ; set relative positioning for extruder",
"G28 ; home axes",
"G1 F3000 ; set default move speed",
"M190 S{bed_temp} T0 ; wait for bed to reach target temp",
"M109 S{temp} T0 ; wait for extruder to reach target temp",
"M117 Purge ; announce purge",
"G92 E0 ; set extruder position to 0",
"G1 E20 F250 ; purge 20mm from extruder",
"G1 X0 Y0 Z0 E1 F3000 ; move to origin / wipe",
"M117 Start Print ; announce start of print"
],
"post":[
"M117 Done ; announce done",
"M107 ; turn off filament cooling fan",
"M104 S0 T0 ; turn off extruder",
"M140 S0 T0 ; turn off bed",
"G91 ; relative movement",
"G1 Z10 F1200 ; drop bed 10mm",
"G90 ; absolute positioning",
"G28 X0 Y0 ; home XY axes",
"M84 ; disable stepper motors"
],
"cmd":{
"fan_power": "M106 S{fan_speed}",
"progress": "M117 {progress}% layer {layer} / {layers}"
},
"settings":{
"image_url": "/decal/gridbot.png",
"image_anchor": 0,
"image_scale": 1,
"origin_center": false,
"bed_width": 300,
"bed_depth": 300,
"build_height": 300
}
}

View file

@ -0,0 +1,43 @@
{
"pre":[
"M117 Heating ; announce heating",
"M107 ; turn off filament cooling fan",
"M104 S{temp} T0 ; set extruder temperature",
"M140 S{bed_temp} T0 ; set bed temperature",
"G90 ; set absolute positioning mode",
"M83 ; set relative positioning for extruder",
"G28 ; home axes",
"G1 F3000 ; set default move speed",
"M190 S{bed_temp} T0 ; wait for bed to reach target temp",
"M109 S{temp} T0 ; wait for extruder to reach target temp",
"M117 Purge ; announce purge",
"G92 E0 ; set extruder position to 0",
"G1 E20 F250 ; purge 20mm from extruder",
"G1 X0 Y0 Z0 E1 F3000 ; move to origin / wipe",
"M117 Start Print ; announce start of print"
],
"post":[
"M117 Done ; announce done",
"M107 ; turn off filament cooling fan",
"M104 S0 T0 ; turn off extruder",
"M140 S0 T0 ; turn off bed",
"G91 ; relative movement",
"G1 Z10 F1200 ; drop bed 10mm",
"G90 ; absolute positioning",
"G28 X0 Y0 ; home XY axes",
"M84 ; disable stepper motors"
],
"cmd":{
"fan_power": "M106 S{fan_speed}",
"progress": "M117 {progress}% layer {layer} / {layers}"
},
"settings":{
"image_url": "/decal/gridbot.png",
"image_anchor": 0,
"image_scale": 1,
"origin_center": false,
"bed_width": 300,
"bed_depth": 300,
"build_height": 300
}
}

View file

@ -0,0 +1,368 @@
{
"deviceName": "IMADE3D JellyBOX 1 N0.4",
"bedWidth": 177,
"bedDepth": 155,
"maxHeight": 140,
"mode": "FDM",
"new": false,
"internal": 0,
"imageURL": "",
"bedHeight": 2.5,
"bedRound": false,
"bedBelt": false,
"deviceZMax": 0,
"originCenter": false,
"gcodeFan": [
"M106 S{fan_speed}"
],
"gcodeTrack": [
"M117 {progress}% layer {layer} / {layers}"
],
"gcodeLayer": [
";; --- layer {layer} {height} @ {z} ---",
"M117 {progress}% layer {layer} / {layers}"
],
"gcodePre": [
";============================",
"; Jellybox Start Script Begin ",
";============================",
"; for slicer: Kiri:Moto",
"; modified 2024-02-01. by LG",
";",
"G21 ;metric values",
"G90 ;absolute positioning",
"M107 ;start with the fan off",
";",
"; === Homing and bed leveling (if necessary)",
";",
"G28 ;home all axes",
"G29 O ;auto bed leveling procedure only if leveling NOT active",
";M500 ;optionally save the mesh",
"G28 X ;home x to get as far from the plate as possible",
"M420 S1 ;(re) enable bed leveling if turned off by the G28",
"G0 Y0 F5000 ;position Y in front",
"G0 Z5 F3000 ;position Z",
"M190 S{bed_temp} T{tool} ;wait for the bed to reach desired temperature",
"M109 S{temp} T{tool} ;wait for the extruder to reach desired temperature",
"; ",
"; === Purge 30mm of the filament",
";",
"G90 ;absolute positioning",
"M400 ;make sure all is finished",
"G92 E0 ;to reset extruder position to 0 after finished previous print",
"G1 E30 F200 ;extrude 30mm of feed stock",
"G92 E0 ;reset the extruder position Z is 0 again.",
";",
";===================================",
"; Jellybox Printer Start Script End",
";==================================="
],
"gcodePost": [
";---------------------------------",
";;; Jellybox End Script Begin ;;;",
";_________________________________",
"; end gcode last modified 2022-01-13",
"M117 Finishing Up ;write Finishing Up",
"M107 ;turn the fan off",
"M104 S0 ;extruder heater off",
"M140 S0 ;bed heater off (if you have it)",
"G91 ;relative positioning (includes extruder)",
"G1 E-1 F2500 ;retract the filament a bit before lifting the nozzle to release some of the pressure",
"G1 Z0.5 E-4 X-10 F9000 ;get out and retract filament even more",
"G1 E-25 F2000 ;retract even more",
"G90 ;absolute positioning (includes extruder)",
"G28 X ;home X so the head is out of the way",
"G1 Y140 ;move Y forward, so the print is more accessible",
"M84 ;steppers off",
"M117 Print finished ;write Print finished",
";---------------------------------------",
";;; Jellybox End Script End ;;;",
";_______________________________________"
],
"gcodeProc": "",
"gcodeFExt": "gcode",
"extruders": [
{
"extFilament": 1.75,
"extNozzle": 0.4,
"extOffsetX": 0,
"extOffsetY": 0
}
],
"fwRetract": false,
"profiles": [
{
"processName": "JB1 PLA - N0.4 L0.3 T210",
"sliceHeight": 0.3,
"sliceShells": 2,
"sliceShellOrder": "in-out",
"sliceLayerStart": "last",
"sliceFillAngle": 45,
"sliceFillWidth": 1,
"sliceFillOverlap": 0.25,
"sliceFillSparse": 0.1,
"sliceFillType": "hex",
"sliceAdaptive": false,
"sliceMinHeight": 0,
"sliceSupportDensity": 0.25,
"sliceSupportOffset": 0.6,
"sliceSupportGap": 1,
"sliceSupportSize": 6,
"sliceSupportArea": 3,
"sliceSupportExtra": 0,
"sliceSupportAngle": 50,
"sliceSupportNozzle": 0,
"sliceSolidMinArea": 1,
"sliceBottomLayers": 3,
"sliceTopLayers": 3,
"firstLayerNozzleTemp": 215,
"firstLayerBedTemp": 60,
"firstLayerRate": 20,
"firstLayerFillRate": 25,
"firstLayerPrintMult": 1.2,
"firstLayerLineMult": 1,
"firstLayerFanSpeed": 0,
"outputRaft": false,
"outputRaftSpacing": 0.2,
"outputTemp": 210,
"outputBedTemp": 60,
"outputFanSpeed": 130,
"outputFeedrate": 45,
"outputFinishrate": 20,
"outputSeekrate": 80,
"outputShellMult": 1.05,
"outputFillMult": 1.05,
"outputSparseMult": 1.2,
"outputBrimCount": 5,
"outputBrimOffset": 5,
"outputRetractDist": 1.8,
"outputRetractSpeed": 40,
"outputRetractWipe": 0.8,
"outputRetractDwell": 10,
"outputShortPoly": 50,
"outputMinSpeed": 10,
"outputCoastDist": 0.4,
"outputLayerRetract": true,
"zHopDistance": 0.2,
"antiBacklash": 0,
"sliceLineWidth": 0.45,
"sliceFillRepeat": 1,
"sliceFillRate": 0,
"sliceSupportSpan": 5,
"sliceSupportEnable": false,
"sliceSupportOutline": true,
"firstSliceHeight": 0.2,
"firstLayerYOffset": 0,
"firstLayerBrim": 0,
"firstLayerBrimIn": 0,
"firstLayerBrimTrig": 0,
"firstLayerBrimGap": 0,
"firstLayerBeltLead": 3,
"firstLayerBeltBump": 0,
"firstLayerFlatten": 0,
"outputPurgeTower": 0,
"outputBeltFirst": false,
"outputLoops": 0,
"outputInvertX": false,
"outputInvertY": false,
"arcTolerance": 0.15,
"ranges": [],
"outputDraftShield": false,
"outputAvoidGaps": true,
"sliceFillGrow": 0,
"sliceSolidRate": 0,
"sliceDetectThin": "off",
"sliceLayerStartX": 0,
"sliceLayerStartY": 0,
"sliceSupportGrow": 0,
"outputAlternating": false
},
{
"processName": "JB1 FLEX - N0.4 L0.3 T235",
"sliceHeight": 0.3,
"sliceShells": 2,
"sliceShellOrder": "in-out",
"sliceLayerStart": "last",
"sliceFillAngle": 45,
"sliceFillWidth": 1,
"sliceFillOverlap": 0.25,
"sliceFillSparse": 0.1,
"sliceFillType": "hex",
"sliceAdaptive": false,
"sliceMinHeight": 0,
"sliceSupportDensity": 0.25,
"sliceSupportOffset": 0.6,
"sliceSupportGap": 1,
"sliceSupportSize": 6,
"sliceSupportArea": 3,
"sliceSupportExtra": 0,
"sliceSupportAngle": 50,
"sliceSupportNozzle": 0,
"sliceSolidMinArea": 1,
"sliceBottomLayers": 3,
"sliceTopLayers": 3,
"firstLayerNozzleTemp": 238,
"firstLayerBedTemp": 55,
"firstLayerRate": 10,
"firstLayerFillRate": 10,
"firstLayerPrintMult": 1.2,
"firstLayerLineMult": 1,
"firstLayerFanSpeed": 0,
"outputRaft": false,
"outputRaftSpacing": 0.2,
"outputTemp": 235,
"outputBedTemp": 55,
"outputFanSpeed": 75,
"outputFeedrate": 15,
"outputFinishrate": 10,
"outputSeekrate": 80,
"outputShellMult": 1.2,
"outputFillMult": 1.2,
"outputSparseMult": 1.4,
"outputBrimCount": 5,
"outputBrimOffset": 5,
"outputRetractDist": 0.5,
"outputRetractSpeed": 20,
"outputRetractWipe": 0.8,
"outputRetractDwell": 10,
"outputShortPoly": 50,
"outputMinSpeed": 10,
"outputCoastDist": 0.4,
"outputLayerRetract": true,
"zHopDistance": 1,
"antiBacklash": 0,
"sliceLineWidth": 0.45,
"sliceFillRepeat": 1,
"sliceFillRate": 15,
"sliceSupportSpan": 5,
"sliceSupportEnable": false,
"sliceSupportOutline": true,
"firstSliceHeight": 0.2,
"firstLayerYOffset": 0,
"firstLayerBrim": 0,
"firstLayerBrimIn": 0,
"firstLayerBrimTrig": 0,
"firstLayerBrimGap": 0,
"firstLayerBeltLead": 3,
"firstLayerBeltBump": 0,
"firstLayerFlatten": 0,
"outputPurgeTower": 0,
"outputBeltFirst": false,
"outputLoops": 0,
"outputInvertX": false,
"outputInvertY": false,
"arcTolerance": 0.15,
"ranges": [],
"outputDraftShield": false,
"outputAvoidGaps": true,
"sliceFillGrow": 0,
"sliceSolidRate": 10,
"sliceDetectThin": "off",
"sliceLayerStartX": 0,
"sliceLayerStartY": 0,
"sliceSupportGrow": 0,
"outputAlternating": false
},
{
"processName": "JB1 PETG - N0.4 L0.3 T235",
"sliceHeight": 0.3,
"sliceShells": 2,
"sliceShellOrder": "in-out",
"sliceLayerStart": "last",
"sliceFillAngle": 45,
"sliceFillWidth": 1,
"sliceFillOverlap": 0.25,
"sliceFillSparse": 0.1,
"sliceFillType": "hex",
"sliceAdaptive": false,
"sliceMinHeight": 0,
"sliceSupportDensity": 0.25,
"sliceSupportOffset": 0.6,
"sliceSupportGap": 1,
"sliceSupportSize": 6,
"sliceSupportArea": 3,
"sliceSupportExtra": 0,
"sliceSupportAngle": 50,
"sliceSupportNozzle": 0,
"sliceSolidMinArea": 1,
"sliceBottomLayers": 3,
"sliceTopLayers": 3,
"firstLayerNozzleTemp": 235,
"firstLayerBedTemp": 70,
"firstLayerRate": 20,
"firstLayerFillRate": 25,
"firstLayerPrintMult": 1.2,
"firstLayerLineMult": 1,
"firstLayerFanSpeed": 0,
"outputRaft": false,
"outputRaftSpacing": 0.2,
"outputTemp": 235,
"outputBedTemp": 70,
"outputFanSpeed": 75,
"outputFeedrate": 45,
"outputFinishrate": 20,
"outputSeekrate": 80,
"outputShellMult": 1.05,
"outputFillMult": 1.05,
"outputSparseMult": 1.2,
"outputBrimCount": 5,
"outputBrimOffset": 5,
"outputRetractDist": 2,
"outputRetractSpeed": 40,
"outputRetractWipe": 0.8,
"outputRetractDwell": 10,
"outputShortPoly": 50,
"outputMinSpeed": 10,
"outputCoastDist": 0.4,
"outputLayerRetract": true,
"zHopDistance": 0.2,
"antiBacklash": 0,
"sliceLineWidth": 0.45,
"sliceFillRepeat": 1,
"sliceFillRate": 0,
"sliceSupportSpan": 5,
"sliceSupportEnable": false,
"sliceSupportOutline": true,
"firstSliceHeight": 0.2,
"firstLayerYOffset": 0,
"firstLayerBrim": 0,
"firstLayerBrimIn": 0,
"firstLayerBrimTrig": 0,
"firstLayerBrimGap": 0,
"firstLayerBeltLead": 3,
"firstLayerBeltBump": 0,
"firstLayerFlatten": 0,
"outputPurgeTower": 0,
"outputBeltFirst": false,
"outputLoops": 0,
"outputInvertX": false,
"outputInvertY": false,
"arcTolerance": 0.15,
"ranges": [],
"outputDraftShield": false,
"outputAvoidGaps": true,
"sliceFillGrow": 0,
"sliceSolidRate": 0,
"sliceDetectThin": "off",
"sliceLayerStartX": 0,
"sliceLayerStartY": 0,
"sliceSupportGrow": 0,
"outputAlternating": false
}
],
"filamentSource": "direct",
"gcodeTime": 1,
"gcodeFeature": [],
"extras": {
"palette": {
"printer": "9c94bc185556",
"ping": null,
"feed": null,
"push": null,
"offset": null,
"heat": null,
"cool": null,
"press": null
}
}
}

View file

@ -0,0 +1,368 @@
{
"deviceName": "IMADE3D JellyBOX 2 N0.4",
"bedWidth": 177,
"bedDepth": 155,
"maxHeight": 140,
"mode": "FDM",
"new": false,
"internal": 0,
"imageURL": "",
"bedHeight": 2.5,
"bedRound": false,
"bedBelt": false,
"deviceZMax": 0,
"originCenter": false,
"gcodeFan": [
"M106 S{fan_speed}"
],
"gcodeTrack": [
"M117 {progress}% layer {layer} / {layers}"
],
"gcodeLayer": [
";; --- layer {layer} {height} @ {z} ---",
"M117 {progress}% layer {layer} / {layers}"
],
"gcodePre": [
";============================",
"; Jellybox Start Script Begin ",
";============================",
"; for slicer: Kiri:Moto",
"; modified 2024-02-01. by LG",
";",
"G21 ;metric values",
"G90 ;absolute positioning",
"M107 ;start with the fan off",
";",
"; === Homing and bed leveling (if necessary)",
";",
"G28 ;home all axes",
"G29 O ;auto bed leveling procedure only if leveling NOT active",
";M500 ;optionally save the mesh",
"G28 X ;home x to get as far from the plate as possible",
"M420 S1 ;(re) enable bed leveling if turned off by the G28",
"G0 Y0 F5000 ;position Y in front",
"G0 Z5 F3000 ;position Z",
"M190 S{bed_temp} T{tool} ;wait for the bed to reach desired temperature",
"M109 S{temp} T{tool} ;wait for the extruder to reach desired temperature",
"; ",
"; === Purge 30mm of the filament",
";",
"G90 ;absolute positioning",
"M400 ;make sure all is finished",
"G92 E0 ;to reset extruder position to 0 after finished previous print",
"G1 E30 F200 ;extrude 30mm of feed stock",
"G92 E0 ;reset the extruder position Z is 0 again.",
";",
";===================================",
"; Jellybox Printer Start Script End",
";==================================="
],
"gcodePost": [
";---------------------------------",
";;; Jellybox End Script Begin ;;;",
";_________________________________",
"; end gcode last modified 2022-01-13",
"M117 Finishing Up ;write Finishing Up",
"M107 ;turn the fan off",
"M104 S0 ;extruder heater off",
"M140 S0 ;bed heater off (if you have it)",
"G91 ;relative positioning (includes extruder)",
"G1 E-1 F2500 ;retract the filament a bit before lifting the nozzle to release some of the pressure",
"G1 Z0.5 E-4 X-10 F9000 ;get out and retract filament even more",
"G1 E-25 F2000 ;retract even more",
"G90 ;absolute positioning (includes extruder)",
"G28 X ;home X so the head is out of the way",
"G1 Y140 ;move Y forward, so the print is more accessible",
"M84 ;steppers off",
"M117 Print finished ;write Print finished",
";---------------------------------------",
";;; Jellybox End Script End ;;;",
";_______________________________________"
],
"gcodeProc": "",
"gcodeFExt": "gcode",
"extruders": [
{
"extFilament": 1.75,
"extNozzle": 0.4,
"extOffsetX": 0,
"extOffsetY": 0
}
],
"fwRetract": false,
"profiles": [
{
"processName": "JB2 PLA - N0.4 L0.3 T210",
"sliceHeight": 0.3,
"sliceShells": 2,
"sliceShellOrder": "in-out",
"sliceLayerStart": "last",
"sliceFillAngle": 45,
"sliceFillWidth": 1,
"sliceFillOverlap": 0.25,
"sliceFillSparse": 0.1,
"sliceFillType": "hex",
"sliceAdaptive": false,
"sliceMinHeight": 0,
"sliceSupportDensity": 0.25,
"sliceSupportOffset": 0.6,
"sliceSupportGap": 1,
"sliceSupportSize": 6,
"sliceSupportArea": 3,
"sliceSupportExtra": 0,
"sliceSupportAngle": 50,
"sliceSupportNozzle": 0,
"sliceSolidMinArea": 1,
"sliceBottomLayers": 3,
"sliceTopLayers": 3,
"firstLayerNozzleTemp": 215,
"firstLayerBedTemp": 60,
"firstLayerRate": 20,
"firstLayerFillRate": 25,
"firstLayerPrintMult": 1.2,
"firstLayerLineMult": 1,
"firstLayerFanSpeed": 0,
"outputRaft": false,
"outputRaftSpacing": 0.2,
"outputTemp": 210,
"outputBedTemp": 60,
"outputFanSpeed": 130,
"outputFeedrate": 45,
"outputFinishrate": 20,
"outputSeekrate": 80,
"outputShellMult": 1.05,
"outputFillMult": 1.05,
"outputSparseMult": 1.2,
"outputBrimCount": 5,
"outputBrimOffset": 5,
"outputRetractDist": 1.8,
"outputRetractSpeed": 40,
"outputRetractWipe": 0.8,
"outputRetractDwell": 10,
"outputShortPoly": 50,
"outputMinSpeed": 10,
"outputCoastDist": 0.4,
"outputLayerRetract": true,
"zHopDistance": 0.2,
"antiBacklash": 0,
"sliceLineWidth": 0.45,
"sliceFillRepeat": 1,
"sliceFillRate": 0,
"sliceSupportSpan": 5,
"sliceSupportEnable": false,
"sliceSupportOutline": true,
"firstSliceHeight": 0.2,
"firstLayerYOffset": 0,
"firstLayerBrim": 0,
"firstLayerBrimIn": 0,
"firstLayerBrimTrig": 0,
"firstLayerBrimGap": 0,
"firstLayerBeltLead": 3,
"firstLayerBeltBump": 0,
"firstLayerFlatten": 0,
"outputPurgeTower": 0,
"outputBeltFirst": false,
"outputLoops": 0,
"outputInvertX": false,
"outputInvertY": false,
"arcTolerance": 0.15,
"ranges": [],
"outputDraftShield": false,
"outputAvoidGaps": true,
"sliceFillGrow": 0,
"sliceSolidRate": 0,
"sliceDetectThin": "off",
"sliceLayerStartX": 0,
"sliceLayerStartY": 0,
"sliceSupportGrow": 0,
"outputAlternating": false
},
{
"processName": "JB2 PETG - N0.4 L0.3 T235",
"sliceHeight": 0.3,
"sliceShells": 2,
"sliceShellOrder": "in-out",
"sliceLayerStart": "last",
"sliceFillAngle": 45,
"sliceFillWidth": 1,
"sliceFillOverlap": 0.25,
"sliceFillSparse": 0.1,
"sliceFillType": "hex",
"sliceAdaptive": false,
"sliceMinHeight": 0,
"sliceSupportDensity": 0.25,
"sliceSupportOffset": 0.6,
"sliceSupportGap": 1,
"sliceSupportSize": 6,
"sliceSupportArea": 3,
"sliceSupportExtra": 0,
"sliceSupportAngle": 50,
"sliceSupportNozzle": 0,
"sliceSolidMinArea": 1,
"sliceBottomLayers": 3,
"sliceTopLayers": 3,
"firstLayerNozzleTemp": 235,
"firstLayerBedTemp": 70,
"firstLayerRate": 20,
"firstLayerFillRate": 25,
"firstLayerPrintMult": 1.2,
"firstLayerLineMult": 1,
"firstLayerFanSpeed": 0,
"outputRaft": false,
"outputRaftSpacing": 0.2,
"outputTemp": 235,
"outputBedTemp": 70,
"outputFanSpeed": 75,
"outputFeedrate": 45,
"outputFinishrate": 20,
"outputSeekrate": 80,
"outputShellMult": 1.05,
"outputFillMult": 1.05,
"outputSparseMult": 1.2,
"outputBrimCount": 5,
"outputBrimOffset": 5,
"outputRetractDist": 2,
"outputRetractSpeed": 40,
"outputRetractWipe": 0.8,
"outputRetractDwell": 10,
"outputShortPoly": 50,
"outputMinSpeed": 10,
"outputCoastDist": 0.4,
"outputLayerRetract": true,
"zHopDistance": 0.2,
"antiBacklash": 0,
"sliceLineWidth": 0.45,
"sliceFillRepeat": 1,
"sliceFillRate": 0,
"sliceSupportSpan": 5,
"sliceSupportEnable": false,
"sliceSupportOutline": true,
"firstSliceHeight": 0.2,
"firstLayerYOffset": 0,
"firstLayerBrim": 0,
"firstLayerBrimIn": 0,
"firstLayerBrimTrig": 0,
"firstLayerBrimGap": 0,
"firstLayerBeltLead": 3,
"firstLayerBeltBump": 0,
"firstLayerFlatten": 0,
"outputPurgeTower": 0,
"outputBeltFirst": false,
"outputLoops": 0,
"outputInvertX": false,
"outputInvertY": false,
"arcTolerance": 0.15,
"ranges": [],
"outputDraftShield": false,
"outputAvoidGaps": true,
"sliceFillGrow": 0,
"sliceSolidRate": 0,
"sliceDetectThin": "off",
"sliceLayerStartX": 0,
"sliceLayerStartY": 0,
"sliceSupportGrow": 0,
"outputAlternating": false
},
{
"processName": "JB2 FLEX - N0.4 L0.3 T235",
"sliceHeight": 0.3,
"sliceShells": 2,
"sliceShellOrder": "in-out",
"sliceLayerStart": "last",
"sliceFillAngle": 45,
"sliceFillWidth": 1,
"sliceFillOverlap": 0.25,
"sliceFillSparse": 0.1,
"sliceFillType": "hex",
"sliceAdaptive": false,
"sliceMinHeight": 0,
"sliceSupportDensity": 0.25,
"sliceSupportOffset": 0.6,
"sliceSupportGap": 1,
"sliceSupportSize": 6,
"sliceSupportArea": 3,
"sliceSupportExtra": 0,
"sliceSupportAngle": 50,
"sliceSupportNozzle": 0,
"sliceSolidMinArea": 1,
"sliceBottomLayers": 3,
"sliceTopLayers": 3,
"firstLayerNozzleTemp": 238,
"firstLayerBedTemp": 55,
"firstLayerRate": 10,
"firstLayerFillRate": 10,
"firstLayerPrintMult": 1.2,
"firstLayerLineMult": 1,
"firstLayerFanSpeed": 0,
"outputRaft": false,
"outputRaftSpacing": 0.2,
"outputTemp": 235,
"outputBedTemp": 55,
"outputFanSpeed": 75,
"outputFeedrate": 15,
"outputFinishrate": 10,
"outputSeekrate": 80,
"outputShellMult": 1.2,
"outputFillMult": 1.2,
"outputSparseMult": 1.4,
"outputBrimCount": 5,
"outputBrimOffset": 5,
"outputRetractDist": 0.5,
"outputRetractSpeed": 20,
"outputRetractWipe": 0.8,
"outputRetractDwell": 10,
"outputShortPoly": 50,
"outputMinSpeed": 10,
"outputCoastDist": 0.4,
"outputLayerRetract": true,
"zHopDistance": 1,
"antiBacklash": 0,
"sliceLineWidth": 0.45,
"sliceFillRepeat": 1,
"sliceFillRate": 15,
"sliceSupportSpan": 5,
"sliceSupportEnable": false,
"sliceSupportOutline": true,
"firstSliceHeight": 0.2,
"firstLayerYOffset": 0,
"firstLayerBrim": 0,
"firstLayerBrimIn": 0,
"firstLayerBrimTrig": 0,
"firstLayerBrimGap": 0,
"firstLayerBeltLead": 3,
"firstLayerBeltBump": 0,
"firstLayerFlatten": 0,
"outputPurgeTower": 0,
"outputBeltFirst": false,
"outputLoops": 0,
"outputInvertX": false,
"outputInvertY": false,
"arcTolerance": 0.15,
"ranges": [],
"outputDraftShield": false,
"outputAvoidGaps": true,
"sliceFillGrow": 0,
"sliceSolidRate": 10,
"sliceDetectThin": "off",
"sliceLayerStartX": 0,
"sliceLayerStartY": 0,
"sliceSupportGrow": 0,
"outputAlternating": false
}
],
"filamentSource": "direct",
"gcodeTime": 1,
"gcodeFeature": [],
"extras": {
"palette": {
"printer": "e888752465a2",
"ping": null,
"feed": null,
"push": null,
"offset": null,
"heat": null,
"cool": null,
"press": null
}
}
}

View file

@ -0,0 +1,369 @@
{
"deviceName": "IMADE3D JellyBOX 3 N0.4",
"bedWidth": 180,
"bedDepth": 165,
"maxHeight": 140,
"mode": "FDM",
"new": false,
"internal": 0,
"imageURL": "",
"bedHeight": 2.5,
"bedRound": false,
"bedBelt": false,
"deviceZMax": 0,
"originCenter": false,
"gcodeFan": [
"M106 S{fan_speed}"
],
"gcodeTrack": [
"M117 {progress}% layer {layer} / {layers}"
],
"gcodeLayer": [
";; --- layer {layer} {height} @ {z} ---",
"M117 {progress}% layer {layer} / {layers}"
],
"gcodePre": [
";============================",
"; Jellybox Start Script Begin ",
";============================",
"; for slicer: Kiri:Moto",
"; modified 2024-02-01. by LG",
";",
"G21 ;metric values",
"G90 ;absolute positioning",
"M107 ;start with the fan off",
";",
"; === Homing and bed leveling (if necessary)",
";",
"G28 ;home all axes",
"G29 O ;auto bed leveling procedure only if leveling NOT active",
";M500 ;optionally save the mesh",
"G28 X ;home x to get as far from the plate as possible",
"M420 S1 ;(re) enable bed leveling if turned off by the G28",
"G0 Y0 F5000 ;position Y in front",
"G0 Z5 F3000 ;position Z",
"M190 S{bed_temp} T{tool} ;wait for the bed to reach desired temperature",
"M109 S{temp} T{tool} ;wait for the extruder to reach desired temperature",
"; ",
"; === Purge 30mm of the filament",
";",
"G90 ;absolute positioning",
"M400 ;make sure all is finished",
"G92 E0 ;to reset extruder position to 0 after finished previous print",
"G1 E30 F200 ;extrude 30mm of feed stock",
"G92 E0 ;reset the extruder position Z is 0 again.",
";",
";===================================",
"; Jellybox Printer Start Script End",
";==================================="
],
"gcodePost": [
";============================",
"; Jellybox End Script Begin ",
";============================",
"; modified 2024-02-01",
"M117 Finishing Up ;write Finishing Up",
"M107 ;turn the fan off",
"M104 S0 ;extruder heater off",
"M140 S0 ;bed heater off (if you have it)",
"G91 ;relative positioning (includes extruder)",
"G1 E-1 F2500 ;retract the filament a bit before lifting the nozzle to release some of the pressure",
"G1 Z0.5 E-4 X-10 F9000 ;get out and retract filament even more",
"G1 E-25 F2000 ;retract even more",
"G90 ;absolute positioning (includes extruder)",
"G28 X ;home X so the head is out of the way",
"G1 Y140 ;move Y forward, so the print is more accessible",
"G92 E0 ;reset the extruder position Z to 0",
"M84 ;steppers off",
"M117 Print finished ;write Print finished",
";=========================",
"; Jellybox End Script End ",
";========================="
],
"gcodeProc": "",
"gcodeFExt": "gcode",
"extruders": [
{
"extFilament": 1.75,
"extNozzle": 0.4,
"extOffsetX": 0,
"extOffsetY": 0
}
],
"fwRetract": false,
"profiles": [
{
"processName": "JB3 PLA - N0.4 L0.3 T210",
"sliceHeight": 0.3,
"sliceShells": 2,
"sliceShellOrder": "in-out",
"sliceLayerStart": "last",
"sliceFillAngle": 45,
"sliceFillWidth": 1,
"sliceFillOverlap": 0.25,
"sliceFillSparse": 0.1,
"sliceFillType": "hex",
"sliceAdaptive": false,
"sliceMinHeight": 0,
"sliceSupportDensity": 0.25,
"sliceSupportOffset": 0.6,
"sliceSupportGap": 1,
"sliceSupportSize": 6,
"sliceSupportArea": 3,
"sliceSupportExtra": 0,
"sliceSupportAngle": 50,
"sliceSupportNozzle": 0,
"sliceSolidMinArea": 1,
"sliceBottomLayers": 3,
"sliceTopLayers": 3,
"firstLayerNozzleTemp": 215,
"firstLayerBedTemp": 60,
"firstLayerRate": 20,
"firstLayerFillRate": 25,
"firstLayerPrintMult": 1.2,
"firstLayerLineMult": 1,
"firstLayerFanSpeed": 0,
"outputRaft": false,
"outputRaftSpacing": 0.2,
"outputTemp": 210,
"outputBedTemp": 60,
"outputFanSpeed": 130,
"outputFeedrate": 45,
"outputFinishrate": 20,
"outputSeekrate": 80,
"outputShellMult": 1.05,
"outputFillMult": 1.05,
"outputSparseMult": 1.2,
"outputBrimCount": 5,
"outputBrimOffset": 5,
"outputRetractDist": 1.8,
"outputRetractSpeed": 40,
"outputRetractWipe": 0.8,
"outputRetractDwell": 10,
"outputShortPoly": 50,
"outputMinSpeed": 10,
"outputCoastDist": 0.4,
"outputLayerRetract": true,
"zHopDistance": 0.2,
"antiBacklash": 0,
"sliceLineWidth": 0.45,
"sliceFillRepeat": 1,
"sliceFillRate": 0,
"sliceSupportSpan": 5,
"sliceSupportEnable": false,
"sliceSupportOutline": true,
"firstSliceHeight": 0.2,
"firstLayerYOffset": 0,
"firstLayerBrim": 0,
"firstLayerBrimIn": 0,
"firstLayerBrimTrig": 0,
"firstLayerBrimGap": 0,
"firstLayerBeltLead": 3,
"firstLayerBeltBump": 0,
"firstLayerFlatten": 0,
"outputPurgeTower": 0,
"outputBeltFirst": false,
"outputLoops": 0,
"outputInvertX": false,
"outputInvertY": false,
"arcTolerance": 0.15,
"ranges": [],
"outputDraftShield": false,
"outputAvoidGaps": true,
"sliceFillGrow": 0,
"sliceSolidRate": 0,
"sliceDetectThin": "off",
"sliceLayerStartX": 0,
"sliceLayerStartY": 0,
"sliceSupportGrow": 0,
"outputAlternating": false
},
{
"processName": "JB3 PETG - N0.4 L0.3 T235",
"sliceHeight": 0.3,
"sliceShells": 2,
"sliceShellOrder": "in-out",
"sliceLayerStart": "last",
"sliceFillAngle": 45,
"sliceFillWidth": 1,
"sliceFillOverlap": 0.25,
"sliceFillSparse": 0.1,
"sliceFillType": "hex",
"sliceAdaptive": false,
"sliceMinHeight": 0,
"sliceSupportDensity": 0.25,
"sliceSupportOffset": 0.6,
"sliceSupportGap": 1,
"sliceSupportSize": 6,
"sliceSupportArea": 3,
"sliceSupportExtra": 0,
"sliceSupportAngle": 50,
"sliceSupportNozzle": 0,
"sliceSolidMinArea": 1,
"sliceBottomLayers": 3,
"sliceTopLayers": 3,
"firstLayerNozzleTemp": 235,
"firstLayerBedTemp": 70,
"firstLayerRate": 20,
"firstLayerFillRate": 25,
"firstLayerPrintMult": 1.2,
"firstLayerLineMult": 1,
"firstLayerFanSpeed": 0,
"outputRaft": false,
"outputRaftSpacing": 0.2,
"outputTemp": 235,
"outputBedTemp": 70,
"outputFanSpeed": 75,
"outputFeedrate": 45,
"outputFinishrate": 20,
"outputSeekrate": 80,
"outputShellMult": 1.05,
"outputFillMult": 1.05,
"outputSparseMult": 1.2,
"outputBrimCount": 5,
"outputBrimOffset": 5,
"outputRetractDist": 2,
"outputRetractSpeed": 40,
"outputRetractWipe": 0.8,
"outputRetractDwell": 10,
"outputShortPoly": 50,
"outputMinSpeed": 10,
"outputCoastDist": 0.4,
"outputLayerRetract": true,
"zHopDistance": 0.2,
"antiBacklash": 0,
"sliceLineWidth": 0.45,
"sliceFillRepeat": 1,
"sliceFillRate": 0,
"sliceSupportSpan": 5,
"sliceSupportEnable": false,
"sliceSupportOutline": true,
"firstSliceHeight": 0.2,
"firstLayerYOffset": 0,
"firstLayerBrim": 0,
"firstLayerBrimIn": 0,
"firstLayerBrimTrig": 0,
"firstLayerBrimGap": 0,
"firstLayerBeltLead": 3,
"firstLayerBeltBump": 0,
"firstLayerFlatten": 0,
"outputPurgeTower": 0,
"outputBeltFirst": false,
"outputLoops": 0,
"outputInvertX": false,
"outputInvertY": false,
"arcTolerance": 0.15,
"ranges": [],
"outputDraftShield": false,
"outputAvoidGaps": true,
"sliceFillGrow": 0,
"sliceSolidRate": 0,
"sliceDetectThin": "off",
"sliceLayerStartX": 0,
"sliceLayerStartY": 0,
"sliceSupportGrow": 0,
"outputAlternating": false
},
{
"processName": "JB3 TPU - N0.4 L0.3 T235",
"sliceHeight": 0.3,
"sliceShells": 2,
"sliceShellOrder": "in-out",
"sliceLayerStart": "last",
"sliceFillAngle": 45,
"sliceFillWidth": 1,
"sliceFillOverlap": 0.25,
"sliceFillSparse": 0.1,
"sliceFillType": "hex",
"sliceAdaptive": false,
"sliceMinHeight": 0,
"sliceSupportDensity": 0.25,
"sliceSupportOffset": 0.6,
"sliceSupportGap": 1,
"sliceSupportSize": 6,
"sliceSupportArea": 3,
"sliceSupportExtra": 0,
"sliceSupportAngle": 50,
"sliceSupportNozzle": 0,
"sliceSolidMinArea": 1,
"sliceBottomLayers": 3,
"sliceTopLayers": 3,
"firstLayerNozzleTemp": 238,
"firstLayerBedTemp": 55,
"firstLayerRate": 10,
"firstLayerFillRate": 10,
"firstLayerPrintMult": 1.2,
"firstLayerLineMult": 1,
"firstLayerFanSpeed": 0,
"outputRaft": false,
"outputRaftSpacing": 0.2,
"outputTemp": 235,
"outputBedTemp": 55,
"outputFanSpeed": 75,
"outputFeedrate": 15,
"outputFinishrate": 10,
"outputSeekrate": 80,
"outputShellMult": 1.2,
"outputFillMult": 1.2,
"outputSparseMult": 1.4,
"outputBrimCount": 5,
"outputBrimOffset": 5,
"outputRetractDist": 0.5,
"outputRetractSpeed": 20,
"outputRetractWipe": 0.8,
"outputRetractDwell": 10,
"outputShortPoly": 50,
"outputMinSpeed": 10,
"outputCoastDist": 0.4,
"outputLayerRetract": true,
"zHopDistance": 1,
"antiBacklash": 0,
"sliceLineWidth": 0.45,
"sliceFillRepeat": 1,
"sliceFillRate": 15,
"sliceSupportSpan": 5,
"sliceSupportEnable": false,
"sliceSupportOutline": true,
"firstSliceHeight": 0.2,
"firstLayerYOffset": 0,
"firstLayerBrim": 0,
"firstLayerBrimIn": 0,
"firstLayerBrimTrig": 0,
"firstLayerBrimGap": 0,
"firstLayerBeltLead": 3,
"firstLayerBeltBump": 0,
"firstLayerFlatten": 0,
"outputPurgeTower": 0,
"outputBeltFirst": false,
"outputLoops": 0,
"outputInvertX": false,
"outputInvertY": false,
"arcTolerance": 0.15,
"ranges": [],
"outputDraftShield": false,
"outputAvoidGaps": true,
"sliceFillGrow": 0,
"sliceSolidRate": 10,
"sliceDetectThin": "off",
"sliceLayerStartX": 0,
"sliceLayerStartY": 0,
"sliceSupportGrow": 0,
"outputAlternating": false
}
],
"filamentSource": "direct",
"gcodeTime": 1,
"gcodeFeature": [],
"extras": {
"palette": {
"printer": "e292e5c84d0d",
"ping": null,
"feed": null,
"push": null,
"offset": null,
"heat": null,
"cool": null,
"press": null
}
}
}

View file

@ -0,0 +1,369 @@
{
"deviceName": "IMADE3D JellyBOX 4 N0.4",
"bedWidth": 180,
"bedDepth": 165,
"maxHeight": 150,
"mode": "FDM",
"new": false,
"internal": 0,
"imageURL": "",
"bedHeight": 2.5,
"bedRound": false,
"bedBelt": false,
"deviceZMax": 0,
"originCenter": false,
"gcodeFan": [
"M106 S{fan_speed}"
],
"gcodeTrack": [
"M117 {progress}% layer {layer} / {layers}"
],
"gcodeLayer": [
";; --- layer {layer} {height} @ {z} ---",
"M117 {progress}% layer {layer} / {layers}"
],
"gcodePre": [
";============================",
"; Jellybox Start Script Begin ",
";============================",
"; for slicer: Kiri:Moto",
"; modified 2024-02-01. by LG",
";",
"G21 ;metric values",
"G90 ;absolute positioning",
"M107 ;start with the fan off",
";",
"; === Homing and bed leveling (if necessary)",
";",
"G28 ;home all axes",
"G29 O ;auto bed leveling procedure only if leveling NOT active",
";M500 ;optionally save the mesh",
"G28 X ;home x to get as far from the plate as possible",
"M420 S1 ;(re) enable bed leveling if turned off by the G28",
"G0 Y0 F5000 ;position Y in front",
"G0 Z5 F3000 ;position Z",
"M190 S{bed_temp} T{tool} ;wait for the bed to reach desired temperature",
"M109 S{temp} T{tool} ;wait for the extruder to reach desired temperature",
"; ",
"; === Purge 30mm of the filament",
";",
"G90 ;absolute positioning",
"M400 ;make sure all is finished",
"G92 E0 ;to reset extruder position to 0 after finished previous print",
"G1 E30 F200 ;extrude 30mm of feed stock",
"G92 E0 ;reset the extruder position Z is 0 again.",
";",
";===================================",
"; Jellybox Printer Start Script End",
";==================================="
],
"gcodePost": [
";============================",
"; Jellybox End Script Begin ",
";============================",
"; modified 2024-02-01",
"M117 Finishing Up ;write Finishing Up",
"M107 ;turn the fan off",
"M104 S0 ;extruder heater off",
"M140 S0 ;bed heater off (if you have it)",
"G91 ;relative positioning (includes extruder)",
"G1 E-1 F2500 ;retract the filament a bit before lifting the nozzle to release some of the pressure",
"G1 Z0.5 E-4 X-10 F9000 ;get out and retract filament even more",
"G1 E-25 F2000 ;retract even more",
"G90 ;absolute positioning (includes extruder)",
"G28 X ;home X so the head is out of the way",
"G1 Y140 ;move Y forward, so the print is more accessible",
"G92 E0 ;reset the extruder position Z to 0",
"M84 ;steppers off",
"M117 Print finished ;write Print finished",
";=========================",
"; Jellybox End Script End ",
";========================="
],
"gcodeProc": "",
"gcodeFExt": "gcode",
"extruders": [
{
"extFilament": 1.75,
"extNozzle": 0.4,
"extOffsetX": 0,
"extOffsetY": 0
}
],
"fwRetract": false,
"profiles": [
{
"processName": "JB4 PLA - N0.4 L0.3 T215",
"sliceHeight": 0.3,
"sliceShells": 2,
"sliceShellOrder": "in-out",
"sliceLayerStart": "last",
"sliceFillAngle": 45,
"sliceFillWidth": 1,
"sliceFillOverlap": 0.25,
"sliceFillSparse": 0.1,
"sliceFillType": "hex",
"sliceAdaptive": false,
"sliceMinHeight": 0,
"sliceSupportDensity": 0.25,
"sliceSupportOffset": 0.6,
"sliceSupportGap": 1,
"sliceSupportSize": 6,
"sliceSupportArea": 3,
"sliceSupportExtra": 0,
"sliceSupportAngle": 50,
"sliceSupportNozzle": 0,
"sliceSolidMinArea": 1,
"sliceBottomLayers": 3,
"sliceTopLayers": 3,
"firstLayerNozzleTemp": 215,
"firstLayerBedTemp": 60,
"firstLayerRate": 40,
"firstLayerFillRate": 30,
"firstLayerPrintMult": 1.2,
"firstLayerLineMult": 1,
"firstLayerFanSpeed": 0,
"outputRaft": false,
"outputRaftSpacing": 0.2,
"outputTemp": 215,
"outputBedTemp": 60,
"outputFanSpeed": 200,
"outputFeedrate": 70,
"outputFinishrate": 35,
"outputSeekrate": 120,
"outputShellMult": 1.15,
"outputFillMult": 1.15,
"outputSparseMult": 1.3,
"outputBrimCount": 5,
"outputBrimOffset": 5,
"outputRetractDist": 1.8,
"outputRetractSpeed": 40,
"outputRetractWipe": 0.8,
"outputRetractDwell": 10,
"outputShortPoly": 50,
"outputMinSpeed": 10,
"outputCoastDist": 0.4,
"outputLayerRetract": true,
"zHopDistance": 0.3,
"antiBacklash": 0,
"sliceLineWidth": 0.4,
"sliceFillRepeat": 1,
"sliceFillRate": 0,
"sliceSupportSpan": 5,
"sliceSupportEnable": false,
"sliceSupportOutline": false,
"firstSliceHeight": 0.3,
"firstLayerYOffset": 0,
"firstLayerBrim": 0,
"firstLayerBrimIn": 0,
"firstLayerBrimTrig": 0,
"firstLayerBrimGap": 0,
"firstLayerBeltLead": 3,
"firstLayerBeltBump": 0,
"firstLayerFlatten": 0,
"outputPurgeTower": 0,
"outputBeltFirst": false,
"outputLoops": 0,
"outputInvertX": false,
"outputInvertY": false,
"arcTolerance": 0.15,
"ranges": [],
"outputDraftShield": false,
"outputAvoidGaps": true,
"sliceFillGrow": 0,
"sliceSolidRate": 0,
"sliceDetectThin": "off",
"sliceLayerStartX": 0,
"sliceLayerStartY": 0,
"sliceSupportGrow": 0,
"outputAlternating": false
},
{
"processName": "JB4 PETG - N0.4 L0.3 T240",
"sliceHeight": 0.3,
"sliceShells": 2,
"sliceShellOrder": "in-out",
"sliceLayerStart": "last",
"sliceFillAngle": 45,
"sliceFillWidth": 1,
"sliceFillOverlap": 0.25,
"sliceFillSparse": 0.1,
"sliceFillType": "hex",
"sliceAdaptive": false,
"sliceMinHeight": 0,
"sliceSupportDensity": 0.25,
"sliceSupportOffset": 0.6,
"sliceSupportGap": 1,
"sliceSupportSize": 6,
"sliceSupportArea": 3,
"sliceSupportExtra": 0,
"sliceSupportAngle": 50,
"sliceSupportNozzle": 0,
"sliceSolidMinArea": 1,
"sliceBottomLayers": 3,
"sliceTopLayers": 3,
"firstLayerNozzleTemp": 235,
"firstLayerBedTemp": 70,
"firstLayerRate": 40,
"firstLayerFillRate": 50,
"firstLayerPrintMult": 1.2,
"firstLayerLineMult": 1,
"firstLayerFanSpeed": 0,
"outputRaft": false,
"outputRaftSpacing": 0.2,
"outputTemp": 240,
"outputBedTemp": 70,
"outputFanSpeed": 75,
"outputFeedrate": 70,
"outputFinishrate": 35,
"outputSeekrate": 100,
"outputShellMult": 1.05,
"outputFillMult": 1.05,
"outputSparseMult": 1.2,
"outputBrimCount": 5,
"outputBrimOffset": 5,
"outputRetractDist": 2,
"outputRetractSpeed": 40,
"outputRetractWipe": 0.8,
"outputRetractDwell": 10,
"outputShortPoly": 50,
"outputMinSpeed": 10,
"outputCoastDist": 0.4,
"outputLayerRetract": true,
"zHopDistance": 0.3,
"antiBacklash": 0,
"sliceLineWidth": 0.4,
"sliceFillRepeat": 1,
"sliceFillRate": 0,
"sliceSupportSpan": 5,
"sliceSupportEnable": false,
"sliceSupportOutline": true,
"firstSliceHeight": 0.3,
"firstLayerYOffset": 0,
"firstLayerBrim": 0,
"firstLayerBrimIn": 0,
"firstLayerBrimTrig": 0,
"firstLayerBrimGap": 0,
"firstLayerBeltLead": 3,
"firstLayerBeltBump": 0,
"firstLayerFlatten": 0,
"outputPurgeTower": 0,
"outputBeltFirst": false,
"outputLoops": 0,
"outputInvertX": false,
"outputInvertY": false,
"arcTolerance": 0.15,
"ranges": [],
"outputDraftShield": false,
"outputAvoidGaps": true,
"sliceFillGrow": 0,
"sliceSolidRate": 0,
"sliceDetectThin": "off",
"sliceLayerStartX": 0,
"sliceLayerStartY": 0,
"sliceSupportGrow": 0,
"outputAlternating": false
},
{
"processName": "JB4 TPU - N0.4 L0.3 T230",
"sliceHeight": 0.3,
"sliceShells": 2,
"sliceShellOrder": "in-out",
"sliceLayerStart": "last",
"sliceFillAngle": 45,
"sliceFillWidth": 1,
"sliceFillOverlap": 0.25,
"sliceFillSparse": 0.1,
"sliceFillType": "hex",
"sliceAdaptive": false,
"sliceMinHeight": 0,
"sliceSupportDensity": 0.25,
"sliceSupportOffset": 0.6,
"sliceSupportGap": 1,
"sliceSupportSize": 6,
"sliceSupportArea": 3,
"sliceSupportExtra": 0,
"sliceSupportAngle": 50,
"sliceSupportNozzle": 0,
"sliceSolidMinArea": 1,
"sliceBottomLayers": 3,
"sliceTopLayers": 3,
"firstLayerNozzleTemp": 230,
"firstLayerBedTemp": 55,
"firstLayerRate": 10,
"firstLayerFillRate": 10,
"firstLayerPrintMult": 1.2,
"firstLayerLineMult": 1,
"firstLayerFanSpeed": 0,
"outputRaft": false,
"outputRaftSpacing": 0.2,
"outputTemp": 230,
"outputBedTemp": 55,
"outputFanSpeed": 75,
"outputFeedrate": 23,
"outputFinishrate": 15,
"outputSeekrate": 100,
"outputShellMult": 1.15,
"outputFillMult": 1.15,
"outputSparseMult": 1.3,
"outputBrimCount": 5,
"outputBrimOffset": 5,
"outputRetractDist": 0.5,
"outputRetractSpeed": 20,
"outputRetractWipe": 0.8,
"outputRetractDwell": 10,
"outputShortPoly": 50,
"outputMinSpeed": 10,
"outputCoastDist": 0.4,
"outputLayerRetract": true,
"zHopDistance": 1,
"antiBacklash": 0,
"sliceLineWidth": 0.4,
"sliceFillRepeat": 1,
"sliceFillRate": 15,
"sliceSupportSpan": 5,
"sliceSupportEnable": false,
"sliceSupportOutline": true,
"firstSliceHeight": 0.3,
"firstLayerYOffset": 0,
"firstLayerBrim": 0,
"firstLayerBrimIn": 0,
"firstLayerBrimTrig": 0,
"firstLayerBrimGap": 0,
"firstLayerBeltLead": 3,
"firstLayerBeltBump": 0,
"firstLayerFlatten": 0,
"outputPurgeTower": 0,
"outputBeltFirst": false,
"outputLoops": 0,
"outputInvertX": false,
"outputInvertY": false,
"arcTolerance": 0.15,
"ranges": [],
"outputDraftShield": false,
"outputAvoidGaps": true,
"sliceFillGrow": 0,
"sliceSolidRate": 10,
"sliceDetectThin": "off",
"sliceLayerStartX": 0,
"sliceLayerStartY": 0,
"sliceSupportGrow": 0,
"outputAlternating": false
}
],
"filamentSource": "direct",
"gcodeTime": 1,
"gcodeFeature": [],
"extras": {
"palette": {
"printer": "57c7e3bd6e44",
"ping": null,
"feed": null,
"push": null,
"offset": null,
"heat": null,
"cool": null,
"press": null
}
}
}

View file

@ -0,0 +1,374 @@
{
"deviceName": "IMADE3D JellyBOX 4 N0.6",
"bedWidth": 180,
"bedDepth": 165,
"maxHeight": 150,
"mode": "FDM",
"new": false,
"internal": 0,
"imageURL": "",
"bedHeight": 2.5,
"bedRound": false,
"bedBelt": false,
"deviceZMax": 0,
"originCenter": false,
"gcodeFan": [
"M106 S{fan_speed}"
],
"gcodeTrack": [
"M117 {progress}% layer {layer} / {layers}"
],
"gcodeLayer": [
";; --- layer {layer} {height} @ {z} ---",
"M117 {progress}% layer {layer} / {layers}"
],
"gcodePre": [
";============================",
"; Jellybox Start Script Begin ",
";============================",
"; for slicer: Kiri:Moto",
"; modified 2024-02-01. by LG",
";",
"G21 ;metric values",
"G90 ;absolute positioning",
"M107 ;start with the fan off",
";",
"; === Homing and bed leveling (if necessary)",
";",
"G28 ;home all axes",
"G29 O ;auto bed leveling procedure only if leveling NOT active",
";M500 ;optionally save the mesh",
"G28 X ;home x to get as far from the plate as possible",
"M420 S1 ;(re) enable bed leveling if turned off by the G28",
"G0 Y0 F5000 ;position Y in front",
"G0 Z5 F3000 ;position Z",
"M190 S{bed_temp} T{tool} ;wait for the bed to reach desired temperature",
"M109 S{temp} T{tool} ;wait for the extruder to reach desired temperature",
"; ",
"; === Purge 30mm of the filament",
";",
"G90 ;absolute positioning",
"M400 ;make sure all is finished",
"G92 E0 ;to reset extruder position to 0 after finished previous print",
"G1 E30 F200 ;extrude 30mm of feed stock",
"G92 E0 ;reset the extruder position Z is 0 again.",
";",
"; === Print front line",
";",
";G0 Z0.2 ; move Z 0.3mm above bed",
";G1 X160 E30 F1000 ; intro line ",
";G92 E0 ;reset the extruder position Z is 0 again.",
";===================================",
"; Jellybox Printer Start Script End",
";==================================="
],
"gcodePost": [
";============================",
"; Jellybox End Script Begin ",
";============================",
"; modified 2024-02-01",
"M117 Finishing Up ;write Finishing Up",
"M107 ;turn the fan off",
"M104 S0 ;extruder heater off",
"M140 S0 ;bed heater off (if you have it)",
"G91 ;relative positioning (includes extruder)",
"G1 E-1 F2500 ;retract the filament a bit before lifting the nozzle to release some of the pressure",
"G1 Z0.5 E-4 X-10 F9000 ;get out and retract filament even more",
"G1 E-25 F2000 ;retract even more",
"G90 ;absolute positioning (includes extruder)",
"G28 X ;home X so the head is out of the way",
"G1 Y140 ;move Y forward, so the print is more accessible",
"G92 E0 ;reset the extruder position Z to 0",
"M84 ;steppers off",
"M117 Print finished ;write Print finished",
";=========================",
"; Jellybox End Script End ",
";========================="
],
"gcodeProc": "",
"gcodeFExt": "gcode",
"extruders": [
{
"extFilament": 1.75,
"extNozzle": 0.6,
"extOffsetX": 0,
"extOffsetY": 0
}
],
"fwRetract": false,
"profiles": [
{
"processName": "JB4 PLA - N0.6 L0.3 T220",
"sliceHeight": 0.3,
"sliceShells": 2,
"sliceShellOrder": "in-out",
"sliceLayerStart": "last",
"sliceFillAngle": 45,
"sliceFillWidth": 1,
"sliceFillOverlap": 0.25,
"sliceFillSparse": 0.1,
"sliceFillType": "hex",
"sliceAdaptive": false,
"sliceMinHeight": 0.1,
"sliceSupportDensity": 0.25,
"sliceSupportOffset": 0.6,
"sliceSupportGap": 1,
"sliceSupportSize": 6,
"sliceSupportArea": 3,
"sliceSupportExtra": 0,
"sliceSupportAngle": 50,
"sliceSupportNozzle": 0,
"sliceSolidMinArea": 1,
"sliceBottomLayers": 3,
"sliceTopLayers": 3,
"firstLayerNozzleTemp": 220,
"firstLayerBedTemp": 65,
"firstLayerRate": 40,
"firstLayerFillRate": 50,
"firstLayerPrintMult": 1,
"firstLayerLineMult": 1,
"firstLayerFanSpeed": 0,
"outputRaft": false,
"outputRaftSpacing": 0.2,
"outputTemp": 220,
"outputBedTemp": 60,
"outputFanSpeed": 200,
"outputFeedrate": 60,
"outputFinishrate": 30,
"outputSeekrate": 100,
"outputShellMult": 1.1,
"outputFillMult": 1.1,
"outputSparseMult": 1.2,
"outputBrimCount": 5,
"outputBrimOffset": 5,
"outputRetractDist": 2.4,
"outputRetractSpeed": 40,
"outputRetractWipe": 0.8,
"outputRetractDwell": 10,
"outputShortPoly": 50,
"outputMinSpeed": 10,
"outputCoastDist": 0.4,
"outputLayerRetract": false,
"zHopDistance": 0.3,
"antiBacklash": 0,
"sliceLineWidth": 0.6,
"sliceFillRepeat": 1,
"sliceFillRate": 0,
"sliceSupportSpan": 5,
"sliceSupportEnable": false,
"sliceSupportOutline": true,
"firstSliceHeight": 0.3,
"firstLayerYOffset": 0,
"firstLayerBrim": 0,
"firstLayerBrimIn": 0,
"firstLayerBrimTrig": 0,
"firstLayerBrimGap": 0,
"firstLayerBeltLead": 3,
"firstLayerBeltBump": 0,
"firstLayerFlatten": 0,
"outputPurgeTower": 0,
"outputBeltFirst": false,
"outputLoops": 0,
"outputInvertX": false,
"outputInvertY": false,
"arcTolerance": 0.15,
"ranges": [],
"outputDraftShield": false,
"outputAvoidGaps": true,
"sliceFillGrow": 0,
"sliceSolidRate": 0,
"sliceDetectThin": "off",
"sliceLayerStartX": 0,
"sliceLayerStartY": 0,
"sliceSupportGrow": 0,
"outputAlternating": false
},
{
"processName": "JB4 PETG - N0.6 L0.3 T245",
"sliceHeight": 0.3,
"sliceShells": 2,
"sliceShellOrder": "in-out",
"sliceLayerStart": "last",
"sliceFillAngle": 45,
"sliceFillWidth": 1,
"sliceFillOverlap": 0.25,
"sliceFillSparse": 0.1,
"sliceFillType": "hex",
"sliceAdaptive": false,
"sliceMinHeight": 0.1,
"sliceSupportDensity": 0.25,
"sliceSupportOffset": 0.6,
"sliceSupportGap": 1,
"sliceSupportSize": 6,
"sliceSupportArea": 3,
"sliceSupportExtra": 0,
"sliceSupportAngle": 50,
"sliceSupportNozzle": 0,
"sliceSolidMinArea": 1,
"sliceBottomLayers": 2,
"sliceTopLayers": 3,
"firstLayerNozzleTemp": 245,
"firstLayerBedTemp": 75,
"firstLayerRate": 30,
"firstLayerFillRate": 35,
"firstLayerPrintMult": 1,
"firstLayerLineMult": 1,
"firstLayerFanSpeed": 0,
"outputRaft": false,
"outputRaftSpacing": 0.2,
"outputTemp": 245,
"outputBedTemp": 70,
"outputFanSpeed": 128,
"outputFeedrate": 100,
"outputFinishrate": 50,
"outputSeekrate": 120,
"outputShellMult": 1.1,
"outputFillMult": 1.1,
"outputSparseMult": 1.2,
"outputBrimCount": 5,
"outputBrimOffset": 5,
"outputRetractDist": 2.8,
"outputRetractSpeed": 40,
"outputRetractWipe": 0.8,
"outputRetractDwell": 10,
"outputShortPoly": 50,
"outputMinSpeed": 10,
"outputCoastDist": 0.4,
"outputLayerRetract": false,
"zHopDistance": 0.3,
"antiBacklash": 0,
"sliceLineWidth": 0.6,
"sliceFillRepeat": 1,
"sliceFillRate": 0,
"sliceSupportSpan": 5,
"sliceSupportEnable": false,
"sliceSupportOutline": true,
"firstSliceHeight": 0.3,
"firstLayerYOffset": 0,
"firstLayerBrim": 0,
"firstLayerBrimIn": 0,
"firstLayerBrimTrig": 0,
"firstLayerBrimGap": 0,
"firstLayerBeltLead": 3,
"firstLayerBeltBump": 0,
"firstLayerFlatten": 0,
"outputPurgeTower": 0,
"outputBeltFirst": false,
"outputLoops": 0,
"outputInvertX": false,
"outputInvertY": false,
"arcTolerance": 0.15,
"ranges": [],
"outputDraftShield": false,
"outputAvoidGaps": true,
"sliceFillGrow": 0,
"sliceSolidRate": 0,
"sliceDetectThin": "off",
"sliceLayerStartX": 0,
"sliceLayerStartY": 0,
"sliceSupportGrow": 0,
"outputAlternating": false
},
{
"processName": "JB4 TPU - N0.6 L0.3 T235",
"sliceHeight": 0.3,
"sliceShells": 2,
"sliceShellOrder": "in-out",
"sliceLayerStart": "last",
"sliceFillAngle": 45,
"sliceFillWidth": 1,
"sliceFillOverlap": 0.25,
"sliceFillSparse": 0.1,
"sliceFillType": "hex",
"sliceAdaptive": false,
"sliceMinHeight": 0.1,
"sliceSupportDensity": 0.25,
"sliceSupportOffset": 0.6,
"sliceSupportGap": 1,
"sliceSupportSize": 6,
"sliceSupportArea": 3,
"sliceSupportExtra": 0,
"sliceSupportAngle": 50,
"sliceSupportNozzle": 0,
"sliceSolidMinArea": 1,
"sliceBottomLayers": 2,
"sliceTopLayers": 3,
"firstLayerNozzleTemp": 235,
"firstLayerBedTemp": 55,
"firstLayerRate": 10,
"firstLayerFillRate": 15,
"firstLayerPrintMult": 1,
"firstLayerLineMult": 1,
"firstLayerFanSpeed": 0,
"outputRaft": false,
"outputRaftSpacing": 0.2,
"outputTemp": 235,
"outputBedTemp": 40,
"outputFanSpeed": 64,
"outputFeedrate": 15,
"outputFinishrate": 10,
"outputSeekrate": 40,
"outputShellMult": 1.3,
"outputFillMult": 1.1,
"outputSparseMult": 1.3,
"outputBrimCount": 5,
"outputBrimOffset": 5,
"outputRetractDist": 2.8,
"outputRetractSpeed": 40,
"outputRetractWipe": 0.8,
"outputRetractDwell": 10,
"outputShortPoly": 50,
"outputMinSpeed": 10,
"outputCoastDist": 0.4,
"outputLayerRetract": false,
"zHopDistance": 1,
"antiBacklash": 0,
"sliceLineWidth": 0.6,
"sliceFillRepeat": 1,
"sliceFillRate": 0,
"sliceSupportSpan": 5,
"sliceSupportEnable": false,
"sliceSupportOutline": true,
"firstSliceHeight": 0.3,
"firstLayerYOffset": 0,
"firstLayerBrim": 0,
"firstLayerBrimIn": 0,
"firstLayerBrimTrig": 0,
"firstLayerBrimGap": 0,
"firstLayerBeltLead": 3,
"firstLayerBeltBump": 0,
"firstLayerFlatten": 0,
"outputPurgeTower": 0,
"outputBeltFirst": false,
"outputLoops": 0,
"outputInvertX": false,
"outputInvertY": false,
"arcTolerance": 0.15,
"ranges": [],
"outputDraftShield": false,
"outputAvoidGaps": true,
"sliceFillGrow": 0,
"sliceSolidRate": 0,
"sliceDetectThin": "off",
"sliceLayerStartX": 0,
"sliceLayerStartY": 0,
"sliceSupportGrow": 0,
"outputAlternating": false
}
],
"filamentSource": "direct",
"gcodeTime": 1,
"gcodeFeature": [],
"extras": {
"palette": {
"printer": "3c0a256d3a4a",
"ping": null,
"feed": null,
"push": null,
"offset": null,
"heat": null,
"cool": null,
"press": null
}
}
}

View file

@ -0,0 +1,35 @@
{
"pre":[
"M104 S{temp} T{tool} ; set extruder temperature",
"M140 S{bed_temp} T{tool} ; set bed temperature",
"G90 ; set absolute positioning mode",
"M83 ; set relative positioning for extruder",
"M107 ; turn off filament cooling fan",
"G28 X0 Y0 ; home XY axes",
"G28 Z0 ; home Z axis",
"G92 X0 Y0 Z0 E0 ; reset all axes positions",
"G1 Z0.25 F180 ; move z to 0.25mm over bed",
"G92 E0 ; zero the extruded",
"M109 S{temp} T{tool} ; wait for extruder to reach target temp",
"G1 E15 F300 ; purge 15mm from extruder",
"G92 E0 ; zero the extruded",
"G1 F225 ; set feed speed"
],
"post":[
"M107 ; turn off filament cooling fan",
"M104 S0 T{tool} ; turn off right extruder",
"M140 S0 T{tool} ; turn off bed",
"G1 Z{z_max} F1200 ; drop bed",
"G28 X0 Y0 ; home XY axes",
"M84 ; disable stepper motors"
],
"cmd":{
"fan_power": "M106 S{fan_speed}"
},
"settings":{
"origin_center": false,
"bed_width": 270,
"bed_depth": 280,
"build_height": 180
}
}

View file

@ -0,0 +1,37 @@
{
"pre":[
"M108 S255 ; set extruder speed",
"M104 S{temp} T{tool} ; set extruder temperature",
"M140 S{bed_temp} T{tool} ; set bed temperature",
"G90 ; set absolute positioning mode",
"M83 ; set relative positioning for extruder",
"M107 ; turn off filament cooling fan",
"G28 XY ; home XY axes",
"G28 Z ; home Z axis",
"G92 X0 Y0 Z0 E0 ; reset all axes positions",
"G1 Z0.25 F180 ; move z to 0.25mm over bed",
"G92 E0 ; zero the extruded",
"M109 S{temp} T{tool} ; wait for extruder to reach target temp",
"G1 E15 F300 ; purge 15mm from extruder",
"G92 E0 ; zero the extruded",
"G1 F225 ; set feed speed"
],
"post":[
"M108 S0 ; set extruder speed",
"M107 ; turn off filament cooling fan",
"M104 S0 T{tool} ; turn off right extruder",
"M140 S0 T{tool} ; turn off bed",
"G1 Z200 F1200 ; drop bed",
"G28 X0 Y0 ; home XY axes",
"M84 ; disable stepper motors"
],
"cmd":{
"fan_power": "M106 S{fan_speed}"
},
"settings":{
"origin_center": false,
"bed_width": 200,
"bed_depth": 250,
"build_height": 200
}
}

View file

@ -0,0 +1,44 @@
{
"pre":[
"M73 P0 ; set progress to 0%",
"G90 ; set absolute positioning mode",
"M83 ; set relative positioning for extruder",
"M104 S{temp} T{tool} ; set extruder temperature for T{tool} (tool 0)",
"M127 ; close extruder valve (if it has one)",
"G162 X Y F3000 ; move X,Y axis to maximum position at speed 3000 (top/right of table)",
"G161 Z F1200 ; move Z axis to minimum position as speed 1200 (bottom)",
"G92 Z-5 ; set Z axis value to -5 (no move)",
"G1 Z0 ; move Z axis to 0 (lifting it 5mm off endstop)",
"G161 Z F100 ; move Z axis to minimum position at speed 100",
"M132 X Y Z A B ; load EEPROM home offsets for all axis",
"G1 X{left} Y{bottom+10} Z30 F9000 ; move to wait position off table",
"G130 X20 Y20 Z20 A20 B20 ; lower stepper Vrefs to give more juice to the extruder heater",
"M133 T{tool} ; wait for extruder T{tool} temperature to stabilize",
"G130 X127 Y127 Z40 A127 B127 ; default stepper Vrefs now that extruder is hot",
"G92 A0 ; set extruder position value to 0 (no move)",
"G1 Z0.4 ; move nozzle just above the bed height",
"G1 E25 F300 ; purge extruder for 25mm at speed 300",
"G1 X{left+10} Y{bottom+10} Z0.15 F1200 ; slow wipe",
"G1 X{left+15} Y{bottom+15} Z0.5 F1200 ; lift",
"G92 A0 ; set extruder position value to 0 (no move)",
"M135 T{tool} ; set toolhead 0"
],
"post":[
"M127 ; stop filament cooling fan",
"M73 P100 ; set build progress to 100%",
"G1 Z150 F1000 ; send Z axis to bottom (engaging end stop)",
"G162 X Y F3000 ; move X,Y axis to maximum position at speed 3000 (top/right of table)",
"M18 ; disable all stepper motors",
"M72 P1 ; play song 1 (tada)"
],
"cmd":{
"fan_power": "M126 S{fan_speed}",
"progress": "M73 P{progress}"
},
"settings":{
"origin_center": true,
"bed_width": 300,
"bed_depth": 175,
"build_height": 150
}
}

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