add area to travel bounds, pump shadow for annealing, add input select post to allow name updates

This commit is contained in:
Stewart Allen 2025-12-07 21:37:34 -05:00
commit f59a2ea021
4 changed files with 25 additions and 12 deletions

View file

@ -752,6 +752,9 @@ function newSelect(label, options = {}, source) {
if (options.trigger) {
refresh();
}
if (options.post) {
options.post();
}
};
ip.onclick = (ev) => {
groupSticky = true;

View file

@ -946,6 +946,11 @@ class Widget {
});
polys = POLY.union(polys, 0, true);
// for a more perfect union, pump shadows to merge very close lines
// todo: create clipper only version that avoids round trip thru geo classes
polys = POLY.offset(polys, 0.01);
polys = POLY.offset(polys, -0.01);
return polys;
}
}

View file

@ -2,14 +2,13 @@
import { $, h } from '../../../moto/webui.js';
import { api } from '../../core/api.js';
import { env } from './client.js';
import { env, opRender } from './client.js';
import { Tool } from './tool.js';
import { opFlip } from './cl-flip.js';
import { selectHoles } from './cl-hole.js';
import { selectHelical } from './cl-helical.js';
import { surfaceAdd } from './cl-surface.js';
import { traceAdd } from './cl-trace.js';
import { opRender } from './client.js';
const { MODES } = api.const;
const { uc: UC } = api;
@ -682,7 +681,7 @@ export function createPopOps() {
ov_botz: 0,
direction: 'camAreaDirection',
}).inputs = {
mode: UC.newSelect(LANG.mo_menu, {}, "opmode"),
mode: UC.newSelect(LANG.mo_menu, { post: opRender }, "opmode"),
tr_type: UC.newSelect(LANG.cc_offs_s, { title: LANG.cc_offs_l, show: isTrace }, "traceoff"),
sr_type: UC.newSelect("pattern", { title: "pattern", show: isSurface }, "surftyp"),
sep: UC.newBlank({ class: "pop-sep" }),

View file

@ -17,6 +17,7 @@ const clib = self.ClipperLib;
const ctyp = clib.ClipType;
const ptyp = clib.PolyType;
const cfil = clib.PolyFillType;
const ts_off = 0.1;
class OpArea extends CamOp {
constructor(state, op) {
@ -56,8 +57,8 @@ class OpArea extends CamOp {
}
}
function newLayer() {
stack.push(newSlice());
function newLayer(z) {
stack.push(newSlice(z));
return stack.peek();
}
@ -132,12 +133,10 @@ class OpArea extends CamOp {
let lzo;
outer: for (;;)
for (let z of zs) {
let slice = newLayer();
let slice = newLayer(z);
let layers = slice.output();
let outs = [];
let clip = [];
let shadow = await shadowAt(z);
let tool_shadow = POLY.offset(shadow, [ toolDiam / 2 - 0.01 ], { count: 1, z });
let tool_shadow = POLY.offset(shadow, [ toolDiam / 2 - ts_off ], { count: 1, z });
// for roughing backward compatability
if (op.omitthru) {
shadow = shadow.clone(true);
@ -152,10 +151,14 @@ class OpArea extends CamOp {
});
}
}
// progressive offset of polygons inside area clipped to the shadow
let outs = [];
let clip = [];
POLY.subtract([ area ], shadow, clip, undefined, undefined, 0);
POLY.offset(clip, [ -toolDiam / 2, -toolOver ], {
count: 999, outs, flat: true, z, minArea: 0
});
// if we see no offsets, re-check the mesh bottom Z then exit
if (outs.length === 0) {
if (bounds && lzo > bounds.min.z) {
// try a bottom layer matching bottom of selection
@ -174,10 +177,12 @@ class OpArea extends CamOp {
for (let p of out)
p.z += op.leave_z;
}
// for roughing backward compatability
if (op.leave_xy) {
outs = outs.map(poly => poly.offset(-op.leave_xy)).flat();
}
slice.tool_shadow = tool_shadow;
// store travel boundary that triggers up and over moves
slice.tool_shadow = [ area, ...tool_shadow ];
slice.camLines = outs;
zroc += zinc;
lzo = z;
@ -206,7 +211,7 @@ class OpArea extends CamOp {
let zroc = 0;
let zinc = 1 / zs.length;
for (let z of zs) {
let slice = newLayer();
let slice = newLayer(z);
let layers = slice.output();
let outs = [];
if (tr_type === 'none') {
@ -228,7 +233,8 @@ class OpArea extends CamOp {
// cut tabs when present
if (tabs) outs = cutTabs(tabs, outs);
slice.camLines = outs;
slice.tool_shadow = POLY.offset(await shadowAt(z), [ toolDiam / 2 - 0.01 ], { count: 1, z });
// store travel boundary that triggers up and over moves
slice.tool_shadow = [ area, ...POLY.offset(await shadowAt(z), [ toolDiam / 2 - ts_off ], { count: 1, z }) ];
zroc += zinc;
progress(proc + (pinc * zroc), 'trace');
layers