bump rev 4.3.1 and fix thinwall closed poly

This commit is contained in:
Stewart Allen 2025-09-22 09:48:25 -04:00
commit e8d5c9e743
6 changed files with 54 additions and 50 deletions

View file

@ -1,6 +1,6 @@
{
"name": "grid-apps",
"version": "4.3.0",
"version": "4.3.1",
"description": "grid.space 3d slicing & modeling tools",
"author": "Stewart Allen <sa@grid.space>",
"license": "MIT",

View file

@ -1105,7 +1105,11 @@ export class Polygon {
}
closeIf(dist = 1) {
if (this.first().distTo2D(this.last()) <= dist) {
let closeDist = this.first().distTo2D(this.last());
if (closeDist < 0.001) {
this.points.pop();
return this.setClosed();
} else if (closeDist <= dist) {
return this.setClosed();
} else {
return this.setOpen();

View file

@ -287,50 +287,50 @@ function trace_noodle(noodle, noodleWidth, minR, midR, maxR, opt = {}) {
// micro stepping insets. the same intersect technique used with
// medial axis can be applied to this structure to produce an
// equivalent output. not as computationally efficient, but much simpler.
if (brute) {
let { intersectRayLine } = base.util;
let tests = insets.slice(1);
let source = POLY.flatten(insets[0], []);
for (let poly of source) {
// segment the smallest inset and test against all other insets
poly.segment(minR).forEachSegment((p1, p2) => {
let np1 = { x:(p1.x+p2.x)/2, y:(p1.y+p2.y)/2 };
let len = pointDist(p1, p2);
let dx = (p1.x - p2.x) / len;
let dy = (p1.y - p2.y) / len;
let np2 = { x: np1.x + dy * 10, y: np1.y - dx * 10 };
let max = { dtotl: poly.dtotl, dist: Infinity, maxd: Infinity };
let term = false;
outer: for (let test of tests) {
for (let tpoly of POLY.flatten(test, [])) {
tpoly.forEachSegment((tp1, tp2) => {
let int = intersectRayLine(np1, { dx: dy, dy: -dx }, tp1, tp2);
if (int && int.dist > int.p1.poly.dtotl) {
return;
}
if (int && int.dist <= max.maxd && int.p1.poly.dtotl > max.dtotl) {
max.dtotl = int.p1.poly.dtotl;
max.dist = int.dist;
max.int = int;
} else if (int && int.dist <= max.maxd && int.p1.poly.dtotl === max.dtotl && int.dist < max.dist) {
max.dtotl = int.p1.poly.dtotl;
max.dist = int.dist;
max.int = int;
}
});
if (term) {
break outer;
}
}
}
if (max.int) {
lines.push(new Point(np1.x, np1.y));
lines.push(new Point(max.int.x, max.int.y));
}
});
}
return { lines, polys };
}
// if (brute) {
// let { intersectRayLine } = base.util;
// let tests = insets.slice(1);
// let source = POLY.flatten(insets[0], []);
// for (let poly of source) {
// // segment the smallest inset and test against all other insets
// poly.segment(minR).forEachSegment((p1, p2) => {
// let np1 = { x:(p1.x+p2.x)/2, y:(p1.y+p2.y)/2 };
// let len = pointDist(p1, p2);
// let dx = (p1.x - p2.x) / len;
// let dy = (p1.y - p2.y) / len;
// let np2 = { x: np1.x + dy * 10, y: np1.y - dx * 10 };
// let max = { dtotl: poly.dtotl, dist: Infinity, maxd: Infinity };
// let term = false;
// outer: for (let test of tests) {
// for (let tpoly of POLY.flatten(test, [])) {
// tpoly.forEachSegment((tp1, tp2) => {
// let int = intersectRayLine(np1, { dx: dy, dy: -dx }, tp1, tp2);
// if (int && int.dist > int.p1.poly.dtotl) {
// return;
// }
// if (int && int.dist <= max.maxd && int.p1.poly.dtotl > max.dtotl) {
// max.dtotl = int.p1.poly.dtotl;
// max.dist = int.dist;
// max.int = int;
// } else if (int && int.dist <= max.maxd && int.p1.poly.dtotl === max.dtotl && int.dist < max.dist) {
// max.dtotl = int.p1.poly.dtotl;
// max.dist = int.dist;
// max.int = int;
// }
// });
// if (term) {
// break outer;
// }
// }
// }
// if (max.int) {
// lines.push(new Point(np1.x, np1.y));
// lines.push(new Point(max.int.x, max.int.y));
// }
// });
// }
// return { lines, polys };
// }
let pointMap = new Map();
let lineMap = new Map();

View file

@ -1009,7 +1009,7 @@ function doRender(slice, isSynth, params, opt = {}) {
.setLayer("walls", Color.thin)
.addPolys(top.thin_wall.map(a =>
a.length === 1 ?
newPolygon().centerCircle(a[0], a[0].r, 6) :
newPolygon().centerCircle(a[0], a[0].r/2, 12) :
newPolygon(a.map(p => newPoint(p.x, p.y)))
.setZ(slice.z)
.closeIf(height)

View file

@ -3,9 +3,9 @@
const terms = {
COPYRIGHT: "Copyright (C) Stewart Allen <sa@grid.space> - All Rights Reserved",
LICENSE: "See the license.md file included with the source distribution",
VERSION: "4.3.0"
VERSION: "4.3.1"
};
export const beta = 1;
export const beta = 0;
export const license = terms;
export const version = terms.VERSION;

View file

@ -1,5 +1,5 @@
{
"name": "Kiri:Moto 4.3.0",
"name": "Kiri:Moto 4.3.1",
"short_name": "Kiri:Moto",
"description": "Slicer for 3D printers, CNC mills, laser cutters and more",
"start_url": "/kiri/",