restore basic gcode export for FDM
This commit is contained in:
parent
689a2ed3a3
commit
19d23fdf44
5 changed files with 105 additions and 57 deletions
|
|
@ -684,6 +684,9 @@ let gs_kiri_conf = exports;
|
|||
alignTop: true,
|
||||
units: "mm"
|
||||
},
|
||||
// widget extra info for slicing (like extruder mapping)
|
||||
widget: {
|
||||
},
|
||||
mode: 'FDM',
|
||||
id: genID(),
|
||||
ver: CVER
|
||||
|
|
|
|||
|
|
@ -50,26 +50,35 @@ var gs_kiri_fdm = exports;
|
|||
solidLayers = spro.sliceSolidLayers,
|
||||
vaseMode = spro.sliceFillType === 'vase',
|
||||
doSolidLayers = solidLayers && !vaseMode,
|
||||
firstOffset = sdev.nozzleSize / 2,
|
||||
shellOffset = sdev.nozzleSize,
|
||||
fillOffset = sdev.nozzleSize * settings.synth.fillOffsetMult,
|
||||
fillSpacing = sdev.nozzleSize,
|
||||
metadata = settings.widget[widget.id] || {},
|
||||
extruder = metadata.extruder || 0,
|
||||
sliceHeight = spro.sliceHeight,
|
||||
nozzleSize = sdev.extruders[extruder].extNozzle,
|
||||
firstOffset = nozzleSize / 2,
|
||||
shellOffset = nozzleSize,
|
||||
fillSpacing = nozzleSize,
|
||||
fillOffset = nozzleSize * settings.synth.fillOffsetMult,
|
||||
sliceFillAngle = spro.sliceFillAngle,
|
||||
view = widget.mesh && widget.mesh.newGroup ? widget.mesh.newGroup() : null;
|
||||
|
||||
if (spro.sliceHeight < 0.01) {
|
||||
// console.log({slice:widget.id, metadata, extruder, nozzleSize});
|
||||
|
||||
if (!(sliceHeight > 0 && sliceHeight < 100)) {
|
||||
return ondone("invalid slice height");
|
||||
}
|
||||
if (!(nozzleSize >= 0.01 && nozzleSize < 100)) {
|
||||
return ondone("invalid nozzle size");
|
||||
}
|
||||
|
||||
if (spro.firstSliceHeight < spro.sliceHeight) {
|
||||
if (spro.firstSliceHeight < sliceHeight) {
|
||||
DBUG.log("invalid first layer height < slice height");
|
||||
DBUG.log("reverting to slice height");
|
||||
spro.firstSliceHeight = spro.sliceHeight;
|
||||
spro.firstSliceHeight = sliceHeight;
|
||||
}
|
||||
|
||||
SLICER.sliceWidget(widget, {
|
||||
height: spro.sliceHeight,
|
||||
minHeight: spro.sliceHeight > spro.sliceMinHeight ? spro.sliceMinHeight : 0,
|
||||
height: sliceHeight,
|
||||
minHeight: sliceHeight > spro.sliceMinHeight ? spro.sliceMinHeight : 0,
|
||||
firstHeight: spro.firstSliceHeight,
|
||||
view: view
|
||||
}, onSliceDone, onSliceUpdate);
|
||||
|
|
@ -101,6 +110,7 @@ var gs_kiri_fdm = exports;
|
|||
|
||||
// reset (if necessary) for solids and support projections
|
||||
slices.forEach(function(slice) {
|
||||
slice.extruder = extruder;
|
||||
slice.invalidateFill();
|
||||
slice.invalidateSolids();
|
||||
slice.invalidateSupports();
|
||||
|
|
@ -146,7 +156,7 @@ var gs_kiri_fdm = exports;
|
|||
slice.doSupport(spro.sliceSupportOffset, spro.sliceSupportSpan, spro.sliceSupportExtra, supportMinArea, spro.sliceSupportSize, spro.sliceSupportOffset, spro.sliceSupportGap);
|
||||
}, "support");
|
||||
forSlices(0.7, 0.8, function(slice) {
|
||||
slice.doSupportFill(sdev.nozzleSize, spro.sliceSupportDensity, supportMinArea);
|
||||
slice.doSupportFill(nozzleSize, spro.sliceSupportDensity, supportMinArea);
|
||||
}, "support");
|
||||
}
|
||||
|
||||
|
|
@ -154,11 +164,11 @@ var gs_kiri_fdm = exports;
|
|||
if (!vaseMode && spro.sliceFillSparse > 0.0) {
|
||||
forSlices(0.8, 1.0, function(slice) {
|
||||
slice.doSparseLayerFill({
|
||||
lineWidth: sdev.nozzleSize,
|
||||
lineWidth: nozzleSize,
|
||||
spacing: fillOffset,
|
||||
density: spro.sliceFillSparse,
|
||||
bounds: widget.getBoundingBox(),
|
||||
height: spro.sliceHeight,
|
||||
height: sliceHeight,
|
||||
type: spro.sliceFillType
|
||||
});
|
||||
}, "infill");
|
||||
|
|
@ -174,7 +184,7 @@ var gs_kiri_fdm = exports;
|
|||
let py = [];
|
||||
// compute x polishing slices
|
||||
SLICER.sliceWidget(widget, {
|
||||
height: sdev.nozzleSize * polish_step,
|
||||
height: nozzleSize * polish_step,
|
||||
swapX: true,
|
||||
swapY: false,
|
||||
simple: true
|
||||
|
|
@ -188,7 +198,7 @@ var gs_kiri_fdm = exports;
|
|||
});
|
||||
// compute y polishing slices
|
||||
SLICER.sliceWidget(widget, {
|
||||
height: sdev.nozzleSize * polish_step,
|
||||
height: nozzleSize * polish_step,
|
||||
swapX: false,
|
||||
swapY: true,
|
||||
simple: true
|
||||
|
|
@ -338,11 +348,11 @@ var gs_kiri_fdm = exports;
|
|||
slice.tops[0].polish = {
|
||||
x: pout[0]
|
||||
.map(a => BASE.newPolygon(a).setOpen())
|
||||
// .filter(p => p.perimeter() > sdev.nozzleSize)
|
||||
// .filter(p => p.perimeter() > nozzleSize)
|
||||
,
|
||||
y: pout[1]
|
||||
.map(a => BASE.newPolygon(a).setOpen())
|
||||
// .filter(p => p.perimeter() > sdev.nozzleSize)
|
||||
// .filter(p => p.perimeter() > nozzleSize)
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
@ -365,7 +375,7 @@ var gs_kiri_fdm = exports;
|
|||
var widgets = print.widgets,
|
||||
settings = print.settings,
|
||||
device = settings.device,
|
||||
nozzle = device.nozzleSize,
|
||||
nozzle = device.extruders[0].extNozzle,
|
||||
process = settings.process,
|
||||
mode = settings.mode,
|
||||
output = print.output,
|
||||
|
|
@ -374,7 +384,6 @@ var gs_kiri_fdm = exports;
|
|||
maxLayers = 0,
|
||||
layer = 0,
|
||||
zoff = 0,
|
||||
mesh,
|
||||
meshIndex,
|
||||
lastIndex,
|
||||
closest,
|
||||
|
|
@ -382,7 +391,6 @@ var gs_kiri_fdm = exports;
|
|||
minidx,
|
||||
find,
|
||||
found,
|
||||
mslices,
|
||||
layerout = [],
|
||||
slices = [],
|
||||
sliceEntry;
|
||||
|
|
@ -510,9 +518,9 @@ var gs_kiri_fdm = exports;
|
|||
for (;;) {
|
||||
// create list of mesh slice arrays with their platform offsets
|
||||
for (meshIndex = 0; meshIndex < widgets.length; meshIndex++) {
|
||||
mesh = widgets[meshIndex].mesh;
|
||||
let mesh = widgets[meshIndex].mesh;
|
||||
if (!mesh.widget) continue;
|
||||
mslices = mesh.widget.slices;
|
||||
let mslices = mesh.widget.slices;
|
||||
if (mslices && mslices[layer]) {
|
||||
slices.push({slice:mslices[layer], offset:mesh.position});
|
||||
}
|
||||
|
|
@ -582,10 +590,14 @@ var gs_kiri_fdm = exports;
|
|||
var layers = print.output,
|
||||
settings = print.settings,
|
||||
device = settings.device,
|
||||
extruders = device.extruders,
|
||||
process = settings.process,
|
||||
fan_power = device.gcodeFan,
|
||||
trackLayers = device.gcodeLayer,
|
||||
trackProgress = device.gcodeTrack,
|
||||
extruder = 0,
|
||||
nozzleSize = extruders[extruder].extNozzle,
|
||||
filamentSize = extruders[extruder].extFilament,
|
||||
time = 0,
|
||||
layer = 0,
|
||||
pause = [],
|
||||
|
|
@ -635,6 +647,8 @@ var gs_kiri_fdm = exports;
|
|||
lines = 0,
|
||||
bytes = 0;
|
||||
|
||||
// console.log({print: print.widgets, meta:settings.widget, extruders, nozzleSize, filamentSize});
|
||||
|
||||
(process.gcodePauseLayers || "").split(",").forEach(function(lv) {
|
||||
var v = parseInt(lv);
|
||||
if (v >= 0) pause.push(v);
|
||||
|
|
@ -738,9 +752,10 @@ var gs_kiri_fdm = exports;
|
|||
}
|
||||
|
||||
// calc total distance traveled by head as proxy for progress
|
||||
var allout = [],
|
||||
totaldistance = 0;
|
||||
layers.forEach(function(outs) { allout.appendAll(outs) });
|
||||
var allout = [], totaldistance = 0;
|
||||
layers.forEach(function(outs) {
|
||||
allout.appendAll(outs);
|
||||
});
|
||||
allout.forEachPair(function (o1, o2) {
|
||||
totaldistance += o1.point.distTo2D(o2.point);
|
||||
}, 1);
|
||||
|
|
@ -751,8 +766,8 @@ var gs_kiri_fdm = exports;
|
|||
while (layer < layers.length) {
|
||||
path = layers[layer];
|
||||
emitPerMM = print.extrudePerMM(
|
||||
device.nozzleSize,
|
||||
device.filamentSize,
|
||||
nozzleSize,
|
||||
filamentSize,
|
||||
path.layer === 0 ?
|
||||
(process.firstSliceHeight || process.sliceHeight) : path.height);
|
||||
|
||||
|
|
@ -812,6 +827,18 @@ var gs_kiri_fdm = exports;
|
|||
out = path[pidx];
|
||||
speedMMM = (out.speed || process.outputFeedrate) * 60;
|
||||
|
||||
// look for extruder change and recalc emit factor
|
||||
if (out.tool !== undefined && out.tool !== extruder) {
|
||||
extruder = out.tool;
|
||||
nozzleSize = extruders[extruder].extNozzle;
|
||||
filamentSize = extruders[extruder].extFilament;
|
||||
emitPerMM = print.extrudePerMM(
|
||||
nozzleSize,
|
||||
filamentSize,
|
||||
path.layer === 0 ?
|
||||
(process.firstSliceHeight || process.sliceHeight) : path.height);
|
||||
}
|
||||
|
||||
// if no point in output, it's a dwell command
|
||||
if (!out.point) {
|
||||
dwell(out.speed);
|
||||
|
|
|
|||
|
|
@ -358,7 +358,7 @@ let gs_kiri_export = exports;
|
|||
let density = $('print-density');
|
||||
$('print-weight').value = (
|
||||
(Math.PI * UTIL.sqr(
|
||||
currentPrint.settings.device.filamentSize / 2
|
||||
currentPrint.settings.device.extruders[0].extFilament / 2
|
||||
)) *
|
||||
currentPrint.distance *
|
||||
(parseFloat(density.value) || 1.25) /
|
||||
|
|
|
|||
|
|
@ -111,6 +111,7 @@ let gs_kiri_print = exports;
|
|||
seq = [],
|
||||
abs = true,
|
||||
move = false,
|
||||
tool = 0,
|
||||
E0G0 = false,
|
||||
G0 = function() {
|
||||
move = true;
|
||||
|
|
@ -166,7 +167,8 @@ let gs_kiri_print = exports;
|
|||
seq,
|
||||
{x:pos.X + off.X, y:pos.Y + off.Y, z:pos.Z + off.Z},
|
||||
!move,
|
||||
pos.F
|
||||
pos.F,
|
||||
tool
|
||||
);
|
||||
break;
|
||||
case 'M6':
|
||||
|
|
@ -462,17 +464,17 @@ let gs_kiri_print = exports;
|
|||
array.push(new Output(point, emit, speed, tool));
|
||||
}
|
||||
|
||||
function segmentOutput(output, p1, p2, s1, s2, steps, mult) {
|
||||
let sd = (s2 - s1) / (steps + 1);
|
||||
let dd = p1.distTo2D(p2) / steps;
|
||||
let dist = dd;
|
||||
let spd = s1;
|
||||
while (steps-- > 0) {
|
||||
spd += sd;
|
||||
p1 = p1.offsetPointTo(p2, dd);
|
||||
addOutput(output, p1, mult, spd);
|
||||
}
|
||||
}
|
||||
// function segmentedOutput(output, p1, p2, s1, s2, steps, mult) {
|
||||
// let sd = (s2 - s1) / (steps + 1);
|
||||
// let dd = p1.distTo2D(p2) / steps;
|
||||
// let dist = dd;
|
||||
// let spd = s1;
|
||||
// while (steps-- > 0) {
|
||||
// spd += sd;
|
||||
// p1 = p1.offsetPointTo(p2, dd);
|
||||
// addOutput(output, p1, mult, spd);
|
||||
// }
|
||||
// }
|
||||
|
||||
/**
|
||||
* FDM & Laser. add points in polygon to an output array (print path)
|
||||
|
|
@ -499,7 +501,8 @@ let gs_kiri_print = exports;
|
|||
first = true,
|
||||
last = startPoint,
|
||||
wipeDist = options.wipe || 0,
|
||||
coastDist = options.coast || 0;
|
||||
coastDist = options.coast || 0,
|
||||
tool = options.tool;
|
||||
|
||||
// if short, use calculated print speed based on sliding scale
|
||||
if (perimeter < process.outputShortPoly) {
|
||||
|
|
@ -512,7 +515,7 @@ let gs_kiri_print = exports;
|
|||
options.onfirst(point);
|
||||
}
|
||||
// move from startPoint to point
|
||||
addOutput(output, point, 0, moveSpeed);
|
||||
addOutput(output, point, 0, moveSpeed, tool);
|
||||
first = false;
|
||||
} else {
|
||||
let seglen = last.distTo2D(point);
|
||||
|
|
@ -520,11 +523,11 @@ let gs_kiri_print = exports;
|
|||
let delta = perimeter - coastDist;
|
||||
let offset = seglen - delta;
|
||||
let offPoint = last.offsetPointFrom(point, offset)
|
||||
addOutput(output, offPoint, shellMult, printSpeed);
|
||||
addOutput(output, offPoint, shellMult, printSpeed, tool);
|
||||
shellMult = 0;
|
||||
}
|
||||
perimeter -= seglen;
|
||||
addOutput(output, point, shellMult, printSpeed);
|
||||
addOutput(output, point, shellMult, printSpeed, tool);
|
||||
}
|
||||
last = point;
|
||||
}, true, closest.index);
|
||||
|
|
@ -543,16 +546,19 @@ let gs_kiri_print = exports;
|
|||
* @return {Point} last output point
|
||||
*/
|
||||
PRO.slicePrintPath = function(slice, startPoint, offset, output, options) {
|
||||
// console.log({slicePrintPath: slice.index, ext:slice.extruder});
|
||||
|
||||
let i,
|
||||
opt = options || {},
|
||||
preout = [],
|
||||
scope = this,
|
||||
settings = this.settings,
|
||||
process = settings.process,
|
||||
nozzle = settings.device.nozzleSize,
|
||||
extruder = slice.extruder || 0,
|
||||
nozzleSize = settings.device.extruders[extruder].extNozzle,
|
||||
firstLayer = opt.first || false,
|
||||
minSeek = nozzle * (opt.minSeek || 1.5),
|
||||
thinWall = nozzle * (opt.thinWall || 1.75),
|
||||
minSeek = nozzleSize * (opt.minSeek || 1.5),
|
||||
thinWall = nozzleSize * (opt.thinWall || 1.75),
|
||||
retractDist = opt.retractOver || 2,
|
||||
fillMult = opt.mult || process.outputFillMult,
|
||||
shellMult = opt.mult || process.outputShellMult || (process.laserSliceHeight >= 0 ? 1 : 0),
|
||||
|
|
@ -603,6 +609,7 @@ let gs_kiri_print = exports;
|
|||
} else {
|
||||
let finishShell = poly.depth === 0 && !firstLayer;
|
||||
startPoint = scope.polyPrintPath(poly, startPoint, preout, {
|
||||
tool: extruder,
|
||||
rate: finishShell ? finishSpeed : printSpeed,
|
||||
accel: finishShell,
|
||||
wipe: process.outputWipeDistance || 0,
|
||||
|
|
@ -636,7 +643,7 @@ let gs_kiri_print = exports;
|
|||
if (i === 0 && lp && lp.distTo2D(p) > retractDist && intersectsTop(lp,p)) {
|
||||
retract();
|
||||
}
|
||||
addOutput(preout, p, i === 0 ? 0 : extrude, speed || printSpeed);
|
||||
addOutput(preout, p, i === 0 ? 0 : extrude, speed || printSpeed, extruder);
|
||||
lp = p;
|
||||
});
|
||||
return lp;
|
||||
|
|
@ -716,7 +723,7 @@ let gs_kiri_print = exports;
|
|||
// to avoid shaking the printer to death.
|
||||
if (dist <= thinWall && len <= thinWall) {
|
||||
p2 = p1.midPointTo(p2);
|
||||
addOutput(preout, p2, fill * (dist / thinWall), fillSpeed);
|
||||
addOutput(preout, p2, fill * (dist / thinWall), fillSpeed, extruder);
|
||||
} else {
|
||||
// retract if dist trigger or crosses a slice top polygon
|
||||
if (dist > retractDist && (zhop || intersectsTop(startPoint, p1))) {
|
||||
|
|
@ -725,17 +732,17 @@ let gs_kiri_print = exports;
|
|||
|
||||
// anti-backlash on longer move
|
||||
if (antiBacklash && dist > retractDist) {
|
||||
addOutput(preout, p1.add({x:antiBacklash,y:-antiBacklash,z:0}), 0, moveSpeed);
|
||||
addOutput(preout, p1.add({x:antiBacklash,y:-antiBacklash,z:0}), 0, moveSpeed, extruder);
|
||||
}
|
||||
|
||||
// bridge ends of fill when they're close together
|
||||
if (dist < thinWall) {
|
||||
addOutput(preout, p1, fill, fillSpeed);
|
||||
addOutput(preout, p1, fill, fillSpeed, extruder);
|
||||
} else {
|
||||
addOutput(preout, p1, 0, moveSpeed);
|
||||
addOutput(preout, p1, 0, moveSpeed, extruder);
|
||||
}
|
||||
|
||||
addOutput(preout, p2, fill, fillSpeed);
|
||||
addOutput(preout, p2, fill, fillSpeed, extruder);
|
||||
}
|
||||
|
||||
startPoint = p2;
|
||||
|
|
@ -845,7 +852,7 @@ let gs_kiri_print = exports;
|
|||
}
|
||||
|
||||
// add offset points to total print
|
||||
addPrintPoints(preout, output, origin);
|
||||
addPrintPoints(preout, output, origin, extruder);
|
||||
|
||||
return startPoint.add(offset);
|
||||
};
|
||||
|
|
@ -856,9 +863,9 @@ let gs_kiri_print = exports;
|
|||
* @param {Point[]} output
|
||||
* @param {Point} [startPoint]
|
||||
*/
|
||||
function addPrintPoints(input, output, startPoint) {
|
||||
function addPrintPoints(input, output, startPoint, tool) {
|
||||
if (startPoint && input.length > 0) {
|
||||
addOutput(output, startPoint, 0);
|
||||
addOutput(output, startPoint, 0, undefined, tool);
|
||||
}
|
||||
output.appendAll(input);
|
||||
}
|
||||
|
|
|
|||
15
js/kiri.js
15
js/kiri.js
|
|
@ -847,7 +847,17 @@ self.kiri.copyright = exports.COPYRIGHT;
|
|||
SPACE.update();
|
||||
}
|
||||
|
||||
function scaleSelection(ev) {
|
||||
function scaleSelection() {
|
||||
if (arguments.length === 1) {
|
||||
scaleSelectionUI(...arguments);
|
||||
} else {
|
||||
forSelectedGroups(function (w) {
|
||||
w.scale(...arguments);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function scaleSelectionUI(ev) {
|
||||
let dv = parseFloat(ev.target.value || 1);
|
||||
if (UI.scaleUniform.checked) {
|
||||
UI.scaleX.value = dv;
|
||||
|
|
@ -1052,6 +1062,7 @@ self.kiri.copyright = exports.COPYRIGHT;
|
|||
}
|
||||
|
||||
function platformAdd(widget, shift, nolayout) {
|
||||
settings.widget[widget.id] = {extruder: 0};
|
||||
WIDGETS.push(widget);
|
||||
SPACE.platform.add(widget.mesh);
|
||||
platform.select(widget, shift);
|
||||
|
|
@ -1076,6 +1087,7 @@ self.kiri.copyright = exports.COPYRIGHT;
|
|||
return;
|
||||
}
|
||||
KIRI.work.clear(widget);
|
||||
delete settings.widget[widget.id];
|
||||
WIDGETS.remove(widget);
|
||||
Widget.Groups.remove(widget);
|
||||
SPACE.platform.remove(widget.mesh);
|
||||
|
|
@ -1352,7 +1364,6 @@ self.kiri.copyright = exports.COPYRIGHT;
|
|||
// store camera view
|
||||
let view = SPACE.view.save();
|
||||
if (view.left || view.up) settings.controller.view = view;
|
||||
// CONF.normalize(settings);
|
||||
SDB.setItem('ws-settings', JSON.stringify(settings));
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue