checkpoint sla work

This commit is contained in:
Stewart Allen 2020-04-13 17:42:40 -04:00
commit 1e98f81cc6
14 changed files with 643 additions and 486 deletions

View file

@ -6,11 +6,12 @@ let gs_kiri_conf = exports;
(function() {
if (!self.kiri) self.kiri = { };
if (!self.kiri) self.kiri = {};
if (self.kiri.conf) return;
let KIRI = self.kiri,
CVER = 185;
CVER = 185,
clone = Object.clone;
function genID() {
while (true) {
@ -19,37 +20,47 @@ let gs_kiri_conf = exports;
}
}
// add fields to o(bject) from t(arget) that are missing
// remove fields from o(bject) that don't exist in f(ilter)
function fill_cull(o, t, f) {
if (!o) return;
// add fields to o(bject) from d(efault) that are missing
// remove fields from o(bject) that don't exist in d(efault)
function fill_cull_once(obj, def) {
if (!obj) return;
// add missing
for (let k in t) {
if (!t.hasOwnProperty(k)) {
continue;
}
let okv = o[k];
if (f[k] !== undefined && (okv === undefined || okv === null)) {
// console.log({fill: k});
o[k] = t[k];
for (let k in def) {
if (def.hasOwnProperty(k)) {
let okv = obj[k];
if ((okv === undefined || okv === null)) {
// console.log({fill: k});
obj[k] = def[k];
}
}
}
// remove invalid
for (let k in o) {
if (!o.hasOwnProperty(k)) {
continue;
}
if (!f.hasOwnProperty(k)) {
for (let k in obj) {
if (!def.hasOwnProperty(k)) {
// console.log({cull: k});
delete o[k];
delete obj[k];
}
}
}
function fill_cull_many(map, def) {
forValues(map, (obj) => { fill_cull_once(obj, def) });
}
function objectMap(o, fn) {
for (let [key, val] of Object.entries(o)) {
o[key] = fn(val) || val;
}
}
function valueOf(val, dv) {
return typeof(val) !== 'undefined' ? val : dv;
}
function forValues(o, fn) {
Object.values(o).forEach(v => fn(v));
}
function device_v1_to_v2(device) {
if (device && device.filamentSize) {
device.extruders = [{
@ -74,6 +85,8 @@ let gs_kiri_conf = exports;
set = code.settings || {},
ext = code.extruders;
// currently causes unecessary fills and culls because
// it's not mode and device type sensitive
let device = {
mode: mode || code.mode || '',
internal: 0,
@ -106,7 +119,7 @@ let gs_kiri_conf = exports;
if (ext) {
// synthesize extruders from new style settings
ext.forEach(rec => {
let e = API.clone(CONF.template.device.extruders[0]);
let e = API.clone(CONF.defaults.fdm.d.extruders[0]);
if (rec.nozzle) e.extNozzle = rec.nozzle;
if (rec.filament) e.extFilament = rec.filament;
if (rec.offset_x) e.extOffsetX = rec.offset_x;
@ -116,7 +129,7 @@ let gs_kiri_conf = exports;
});
} else {
// synthesize extruders from old style settings
device.extruders = [API.clone(CONF.template.device.extruders[0])];
device.extruders = [API.clone(CONF.defaults.fdm.d.extruders[0])];
device.extruders[0].extNozzle = valueOf(set.nozzle_size, 0.4);
device.extruders[0].extFilament = valueOf(set.filament_diameter, 1.75);
}
@ -124,36 +137,14 @@ let gs_kiri_conf = exports;
return device;
}
function objectMap(o, fn) {
for (let [key, val] of Object.entries(o)) {
o[key] = fn(val) || val;
}
}
function forValues(o, fn) {
Object.values(o).forEach(v => fn(v));
}
// ensure settings structure is up-to-date
function normalize(settings) {
let API = KIRI.api,
filter = CONF.filter,
defaults = CONF.template,
filter_dev = filter.fdm.d,
filter_pro = filter.fdm.p;
switch (settings.mode) {
case 'FDM':
break;
case 'CAM':
filter_dev = filter.cam.d;
filter_pro = filter.cam.p;
break;
case 'LASER':
filter_dev = filter.laser.d;
filter_pro = filter.laser.p;
break;
}
defaults = CONF.defaults,
template = CONF.template,
mode = settings.mode.toLowerCase(),
default_dev = defaults[mode].d,
default_pro = defaults[mode].p;
// v1 to v2 changed FDM extruder / nozzle / filament structure
if (settings.ver != CVER) {
@ -167,22 +158,22 @@ let gs_kiri_conf = exports;
settings.ver = CVER;
}
fill_cull(settings, defaults, defaults);
fill_cull(settings.device, defaults.device, filter_dev);
fill_cull(settings.process, defaults.process, filter_pro);
fill_cull(settings.cdev.FDM, defaults.device, filter.fdm.d);
forValues(settings.sproc.FDM, proc => {
fill_cull(proc, defaults.process, filter.fdm.p);
});
fill_cull(settings.cdev.CAM, defaults.device, filter.cam.d);
forValues(settings.sproc.CAM, proc => {
fill_cull(proc, defaults.process, filter.cam.p);
});
fill_cull(settings.cdev.LASER, defaults.device, filter.laser.d);
forValues(settings.sproc.LASER, proc => {
fill_cull(proc, defaults.process, filter.laser.p);
});
fill_cull(settings.controller, defaults.controller, defaults.controller);
fill_cull_once(settings, template);
fill_cull_once(settings.device, default_dev);
fill_cull_once(settings.process, default_pro);
fill_cull_once(settings.cdev, template.cdev);
fill_cull_once(settings.cproc, template.cproc);
fill_cull_once(settings.sproc, template.sproc);
fill_cull_once(settings.defaults, template.defaults);
fill_cull_once(settings.cdev.FDM, defaults.fdm.d);
fill_cull_once(settings.cdev.SLA, defaults.sla.d);
fill_cull_once(settings.cdev.CAM, defaults.cam.d);
fill_cull_once(settings.cdev.LASER, defaults.laser.d);
fill_cull_many(settings.sproc.FDM, defaults.fdm.p);
fill_cull_many(settings.sproc.SLA, defaults.sla.p);
fill_cull_many(settings.sproc.CAM, defaults.cam.p);
fill_cull_many(settings.sproc.LASER, defaults.laser.p);
fill_cull_once(settings.controller, template.controller);
return settings;
}
@ -194,210 +185,237 @@ let gs_kiri_conf = exports;
// ---------------
MODES: {
FDM: 1, // fused deposition modeling (also FFF)
LASER: 2, // laser cutting
CAM: 3 // 3 axis milling/machining
LASER: 2, // laser cutters
CAM: 3, // 3 axis milling/machining
SLA: 4 // cured resin printers
},
VIEWS: {
ARRANGE: 1,
SLICE: 2,
PREVIEW: 3
},
// --------------- settings field filters
filter: {
// --------------- device and process defaults
defaults: {
fdm:{
// fields permitted in FDM:Device
// device defaults FDM:Device
d:{
mode: 1,
internal: 1,
bedWidth: 1,
bedDepth: 1,
bedHeight: 1,
bedRound: 1,
maxHeight: 1,
extrudeAbs: 1,
originCenter: 1,
gcodePre: 1,
gcodePost: 1,
gcodeProc: 1,
gcodePause: 1,
gcodeFExt: 1,
gcodeFan: 1,
gcodeTrack: 1,
gcodeLayer: 1,
extruders: 1
mode: "",
internal: 0,
bedWidth: 300,
bedDepth: 175,
bedHeight: 2.5,
bedRound: false,
originCenter: false,
maxHeight: 150,
gcodePre: [],
gcodePost: [],
gcodePause: [],
gcodeProc: "",
gcodeFan: "",
gcodeTrack: "",
gcodeLayer: [],
gcodeFExt: "",
extruders:[{
extFilament: 1.75,
extNozzle: 0.4,
extSelect: ["T0"],
extOffsetX: 0,
extOffsetY: 0
}]
},
// fields permitted in FDM:Process
// process defaults FDM:Process
p:{
processName: 1,
sliceHeight: 1,
sliceShells: 1,
sliceFillAngle: 1,
sliceFillOverlap: 1,
sliceFillSparse: 1,
sliceFillType: 1,
sliceSupportEnable: 1,
sliceSupportDensity: 1,
sliceSupportOffset: 1,
processName: "default",
sliceHeight: 0.25,
sliceShells: 3,
sliceFillAngle: 45,
sliceFillOverlap: 0.3,
sliceFillSparse: 0.5,
sliceFillType: "hex",
sliceSupportEnable: false,
sliceSupportDensity: 0.25,
sliceSupportOffset: 1.0,
sliceSupportGap: 1,
sliceSupportSize: 1,
sliceSupportSize: 10,
sliceSupportArea: 1,
sliceSupportExtra: 1,
sliceSupportSpan: 1,
sliceSupportNozzle: 1,
sliceSupportExtra: 0,
sliceSupportSpan: 6,
sliceSupportNozzle: 0,
sliceSolidMinArea: 1,
sliceSolidLayers: 1,
sliceBottomLayers: 1,
sliceTopLayers: 1,
firstSliceHeight: 1,
firstLayerRate: 1,
firstLayerFillRate: 1,
firstLayerPrintMult: 1,
firstLayerNozzleTemp: 1,
firstLayerBedTemp: 1,
outputRaft: 1,
outputRaftSpacing: 1,
outputTemp: 1,
outputFanMax: 1,
outputBedTemp: 1,
outputFeedrate: 1,
outputFinishrate: 1,
outputSeekrate: 1,
outputShellMult: 1,
outputFillMult: 1,
outputSparseMult: 1,
sliceSolidLayers: 3,
sliceBottomLayers: 3,
sliceTopLayers: 3,
firstSliceHeight: 0.25,
firstLayerRate: 30,
firstLayerFillRate: 40,
firstLayerPrintMult: 1.0,
firstLayerNozzleTemp: 0,
firstLayerBedTemp: 0,
outputRaft: false,
outputRaftSpacing: 0.2,
outputTemp: 200,
outputFanMax: 255,
outputBedTemp: 0,
outputFeedrate: 80,
outputFinishrate: 60,
outputSeekrate: 100,
outputShellMult: 1.2,
outputFillMult: 1.2,
outputSparseMult: 1.2,
outputFanLayer: 1,
outputRetractDist: 1,
outputRetractSpeed: 1,
outputRetractDwell: 1,
outputBrimCount: 1,
outputBrimOffset: 1,
outputShortPoly: 1,
outputMinSpeed: 1,
outputCoastDist: 1,
outputWipeDistance: 1,
sliceMinHeight: 1,
// detectThinWalls: 1,
outputRetractDist: 1.0,
outputRetractSpeed: 40,
outputRetractDwell: 30,
outputBrimCount: 2,
outputBrimOffset: 2,
outputShortPoly: 50.0,
outputMinSpeed: 15.0,
outputCoastDist: 0,
outputWipeDistance: 0,
sliceMinHeight: 0,
detectThinWalls: false,
antiBacklash: 1,
zHopDistance: 1,
// polishLayers: 1,
// polishSpeed: 1,
outputLayerRetract: 1,
gcodePauseLayers: 1,
outputClockwise: 1,
outputOriginCenter: 1,
outputInvertX: 1,
outputInvertY: 1
zHopDistance: 0.2,
outputLayerRetract: false,
gcodePause: "",
outputOriginCenter: true,
outputInvertX: false,
outputInvertY: false,
}
},
sla:{
// device defaults SLA:Device
d:{
mode: "",
internal: 0,
bedWidth: 150,
bedDepth: 150,
bedHeight: 2.5,
maxHeight: 150,
originCenter: false
},
// process defaults SLA:Process
p:{
processName: "default",
slaSlice: 0.05,
slaSupportEnable: false,
slaSupportDensity: 0.5,
slaSupportSize: 2,
slaSupportArea: 1,
slaSupportSpan: 2,
slaSolidLayers: 5,
slaBottomLayers: 5,
slaTopLayers: 5
}
},
cam:{
// fields permitted in CAM:Device
// device defaults CAM:Device
d:{
mode: 1,
internal: 1,
bedWidth: 1,
bedDepth: 1,
bedHeight: 1,
originCenter: 1,
spindleMax: 1,
gcodePre: 1,
gcodePost: 1,
gcodeDwell: 1,
gcodeChange: 1,
gcodeSpindle: 1,
gcodeFExt: 1,
gcodeSpace: 1,
gcodeStrip: 1
mode: "",
internal: 0,
bedWidth: 300,
bedDepth: 175,
bedHeight: 2.5,
originCenter: false,
spindleMax: 0,
gcodePre: [],
gcodePost: [],
gcodeFExt: "",
gcodeSpace: true,
gcodeStrip: true,
gcodeDwell: ["G4 P{time}"],
gcodeChange: ["M6 T{tool}"],
gcodeSpindle: ["M3 S{speed}"]
},
// fields permitted in CAM:Process
// process defaults CAM:Process
p:{
processName: 1,
camFastFeed: 1,
roughingTool: 1,
roughingSpindle: 1,
roughingDown: 1,
roughingOver: 1,
roughingSpeed: 1,
roughingPlunge: 1,
roughingStock: 1,
camPocketOnlyRough: 1,
roughingOn: 1,
finishingTool: 1,
finishingSpindle: 1,
finishingDown: 1,
finishingOver: 1,
finishingAngle: 1,
finishingSpeed: 1,
finishingPlunge: 1,
finishingOn: 1,
finishingXOn: 1,
finishingYOn: 1,
finishCurvesOnly: 1,
camPocketOnlyFinish: 1,
drillTool: 1,
drillSpindle: 1,
drillDownSpeed: 1,
drillDown: 1,
drillDwell: 1,
drillLift: 1,
drillingOn: 1,
camTabsAngle: 1,
camTabsCount: 1,
camTabsWidth: 1,
camTabsHeight: 1,
camTabsOn: 1,
camPocketOnly: 1,
camDepthFirst: 0,
camEaseDown: 1,
camOriginTop: 1,
camTolerance: 1,
camZTopOffset: 1,
camZBottom: 1,
processName: "default",
camFastFeed: 6000,
roughingTool: 1000,
roughingSpindle: 1000,
roughingDown: 2,
roughingOver: 0.5,
roughingSpeed: 1000,
roughingPlunge: 250,
roughingStock: 0,
camPocketOnlyRough: false,
roughingOn: true,
finishingTool: 1000,
finishingSpindle: 1000,
finishingDown: 3,
finishingOver: 0.5,
finishingAngle: 85,
finishingSpeed: 800,
finishingPlunge: 250,
finishingOn: true,
finishingXOn: true,
finishingYOn: true,
finishCurvesOnly: false,
camPocketOnlyFinish: false,
drillTool: 1000,
drillSpindle: 1000,
drillDownSpeed: 250,
drillDown: 5,
drillDwell: 250,
drillLift: 2,
drillingOn: false,
camTabsAngle: 0,
camTabsCount: 4,
camTabsWidth: 5,
camTabsHeight: 5,
camTabsOn: false,
camPocketOnly: false,
camDepthFirst: false,
camEaseDown: false,
camOriginTop: true,
camTolerance: 0.15,
camZTopOffset: 0,
camZBottom: 0,
camZClearance: 1,
camStockX: 1,
camStockY: 1,
camStockZ: 1,
camStockOffset: 1,
outputClockwise: 1,
outputOriginCenter: 1,
outputInvertX: 1,
outputInvertY: 1
camStockX: 0,
camStockY: 0,
camStockZ: 0,
camStockOffset: true,
outputClockwise: false,
outputOriginCenter: true,
outputInvertX: false,
outputInvertY: false
}
},
laser: {
// fields permitted in Laser:Device
// device defaults Laser:Device
d:{
mode: 1,
internal: 1,
bedWidth: 1,
bedDepth: 1,
bedHeight: 1,
gcodePre: 1,
gcodePost: 1,
gcodeFExt: 1,
gcodeSpace: 1,
gcodeLaserOn: 1,
gcodeLaserOff: 1
mode: "",
internal: 0,
bedWidth: 300,
bedDepth: 175,
bedHeight: 2.5,
gcodePre: [],
gcodePost: [],
gcodeFExt: "",
gcodeSpace: true,
gcodeLaserOn: ["M106 S{power}"],
gcodeLaserOff: ["M107"]
},
// fields permitted in Laser:Process
// process defaults Laser:Process
p:{
processName: 1,
laserOffset: 1,
processName: "default",
laserOffset: 0.25,
laserSliceHeight: 1,
laserSliceSingle: 1,
laserSliceSingle: false,
outputTileSpacing: 1,
outputTileScaling: 1,
outputLaserPower: 1,
outputLaserSpeed: 1,
outputLaserGroup: 1,
outputLaserMerged: 1,
outputOriginBounds: 1,
outputOriginCenter: 1,
outputInvertX: 1,
outputInvertY: 1
outputLaserPower: 100,
outputLaserSpeed: 1000,
outputLaserGroup: true,
outputLaserMerged: false,
outputOriginCenter: true,
outputInvertX: false,
outputInvertY: false
}
}
},
// --------------- default settings
// --------------- settings template
template: {
// CAM only
bounds: {},
@ -444,198 +462,44 @@ let gs_kiri_conf = exports;
taper_tip: 0,
}
],
// FDM/CAM/Laser merged
device:{
mode: "", // device local
internal: 0, // device edit state
bedWidth: 300, // FDM/CAM/Laser
bedDepth: 175, // FDM/CAM/Laser
bedHeight: 2.5, // display only (deprecate)
bedRound: false, // FDM
originCenter: false,// FDM/CAM
maxHeight: 150, // FDM
spindleMax: 0, // CAM
gcodePre: [], // FDM/CAM header script
gcodePost: [], // FDM/CAM footer script
gcodePause: [], // FDM pause script
gcodeProc: "", // FDM post processor script (encoding, etc)
gcodeFan: "", // FDM fan command
gcodeTrack: "", // FDM progress command
gcodeLayer: [], // FDM layer output
gcodeFExt: "", // CAM file extension
gcodeSpace: true, // CAM token spacing
gcodeStrip: true, // CAM strip comments
gcodeDwell: ["G4 P{time}"], // CAM dwell script
gcodeChange: ["M6 T{tool}"], // CAM tool change script
gcodeSpindle: ["M3 S{speed}"], // CAM spindle speed
gcodeLaserOn: ["M106 S{power}"],// LASER turn on
gcodeLaserOff: ["M107"], // LASER turn off
extruders:[{ // FDM extruders structure
extFilament: 1.75,
extNozzle: 0.4,
extSelect: ["T0"],
extOffsetX: 0,
extOffsetY: 0
}]
},
// FDM/CAM/Laser merged
process:{
// --- shared ---
processName: "default",
outputOriginBounds: true,
outputOriginCenter: true,
outputInvertX: false,
outputInvertY: false,
// --- FDM ---
sliceHeight: 0.25,
sliceShells: 3,
sliceFillAngle: 45,
sliceFillOverlap: 0.3,
sliceFillSparse: 0.5,
sliceFillType: "hex",
sliceSupportEnable: false,
sliceSupportDensity: 0.25,
sliceSupportOffset: 1.0,
sliceSupportGap: 1,
sliceSupportSize: 10,
sliceSupportArea: 1,
sliceSupportExtra: 0,
sliceSupportSpan: 6,
sliceSupportNozzle: 0,
sliceSolidMinArea: 1,
sliceSolidLayers: 3,
sliceBottomLayers: 3,
sliceTopLayers: 3,
firstSliceHeight: 0.25,
firstLayerRate: 30,
firstLayerFillRate: 40,
firstLayerPrintMult: 1.0,
firstLayerNozzleTemp: 0,
firstLayerBedTemp: 0,
outputRaft: false,
outputRaftSpacing: 0.2,
outputTemp: 200,
outputFanMax: 255,
outputBedTemp: 0,
outputFeedrate: 80,
outputFinishrate: 60,
outputSeekrate: 100,
outputShellMult: 1.2,
outputFillMult: 1.2,
outputSparseMult: 1.2,
outputFanLayer: 1,
outputRetractDist: 1.0,
outputRetractSpeed: 40,
outputRetractDwell: 30,
outputBrimCount: 2,
outputBrimOffset: 2,
outputShortPoly: 50.0,
outputMinSpeed: 15.0,
outputCoastDist: 0,
outputWipeDistance: 0,
sliceMinHeight: 0,
detectThinWalls: false,
antiBacklash: 1,
zHopDistance: 0.2,
// polishLayers: 0,
// polishSpeed: 40,
outputLayerRetract: false,
gcodePauseLayers: "",
// --- LASER ---
laserOffset: 0.25,
laserSliceHeight: 1,
laserSliceSingle: false,
outputTileSpacing: 1,
outputTileScaling: 1,
outputLaserPower: 100,
outputLaserSpeed: 1000,
outputLaserGroup: true,
outputLaserMerged: false,
// --- CAM ---
camFastFeed: 6000,
roughingTool: 1000,
roughingSpindle: 1000,
roughingDown: 2,
roughingOver: 0.5,
roughingSpeed: 1000,
roughingPlunge: 250,
roughingStock: 0,
camPocketOnlyRough: false,
roughingOn: true,
finishingTool: 1000,
finishingSpindle: 1000,
finishingDown: 3,
finishingOver: 0.5,
finishingAngle: 85,
finishingSpeed: 800,
finishingPlunge: 250,
finishingOn: true,
finishingXOn: true,
finishingYOn: true,
finishCurvesOnly: false,
camPocketOnlyFinish: false,
drillTool: 1000,
drillSpindle: 1000,
drillDownSpeed: 250,
drillDown: 5,
drillDwell: 250,
drillLift: 2,
drillingOn: false,
camTabsAngle: 0,
camTabsCount: 4,
camTabsWidth: 5,
camTabsHeight: 5,
camTabsOn: false,
camPocketOnly: false,
camDepthFirst: false,
camEaseDown: false,
camOriginTop: true,
camTolerance: 0.15,
camZTopOffset: 0,
camZBottom: 0,
camZClearance: 1,
camStockX: 0,
camStockY: 0,
camStockZ: 0,
camStockOffset: true,
outputClockwise: false,
},
// current process name
// currently selected device
device:{},
// currently selected process
process:{},
// current process name by mode
cproc:{
FDM: "default",
SLA: "default",
CAM: "default",
LASER: "default"
},
// saved processes by name
// stored processes by mode
sproc:{
FDM: {},
SLA: {},
CAM: {},
LASER: {}
},
// cached device settings by mode
cdev: {
FDM: null,
CAM: null,
LASER: null
},
// now they're called devices instead of gcode filters
// current device name by mode
filter:{
FDM: "Any.Generic.Marlin",
SLA: "Any.Generic.SLA",
CAM: "Any.Generic.Grbl",
LASER: "Any.Generic.Laser"
},
// custom devices by name
devices:{
},
// favorite devices
favorites:{
// stored device by mode
cdev: {
FDM: null,
SLA: null,
CAM: null,
LASER: null
},
// custom devices by name (all modes)
devices:{},
// favorited devices (all modes)
favorites:{},
// map of device to last process setting (name)
devproc: {
},
devproc: {},
layers:{
layerOutline: true,
layerTrace: true,
@ -652,9 +516,6 @@ let gs_kiri_conf = exports;
layerPrint: false,
layerMoves: false
},
// for passing temporary slice hints (topo currently)
synth: {
},
controller:{
view: null,
dark: false,
@ -668,13 +529,26 @@ let gs_kiri_conf = exports;
alignTop: true,
units: "mm"
},
// widget extra info for slicing (like extruder mapping)
widget: {
},
// for passing temporary slice hints (topo currently)
synth: {},
// widget extra info for slicing (extruder mapping)
widget: {},
mode: 'FDM',
id: genID(),
ver: CVER
}
};
let settings = CONF.template;
// seed defaults. will get culled on save
settings.sproc.FDM.default = clone(settings.process);
settings.sproc.SLA.default = clone(settings.process);
settings.sproc.CAM.default = clone(settings.process);
settings.sproc.LASER.default = clone(settings.process);
settings.cdev.FDM = clone(settings.device);
settings.cdev.SLA = clone(settings.device);
settings.cdev.CAM = clone(settings.device);
settings.cdev.LASER = clone(settings.device);
})();