grid-apps-cmms/src/kiri/conf.js

642 lines
23 KiB
JavaScript
Raw Normal View History

2020-06-03 22:39:30 -04:00
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
2020-03-09 11:02:09 -04:00
"use strict";
(function() {
if (self.kiri.conf) return;
2020-06-03 22:39:30 -04:00
const KIRI = self.kiri, CVER = 185, clone = Object.clone;
2020-03-09 11:02:09 -04:00
function genID() {
while (true) {
2020-04-09 14:52:43 -04:00
let k = Math.round(Math.random() * 9999999999).toString(36);
2020-03-09 11:02:09 -04:00
if (k.length >= 4 && k.length <= 8) return k;
}
}
2020-04-13 17:42:40 -04:00
// 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;
// handle renaming
for (let k in obj) {
if (obj.hasOwnProperty(k)) {
let nam = renamed[k] || k;
if (nam !== k) {
// handle field renames
obj[nam] = obj[k];
delete obj[k];
}
}
}
// fill missing
2020-04-13 17:42:40 -04:00
for (let k in def) {
if (def.hasOwnProperty(k)) {
let okv = obj[k];
if ((okv === undefined || okv === null)) {
// handle fill
2020-04-13 17:42:40 -04:00
// console.log({fill: k});
obj[k] = def[k];
}
2020-04-09 14:52:43 -04:00
}
}
// remove invalid
2020-04-13 17:42:40 -04:00
for (let k in obj) {
if (!def.hasOwnProperty(k)) {
2020-04-09 14:52:43 -04:00
// console.log({cull: k});
2020-04-13 17:42:40 -04:00
delete obj[k];
2020-04-09 14:52:43 -04:00
}
}
}
2020-04-13 17:42:40 -04:00
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;
}
}
2020-04-09 14:52:43 -04:00
function valueOf(val, dv) {
if (typeof(val) === 'string' && Array.isArray(dv)) {
val = [val];
}
2020-04-09 14:52:43 -04:00
return typeof(val) !== 'undefined' ? val : dv;
}
2020-04-13 17:42:40 -04:00
function forValues(o, fn) {
Object.values(o).forEach(v => fn(v));
}
2020-04-09 14:52:43 -04:00
function device_v1_to_v2(device) {
if (device && device.filamentSize) {
device.extruders = [{
extFilament: device.filamentSize,
extNozzle: device.nozzleSize,
extSelect: ["T0"],
extOffsetX: 0,
extOffsetY: 0
}];
delete device.filamentSize;
delete device.nozzleSize;
}
}
// convert default filter (from server) into device structure
function device_from_code(code,mode) {
// presence of internal field indicates already converted
if (code.internal >= 0) return code;
let API = KIRI.api,
cmd = code.cmd || {},
set = code.settings || {},
ext = code.extruders;
2020-04-13 17:42:40 -04:00
// currently causes unecessary fills and culls because
// it's not mode and device type sensitive
2020-04-09 14:52:43 -04:00
let device = {
2020-04-14 22:15:10 -04:00
noclone: valueOf(code.no_clone, false),
mode: mode || code.mode || '',
2020-04-09 14:52:43 -04:00
internal: 0,
bedHeight: valueOf(set.bed_height, 2.5),
2020-04-09 14:52:43 -04:00
bedWidth: valueOf(set.bed_width, 300),
bedDepth: valueOf(set.bed_depth, 175),
bedRound: valueOf(set.bed_circle, false),
maxHeight: valueOf(set.build_height, 150),
originCenter: valueOf(set.origin_center, false),
extrudeAbs: valueOf(set.extrude_abs, false),
spindleMax: valueOf(set.spindle_max, 0),
gcodeFan: valueOf(cmd.fan_power, []),
gcodeTrack: valueOf(cmd.progress, []),
2020-04-09 14:52:43 -04:00
gcodeLayer: valueOf(cmd.layer, []),
gcodePre: valueOf(code.pre, []),
gcodePost: valueOf(code.post, []),
// post processor script of which only one exists
// for XYZ.daVinci.Mini.w triggered in kiri.export
// in the fdm driver to turn gcode into base64
2020-04-09 14:52:43 -04:00
gcodeProc: valueOf(code.proc, ''),
gcodePause: valueOf(code.pause, []),
gcodeDwell: valueOf(code.dwell, []),
gcodeSpindle: valueOf(cmd.spindle, []),
gcodeChange: valueOf(code['tool-change'], []),
gcodeFExt: valueOf(code['file-ext'], 'gcode'),
gcodeSpace: valueOf(code['token-space'], true),
2020-04-09 14:52:43 -04:00
gcodeStrip: valueOf(code['strip-comments'], false),
gcodeLaserOn: valueOf(code['laser-on'], []),
gcodeLaserOff: valueOf(code['laser-off'], []),
extruders: []
};
if (ext) {
// synthesize extruders from new style settings
ext.forEach(rec => {
2020-04-13 17:42:40 -04:00
let e = API.clone(CONF.defaults.fdm.d.extruders[0]);
2020-04-09 14:52:43 -04:00
if (rec.nozzle) e.extNozzle = rec.nozzle;
if (rec.filament) e.extFilament = rec.filament;
if (rec.offset_x) e.extOffsetX = rec.offset_x;
if (rec.offset_y) e.extOffsetY = rec.offset_y;
if (rec.select) e.extSelect = rec.select;
device.extruders.push(e);
});
} else {
// synthesize extruders from old style settings
2020-04-13 17:42:40 -04:00
device.extruders = [API.clone(CONF.defaults.fdm.d.extruders[0])];
2020-04-09 14:52:43 -04:00
device.extruders[0].extNozzle = valueOf(set.nozzle_size, 0.4);
device.extruders[0].extFilament = valueOf(set.filament_diameter, 1.75);
}
return device;
}
// ensure settings structure is up-to-date
function normalize(settings) {
let API = KIRI.api,
2020-04-13 17:42:40 -04:00
defaults = CONF.defaults,
template = CONF.template,
mode = settings.mode.toLowerCase(),
default_dev = defaults[mode].d,
default_pro = defaults[mode].p;
2020-04-09 14:52:43 -04:00
// v1 to v2 changed FDM extruder / nozzle / filament structure
if (settings.ver != CVER) {
2020-04-09 14:52:43 -04:00
// backup settings before upgrade
API.sdb.setItem(`ws-settings-${Date.now()}`, JSON.stringify(settings));
device_v1_to_v2(settings.device);
device_v1_to_v2(settings.cdev.FDM);
objectMap(settings.devices, dev => {
2020-04-12 14:14:57 -04:00
return dev ? device_from_code(dev) : dev;
});
settings.ver = CVER;
2020-04-09 14:52:43 -04:00
}
2020-04-13 17:42:40 -04:00
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);
2020-04-09 14:52:43 -04:00
return settings;
}
// auto field renaming on import
const renamed = {
roughingTool: "camRoughTool",
roughingSpindle: "camRoughSpindle",
roughingDown: "camRoughDown",
roughingOver: "camRoughOver",
roughingSpeed: "camRoughSpeed",
roughingPlunge: "camRoughPlunge",
roughingStock: "camRoughStock",
roughingPocket: "camRoughVoid",
roughingOn: "camRoughOn",
finishingTool: "camOutlineTool",
finishingSpindle: "camOutlineSpindle",
finishingDown: "camOutlineDown",
finishingOver: "camContourOver",
finishingSpeed: "camOutlineSpeed",
finishingPlunge: "camOutlinePlunge",
finishingOn: "camOutlineOn",
finishingXOn: "camContourXOn",
finishingYOn: "camContourYOn",
drillTool: "camDrillTool",
drillSpindle: "camDrillSpindle",
drillDownSpeed: "camDrillDownSpeed",
drillDown: "camDrillDown",
drillDwell: "camDrillDwell",
drillLift: "camDrillLift",
drillingOn: "camDrillingOn",
camPocketOnlyRough: "camRoughPocket",
camPocketOnlyFinish: "camOutlinePocket",
outputClockwise: "camConventional"
};
2020-04-09 14:52:43 -04:00
let CONF = KIRI.conf = {
// --------------- helper functions
normalize: normalize,
device_from_code: device_from_code,
2020-03-09 11:02:09 -04:00
// ---------------
MODES: {
FDM: 1, // fused deposition modeling (also FFF)
2020-04-13 17:42:40 -04:00
LASER: 2, // laser cutters
CAM: 3, // 3 axis milling/machining
SLA: 4 // cured resin printers
2020-03-09 11:02:09 -04:00
},
VIEWS: {
ARRANGE: 1,
SLICE: 2,
PREVIEW: 3
},
2020-04-13 17:42:40 -04:00
// --------------- device and process defaults
defaults: {
2020-03-09 11:02:09 -04:00
fdm:{
2020-04-13 17:42:40 -04:00
// device defaults FDM:Device
2020-03-09 11:02:09 -04:00
d:{
new: true,
2020-04-13 17:42:40 -04:00
mode: "",
internal: 0,
bedWidth: 300,
bedDepth: 175,
bedHeight: 2.5,
bedRound: false,
originCenter: false,
maxHeight: 150,
gcodePre: [],
gcodePost: [],
gcodePause: [],
gcodeProc: "",
gcodeFan: [],
gcodeTrack: [],
2020-04-13 17:42:40 -04:00
gcodeLayer: [],
gcodeFExt: "",
extruders:[{
extFilament: 1.75,
extNozzle: 0.4,
extSelect: ["T0"],
extOffsetX: 0,
extOffsetY: 0
}]
2020-03-09 11:02:09 -04:00
},
2020-04-13 17:42:40 -04:00
// process defaults FDM:Process
2020-03-09 11:02:09 -04:00
p:{
2020-04-13 17:42:40 -04:00
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,
2020-03-09 11:02:09 -04:00
sliceSupportGap: 1,
2020-04-13 17:42:40 -04:00
sliceSupportSize: 10,
2020-03-09 11:02:09 -04:00
sliceSupportArea: 1,
2020-04-13 17:42:40 -04:00
sliceSupportExtra: 0,
sliceSupportSpan: 6,
sliceSupportNozzle: 0,
2020-03-09 11:02:09 -04:00
sliceSolidMinArea: 1,
2020-04-13 17:42:40 -04:00
sliceSolidLayers: 3,
sliceBottomLayers: 3,
sliceTopLayers: 3,
firstSliceHeight: 0.25,
firstLayerRate: 30,
2020-04-15 21:58:04 -04:00
firstLayerFillRate: 35,
2020-04-13 17:42:40 -04:00
firstLayerPrintMult: 1.0,
firstLayerNozzleTemp: 0,
firstLayerBedTemp: 0,
2020-04-13 17:42:40 -04:00
outputRaft: false,
outputRaftSpacing: 0.2,
outputTemp: 200,
outputFanMax: 255,
2020-04-15 21:58:04 -04:00
outputBedTemp: 60,
outputFeedrate: 50,
outputFinishrate: 50,
outputSeekrate: 80,
outputShellMult: 1.25,
outputFillMult: 1.25,
outputSparseMult: 1.25,
2020-03-09 11:02:09 -04:00
outputFanLayer: 1,
2020-04-15 21:58:04 -04:00
outputRetractDist: 1.5,
2020-04-13 17:42:40 -04:00
outputRetractSpeed: 40,
2020-04-15 21:58:04 -04:00
outputRetractDwell: 20,
2020-04-13 17:42:40 -04:00
outputBrimCount: 2,
outputBrimOffset: 2,
2020-04-16 13:43:23 -04:00
outputShortPoly: 100.0,
outputMinSpeed: 10.0,
2020-04-13 17:42:40 -04:00
outputCoastDist: 0,
outputWipeDistance: 0,
outputLayerRetract: false,
outputOriginCenter: true,
outputInvertX: false,
outputInvertY: false,
2020-04-15 21:58:04 -04:00
detectThinWalls: false,
sliceMinHeight: 0,
zHopDistance: 0.2,
antiBacklash: 1,
2020-05-06 14:04:43 -04:00
gcodePause: "",
sliceRotation: 0
2020-04-13 17:42:40 -04:00
}
},
sla:{
// device defaults SLA:Device
d:{
new: true,
2020-04-16 18:27:28 -04:00
deviceName: "",
2020-04-14 22:15:10 -04:00
noclone: false,
2020-04-13 17:42:40 -04:00
mode: "",
internal: 0,
bedWidth: 150,
bedDepth: 150,
bedHeight: 1.5,
2020-04-14 15:57:34 -04:00
maxHeight: 150
2020-04-13 17:42:40 -04:00
},
// process defaults SLA:Process
p:{
processName: "default",
slaSlice: 0.05,
2020-04-17 11:52:44 -04:00
slaShell: 0.00,
2020-04-14 15:57:34 -04:00
slaOpenTop: false,
slaOpenBase: false,
2020-04-18 22:12:50 -04:00
slaAntiAlias: 1,
2020-04-16 12:01:47 -04:00
slaLayerOff: 0.1,
2020-04-17 11:52:44 -04:00
slaLayerOn: 7,
2020-04-16 12:01:47 -04:00
slaPeelDist: 6,
2020-04-17 11:52:44 -04:00
slaPeelLiftRate: 1.5,
2020-04-16 12:01:47 -04:00
slaPeelDropRate: 3,
2020-04-17 11:52:44 -04:00
slaBaseLayers: 5,
slaBaseOff: 0.1,
slaBaseOn: 30,
2020-04-16 12:01:47 -04:00
slaBasePeelDist: 6,
2020-04-17 11:52:44 -04:00
slaBasePeelLiftRate: 1.5,
2020-04-17 14:20:49 -04:00
slaFillDensity: 0,
slaFillLine: 0.5,
2020-04-23 17:20:28 -04:00
slaFirstOffset: 0,
slaSupportLayers: 10,
slaSupportDensity: 0.5,
2020-04-25 19:11:21 -04:00
slaSupportSize: 0.6,
slaSupportPoints: 4,
slaSupportGap: 10,
slaSupportEnable: false
2020-03-09 11:02:09 -04:00
}
},
cam:{
2020-04-13 17:42:40 -04:00
// device defaults CAM:Device
2020-03-09 11:02:09 -04:00
d:{
new: true,
2020-04-13 17:42:40 -04:00
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}"]
2020-03-09 11:02:09 -04:00
},
2020-04-13 17:42:40 -04:00
// process defaults CAM:Process
2020-03-09 11:02:09 -04:00
p:{
2020-04-13 17:42:40 -04:00
processName: "default",
camRoughTool: 1000, // roughingTool
camRoughSpindle: 1000, // camRoughSpindle
camRoughDown: 2, // roughingDown
camRoughOver: 0.5, // roughingOver
camRoughSpeed: 1000, // roughingSpeed
camRoughPlunge: 250, // roughingPlunge
camRoughStock: 0, // roughingStock
camRoughVoid: false, // roughingPocket
camRoughOn: true, // roughingOn
camOutlineTool: 1000, // finishingTool
camOutlineSpindle: 1000,// finishingSpindle
camOutlineDown: 3, // finishingDown
camOutlineSpeed: 800, // finishingSpeed
camOutlinePlunge: 250, // finishingPlunge
camOutlineOn: true, // finishingOn
camContourTool: 1000,
camContourSpindle: 1000,// (new)
camContourOver: 0.5, // (new)
camContourSpeed: 1000, // (new)
camContourAngle: 85, // finishingAngle
camContourCurves: false,// finishCurvesOnly
camContourXOn: true, // finishingXOn
camContourYOn: true, // finishingYOn
camTraceTool: 1000,
camTraceSpeed: 250,
camTraceOn: false,
camDrillTool: 1000, // drillTool
camDrillSpindle: 1000, // drillSpindle
camDrillDownSpeed: 250, // drillDownSpeed
camDrillDown: 5, // drillDown
camDrillDwell: 250, // drillDwell
camDrillLift: 2, // drillLift
camDrillingOn: false, // drillingOn
2020-07-16 22:03:30 -04:00
camDrillReg: "none",
2020-04-13 17:42:40 -04:00
camTabsAngle: 0,
camTabsCount: 4,
camTabsWidth: 5,
camTabsHeight: 5,
camTabsOn: false,
camRoughPocket: false, // camPocketOnlyRough
camOutlinePocket: false, // camPocketOnlyFinish
2020-04-23 17:20:28 -04:00
camDepthFirst: true,
2020-07-30 19:58:03 -04:00
camWideCutout: false,
2020-04-13 17:42:40 -04:00
camEaseDown: false,
camOriginTop: true,
camZTopOffset: 0,
camZBottom: 0,
2020-03-09 11:02:09 -04:00
camZClearance: 1,
camZThru: 0,
camFastFeed: 6000,
camFastFeedZ: 300,
camTolerance: 0.15,
2020-04-13 17:42:40 -04:00
camStockX: 0,
camStockY: 0,
camStockZ: 0,
camStockOffset: true,
camConventional: false, // outputClockwise
outputOriginCenter: false,
2020-04-13 17:42:40 -04:00
outputInvertX: false,
outputInvertY: false
2020-03-09 11:02:09 -04:00
}
},
laser: {
2020-04-13 17:42:40 -04:00
// device defaults Laser:Device
2020-03-09 11:02:09 -04:00
d:{
new: true,
2020-04-13 17:42:40 -04:00
mode: "",
internal: 0,
bedWidth: 300,
bedDepth: 175,
bedHeight: 2.5,
gcodePre: [],
gcodePost: [],
gcodeFExt: "",
gcodeSpace: true,
gcodeLaserOn: ["M106 S{power}"],
gcodeLaserOff: ["M107"]
2020-03-09 11:02:09 -04:00
},
2020-04-13 17:42:40 -04:00
// process defaults Laser:Process
2020-03-09 11:02:09 -04:00
p:{
2020-04-13 17:42:40 -04:00
processName: "default",
laserOffset: 0.25,
2020-03-09 11:02:09 -04:00
laserSliceHeight: 1,
laserSliceHeightMin: 0,
2020-04-13 17:42:40 -04:00
laserSliceSingle: false,
laserKnife: false,
2020-03-09 11:02:09 -04:00
outputTileSpacing: 1,
2020-04-13 17:42:40 -04:00
outputLaserPower: 100,
outputLaserSpeed: 1000,
outputLaserGroup: true,
outputLaserZColor: false,
2020-10-14 17:18:14 -04:00
outputLaserLayer: false,
2020-04-13 17:42:40 -04:00
outputLaserMerged: false,
outputOriginCenter: true,
outputInvertX: false,
outputInvertY: false,
outputKnifeDepth: 1,
outputKnifePasses: 1,
outputTipOffset: 2
2020-03-09 11:02:09 -04:00
}
}
},
2020-04-13 17:42:40 -04:00
// --------------- settings template
2020-03-09 11:02:09 -04:00
template: {
// CAM only
bounds: {},
origin: {},
stock: {},
tools:[
{
id: 1000,
number: 1,
type: "endmill",
name: "end 1/4",
metric: false,
shaft_diam: 0.25,
2020-03-10 14:23:42 -04:00
shaft_len: 1,
flute_diam: 0.25,
flute_len: 2,
// taper_angle: 70,
taper_tip: 0,
2020-03-09 11:02:09 -04:00
},
{
id: 1001,
number: 2,
type: "endmill",
name: "end 1/8",
metric: false,
shaft_diam: 0.125,
2020-03-10 14:23:42 -04:00
shaft_len: 1,
flute_diam: 0.125,
flute_len: 1.5,
// taper_angle: 70,
taper_tip: 0,
2020-03-09 11:02:09 -04:00
},
{
id: 1002,
number: 3,
type: "endmill",
name: "end 1/16",
metric: false,
shaft_diam: 0.0625,
2020-03-10 14:23:42 -04:00
shaft_len: 1,
flute_diam: 0.0625,
flute_len: 1.5,
// taper_angle: 70,
taper_tip: 0,
2020-03-09 11:02:09 -04:00
}
],
2020-04-13 17:42:40 -04:00
// currently selected device
device:{},
// currently selected process
process:{},
// current process name by mode
2020-03-09 11:02:09 -04:00
cproc:{
FDM: "default",
2020-04-13 17:42:40 -04:00
SLA: "default",
2020-03-09 11:02:09 -04:00
CAM: "default",
LASER: "default"
},
2020-04-13 17:42:40 -04:00
// stored processes by mode
2020-03-09 11:02:09 -04:00
sproc:{
FDM: {},
2020-04-13 17:42:40 -04:00
SLA: {},
2020-03-09 11:02:09 -04:00
CAM: {},
LASER: {}
},
2020-04-13 17:42:40 -04:00
// current device name by mode
2020-03-09 11:02:09 -04:00
filter:{
FDM: "Any.Generic.Marlin",
2020-04-15 09:51:21 -04:00
SLA: "Anycubic.Photon",
2020-04-09 14:52:43 -04:00
CAM: "Any.Generic.Grbl",
LASER: "Any.Generic.Laser"
2020-03-09 11:02:09 -04:00
},
2020-04-13 17:42:40 -04:00
// stored device by mode
cdev: {
FDM: null,
SLA: null,
CAM: null,
LASER: null
2020-03-09 11:02:09 -04:00
},
2020-04-13 17:42:40 -04:00
// custom devices by name (all modes)
devices:{},
// favorited devices (all modes)
favorites:{},
2020-03-09 11:02:09 -04:00
// map of device to last process setting (name)
2020-04-13 17:42:40 -04:00
devproc: {},
2020-03-09 11:02:09 -04:00
layers:{
layerOutline: true,
layerTrace: true,
layerFacing: true,
layerRough: true,
layerFinish: true,
layerFinishX: true,
layerFinishY: true,
layerDelta: false,
layerSolid: false,
layerSparse: true,
layerFill: true,
layerSupport: true,
layerPrint: false,
layerMoves: false
2020-03-09 11:02:09 -04:00
},
controller:{
view: null,
2020-04-08 09:38:32 -04:00
dark: false,
2020-07-06 12:53:18 -04:00
expert: true,
hoverPop: false,
2020-03-09 11:02:09 -04:00
zoomSpeed: 1.0,
thinRender: false,
2020-03-09 11:02:09 -04:00
reverseZoom: true,
showOrigin: false,
showRulers: false,
2020-03-09 11:02:09 -04:00
freeLayout: true,
autoLayout: true,
alignTop: true,
2020-06-10 20:48:59 -04:00
units: "mm",
exportOcto: false,
2020-06-10 20:48:59 -04:00
exportGhost: false,
exportLocal: true
2020-03-09 11:02:09 -04:00
},
2020-04-13 17:42:40 -04:00
// for passing temporary slice hints (topo currently)
synth: {},
// widget extra info for slicing (extruder mapping)
widget: {},
2020-03-09 11:02:09 -04:00
mode: 'FDM',
id: genID(),
2020-04-09 14:52:43 -04:00
ver: CVER
2020-03-09 11:02:09 -04:00
}
};
2020-04-13 17:42:40 -04:00
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);
2020-03-09 11:02:09 -04:00
})();