mirror of
https://github.com/Doodle3D/Doodle3D-Slicer.git
synced 2024-11-22 13:37:58 +01:00
basic implementation of comb
This commit is contained in:
parent
4ededa4dfe
commit
65472890eb
114
src/sliceActions/helpers/comb.js
Normal file
114
src/sliceActions/helpers/comb.js
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
export default function comb(outline, start, end) {
|
||||||
|
const [path] = outline.mapToLower();
|
||||||
|
const combPath = [];
|
||||||
|
|
||||||
|
const { closestPoint: closestPointStart, lineIndex: lineIndexStart } = findClosestPointOnPath(path, start);
|
||||||
|
const { closestPoint: closestPointEnd, lineIndex: lineIndexEnd } = findClosestPointOnPath(path, end);
|
||||||
|
|
||||||
|
combPath.push(start, closestPointStart);
|
||||||
|
|
||||||
|
if (lineIndexEnd > lineIndexStart) {
|
||||||
|
if (lineIndexStart + path.length - lineIndexEnd < lineIndexEnd - lineIndexStart) {
|
||||||
|
for (let i = lineIndexStart + path.length; i > lineIndexEnd; i --) {
|
||||||
|
combPath.push(path[i % path.length]);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (let i = lineIndexStart; i < lineIndexEnd; i ++) {
|
||||||
|
combPath.push(path[i + 1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (lineIndexEnd + path.length - lineIndexStart < lineIndexStart - lineIndexEnd) {
|
||||||
|
for (let i = lineIndexStart; i < lineIndexEnd + path.length; i ++) {
|
||||||
|
combPath.push(path[(i + 1) % path.length]);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (let i = lineIndexStart; i > lineIndexEnd; i --) {
|
||||||
|
combPath.push(path[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
combPath.push(closestPointEnd, end);
|
||||||
|
|
||||||
|
return combPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
function findClosestPointOnPath(path, point) {
|
||||||
|
let distance = Infinity;
|
||||||
|
let lineIndex;
|
||||||
|
let closestPoint;
|
||||||
|
|
||||||
|
for (let i = 0; i < path.length; i ++) {
|
||||||
|
const pointA = path[i];
|
||||||
|
const pointB = path[(i + 1) % path.length];
|
||||||
|
|
||||||
|
const tempClosestPoint = findClosestPointOnLine(pointA, pointB, point);
|
||||||
|
const tempDistance = distanceTo(tempClosestPoint, point);
|
||||||
|
|
||||||
|
if (tempDistance < distance) {
|
||||||
|
distance = tempDistance;
|
||||||
|
lineIndex = i;
|
||||||
|
closestPoint = tempClosestPoint;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return { closestPoint, lineIndex };
|
||||||
|
}
|
||||||
|
|
||||||
|
function findClosestPointOnLine(a, b, c) {
|
||||||
|
const b_ = subtract(b, a);
|
||||||
|
const c_ = subtract(c, a);
|
||||||
|
|
||||||
|
const lambda = dot(normalize(b_), c_) / length(b_);
|
||||||
|
|
||||||
|
if (lambda >= 1) {
|
||||||
|
return b;
|
||||||
|
} else if (lambda > 0) {
|
||||||
|
return add(a, scale(b_, lambda));
|
||||||
|
} else {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function subtract(a, b) {
|
||||||
|
return {
|
||||||
|
x: a.x - b.x,
|
||||||
|
y: a.y - b.y
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function add(a, b) {
|
||||||
|
return {
|
||||||
|
x: a.x + b.x,
|
||||||
|
y: a.y + b.y
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function scale(a, factor) {
|
||||||
|
return {
|
||||||
|
x: a.x * factor,
|
||||||
|
y: a.y * factor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function dot(a, b) {
|
||||||
|
return a.x * b.x + a.y * b.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
function normalize(a) {
|
||||||
|
const l = length(a);
|
||||||
|
|
||||||
|
return {
|
||||||
|
x: a.x / l,
|
||||||
|
y: a.y / l
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function length(a) {
|
||||||
|
return Math.sqrt(a.x * a.x + a.y * a.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
function distanceTo(a, b) {
|
||||||
|
return length(subtract(a, b));
|
||||||
|
}
|
@ -1,4 +1,5 @@
|
|||||||
import GCode from './helpers/GCode.js';
|
import GCode from './helpers/GCode.js';
|
||||||
|
import comb from './helpers/comb.js';
|
||||||
|
|
||||||
const PROFILE_TYPES = ['support', 'innerShell', 'outerShell', 'innerInfill', 'outerInfill', 'brim'];
|
const PROFILE_TYPES = ['support', 'innerShell', 'outerShell', 'innerInfill', 'outerInfill', 'brim'];
|
||||||
|
|
||||||
@ -42,7 +43,7 @@ export default function slicesToGCode(slices, settings) {
|
|||||||
}, {});
|
}, {});
|
||||||
|
|
||||||
if (typeof slice.brim !== 'undefined') {
|
if (typeof slice.brim !== 'undefined') {
|
||||||
pathToGCode(gcode, slice.brim, true, true, z, profiles.brim);
|
pathToGCode(null, false, gcode, slice.brim, true, true, z, profiles.brim);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (let i = 0; i < slice.parts.length; i ++) {
|
for (let i = 0; i < slice.parts.length; i ++) {
|
||||||
@ -55,26 +56,26 @@ export default function slicesToGCode(slices, settings) {
|
|||||||
|
|
||||||
const unRetract = isOuterShell;
|
const unRetract = isOuterShell;
|
||||||
const profile = isOuterShell ? profiles.outerShell : profiles.innerShell;
|
const profile = isOuterShell ? profiles.outerShell : profiles.innerShell;
|
||||||
pathToGCode(gcode, shell, false, unRetract, z, profile);
|
pathToGCode(null, false, gcode, shell, false, unRetract, z, profile);
|
||||||
}
|
}
|
||||||
|
|
||||||
pathToGCode(gcode, part.outerFill, false, false, z, profiles.outerInfill);
|
pathToGCode(part.shell[0], true, gcode, part.outerFill, false, false, z, profiles.outerInfill);
|
||||||
pathToGCode(gcode, part.innerFill, true, false, z, profiles.innerInfill);
|
pathToGCode(part.shell[0], true, gcode, part.innerFill, true, false, z, profiles.innerInfill);
|
||||||
} else {
|
} else {
|
||||||
const retract = !(slice.parts.length === 1 && typeof slice.support === 'undefined');
|
const retract = !(slice.parts.length === 1 && typeof slice.support === 'undefined');
|
||||||
pathToGCode(gcode, part.shape, retract, retract, z, profiles.outerShell);
|
pathToGCode(null, false, gcode, part.shape, retract, retract, z, profiles.outerShell);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (typeof slice.support !== 'undefined') {
|
if (typeof slice.support !== 'undefined') {
|
||||||
pathToGCode(gcode, slice.support, true, true, z, profiles.support);
|
pathToGCode(null, false, gcode, slice.support, true, true, z, profiles.support);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return gcode.getGCode();
|
return gcode.getGCode();
|
||||||
}
|
}
|
||||||
|
|
||||||
function pathToGCode(gcode, shape, retract, unRetract, z, { lineProfile, travelProfile, retractionProfile }) {
|
function pathToGCode(outline, combing, gcode, shape, retract, unRetract, z, { lineProfile, travelProfile, retractionProfile }) {
|
||||||
const { closed } = shape;
|
const { closed } = shape;
|
||||||
const paths = shape.mapToLower();
|
const paths = shape.mapToLower();
|
||||||
|
|
||||||
@ -86,9 +87,15 @@ function pathToGCode(gcode, shape, retract, unRetract, z, { lineProfile, travelP
|
|||||||
const point = line[i % line.length];
|
const point = line[i % line.length];
|
||||||
|
|
||||||
if (i === 0) {
|
if (i === 0) {
|
||||||
// TODO
|
if (combing && gcode._nozzlePosition.distanceTo(point) > 3) {
|
||||||
// moveTo should impliment combing
|
const combPath = comb(outline, gcode._nozzlePosition, point);
|
||||||
gcode.moveTo(point.x, point.y, z, travelProfile);
|
for (let i = 0; i < combPath.length; i ++) {
|
||||||
|
const combPoint = combPath[i];
|
||||||
|
gcode.moveTo(combPoint.x, combPoint.y, z, travelProfile);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
gcode.moveTo(point.x, point.y, z, travelProfile);
|
||||||
|
}
|
||||||
|
|
||||||
if (unRetract) {
|
if (unRetract) {
|
||||||
gcode.unRetract(retractionProfile);
|
gcode.unRetract(retractionProfile);
|
||||||
|
Loading…
Reference in New Issue
Block a user