cull polish lines under model

This commit is contained in:
Stewart Allen 2020-03-22 20:05:04 -04:00
commit a26b02a4f0
3 changed files with 39 additions and 8 deletions

View file

@ -318,6 +318,10 @@ var gs_base_point = exports;
return BASE.newLine(np1, np2, KEYS.NONE); return BASE.newLine(np1, np2, KEYS.NONE);
}; };
PRO.offset = function(x, y, z) {
return newPoint(this.x + x, this.y + y, this.z + z);
};
/** /**
* checks if a point is inside of a polygon * checks if a point is inside of a polygon
* does not check children/holes * does not check children/holes

View file

@ -221,21 +221,45 @@ var gs_kiri_fdm = exports;
let polys = []; let polys = [];
pa.forEach(p => { pa.forEach(p => {
// rotate and test for self-intersection (points under model)
p.ensureXY();
let ox = p._aligned == 'yz' ? 0.1 : 0;
let oy = p._aligned == 'yz' ? 0 : 0.1;
p.forEachPoint(pt => {
let int = p.intersections(
pt.offset(ox,oy,0),
pt.offset(ox*10000,oy*10000,0));
if (int.length > 0) {
pt._under = true;
}
});
p.restoreXY();
let lastp = undefined; let lastp = undefined;
let poly = []; let poly = [];
// look for qualifying segments
p.forEachSegment((p1, p2) => { p.forEachSegment((p1, p2) => {
// return when both below // eliminate segments that projected up
// intersect with the polygon (bottom faces)
if (p1._under || p2._under) {
return;
}
// skip when both below layer range
if (p1.z < zb && p2.z < zb) { if (p1.z < zb && p2.z < zb) {
return; return;
} }
// return when both above // skip when both above layer range
if (p1.z > zt && p2.z > zt) { if (p1.z > zt && p2.z > zt) {
return; return;
} }
// return when vertical // skip vertical
if (p1.x === p2.x && p1.y === p2.y) { if (p1.x === p2.x && p1.y === p2.y) {
return; return;
} }
// skip horizontal
// if (p1.z === p2.z) {
// return;
// }
// order points lowest to highest // order points lowest to highest
let swap = false; let swap = false;
if (p1.z > p2.z) { if (p1.z > p2.z) {

View file

@ -11,7 +11,8 @@ var gs_kiri_slicer = exports;
var slicer = self.kiri.slicer = { var slicer = self.kiri.slicer = {
slice: slice, slice: slice,
sliceWidget: sliceWidget sliceWidget: sliceWidget,
connectLines: connectLines
}; };
var KIRI = self.kiri, var KIRI = self.kiri,
@ -489,11 +490,13 @@ var gs_kiri_slicer = exports;
if (topoMode) { if (topoMode) {
var lines = slice.lines, llen = lines.length, idx, line; var lines = slice.lines, llen = lines.length, idx, line;
// shared points causing problems // shared points causing problems
for (idx=0; idx<llen; idx++) { line = lines[idx]; for (idx=0; idx<llen; idx++) {
line = lines[idx];
line.p1 = line.p1.clone(); line.p1 = line.p1.clone();
line.p2 = line.p2.clone(); line.p2 = line.p2.clone();
} }
for (idx=0; idx<llen; idx++) { line = lines[idx]; for (idx=0; idx<llen; idx++) {
line = lines[idx];
if (options.swapX) { if (options.swapX) {
line.p1.swapXZ(); line.p1.swapXZ();
line.p2.swapXZ(); line.p2.swapXZ();
@ -535,7 +538,7 @@ var gs_kiri_slicer = exports;
* @param {number} [index] * @param {number} [index]
* @returns {Array} * @returns {Array}
*/ */
function connectLines(input, index) { function connectLines(input) {
// map points to all other points they're connected to // map points to all other points they're connected to
var DBUG = BASE.debug, var DBUG = BASE.debug,
CONF = BASE.config, CONF = BASE.config,
@ -653,7 +656,7 @@ var gs_kiri_slicer = exports;
closed = 0, closed = 0,
open = 0; open = 0;
paths.forEach(function(path, index) { paths.forEach(function(path) {
// use longest perimeter vs longest path? // use longest perimeter vs longest path?
if (!longest || path.length > longest.length) longest = path; if (!longest || path.length > longest.length) longest = path;
if (!path.open) closed++; else open++; if (!path.open) closed++; else open++;