add area to travel bounds, pump shadow for annealing, add input select post to allow name updates
This commit is contained in:
parent
6be5881ea8
commit
f59a2ea021
4 changed files with 25 additions and 12 deletions
|
|
@ -752,6 +752,9 @@ function newSelect(label, options = {}, source) {
|
||||||
if (options.trigger) {
|
if (options.trigger) {
|
||||||
refresh();
|
refresh();
|
||||||
}
|
}
|
||||||
|
if (options.post) {
|
||||||
|
options.post();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
ip.onclick = (ev) => {
|
ip.onclick = (ev) => {
|
||||||
groupSticky = true;
|
groupSticky = true;
|
||||||
|
|
|
||||||
|
|
@ -946,6 +946,11 @@ class Widget {
|
||||||
});
|
});
|
||||||
polys = POLY.union(polys, 0, true);
|
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;
|
return polys;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,14 +2,13 @@
|
||||||
|
|
||||||
import { $, h } from '../../../moto/webui.js';
|
import { $, h } from '../../../moto/webui.js';
|
||||||
import { api } from '../../core/api.js';
|
import { api } from '../../core/api.js';
|
||||||
import { env } from './client.js';
|
import { env, opRender } from './client.js';
|
||||||
import { Tool } from './tool.js';
|
import { Tool } from './tool.js';
|
||||||
import { opFlip } from './cl-flip.js';
|
import { opFlip } from './cl-flip.js';
|
||||||
import { selectHoles } from './cl-hole.js';
|
import { selectHoles } from './cl-hole.js';
|
||||||
import { selectHelical } from './cl-helical.js';
|
import { selectHelical } from './cl-helical.js';
|
||||||
import { surfaceAdd } from './cl-surface.js';
|
import { surfaceAdd } from './cl-surface.js';
|
||||||
import { traceAdd } from './cl-trace.js';
|
import { traceAdd } from './cl-trace.js';
|
||||||
import { opRender } from './client.js';
|
|
||||||
|
|
||||||
const { MODES } = api.const;
|
const { MODES } = api.const;
|
||||||
const { uc: UC } = api;
|
const { uc: UC } = api;
|
||||||
|
|
@ -682,7 +681,7 @@ export function createPopOps() {
|
||||||
ov_botz: 0,
|
ov_botz: 0,
|
||||||
direction: 'camAreaDirection',
|
direction: 'camAreaDirection',
|
||||||
}).inputs = {
|
}).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"),
|
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"),
|
sr_type: UC.newSelect("pattern", { title: "pattern", show: isSurface }, "surftyp"),
|
||||||
sep: UC.newBlank({ class: "pop-sep" }),
|
sep: UC.newBlank({ class: "pop-sep" }),
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,7 @@ const clib = self.ClipperLib;
|
||||||
const ctyp = clib.ClipType;
|
const ctyp = clib.ClipType;
|
||||||
const ptyp = clib.PolyType;
|
const ptyp = clib.PolyType;
|
||||||
const cfil = clib.PolyFillType;
|
const cfil = clib.PolyFillType;
|
||||||
|
const ts_off = 0.1;
|
||||||
|
|
||||||
class OpArea extends CamOp {
|
class OpArea extends CamOp {
|
||||||
constructor(state, op) {
|
constructor(state, op) {
|
||||||
|
|
@ -56,8 +57,8 @@ class OpArea extends CamOp {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function newLayer() {
|
function newLayer(z) {
|
||||||
stack.push(newSlice());
|
stack.push(newSlice(z));
|
||||||
return stack.peek();
|
return stack.peek();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -132,12 +133,10 @@ class OpArea extends CamOp {
|
||||||
let lzo;
|
let lzo;
|
||||||
outer: for (;;)
|
outer: for (;;)
|
||||||
for (let z of zs) {
|
for (let z of zs) {
|
||||||
let slice = newLayer();
|
let slice = newLayer(z);
|
||||||
let layers = slice.output();
|
let layers = slice.output();
|
||||||
let outs = [];
|
|
||||||
let clip = [];
|
|
||||||
let shadow = await shadowAt(z);
|
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
|
// for roughing backward compatability
|
||||||
if (op.omitthru) {
|
if (op.omitthru) {
|
||||||
shadow = shadow.clone(true);
|
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.subtract([ area ], shadow, clip, undefined, undefined, 0);
|
||||||
POLY.offset(clip, [ -toolDiam / 2, -toolOver ], {
|
POLY.offset(clip, [ -toolDiam / 2, -toolOver ], {
|
||||||
count: 999, outs, flat: true, z, minArea: 0
|
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 (outs.length === 0) {
|
||||||
if (bounds && lzo > bounds.min.z) {
|
if (bounds && lzo > bounds.min.z) {
|
||||||
// try a bottom layer matching bottom of selection
|
// try a bottom layer matching bottom of selection
|
||||||
|
|
@ -174,10 +177,12 @@ class OpArea extends CamOp {
|
||||||
for (let p of out)
|
for (let p of out)
|
||||||
p.z += op.leave_z;
|
p.z += op.leave_z;
|
||||||
}
|
}
|
||||||
|
// for roughing backward compatability
|
||||||
if (op.leave_xy) {
|
if (op.leave_xy) {
|
||||||
outs = outs.map(poly => poly.offset(-op.leave_xy)).flat();
|
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;
|
slice.camLines = outs;
|
||||||
zroc += zinc;
|
zroc += zinc;
|
||||||
lzo = z;
|
lzo = z;
|
||||||
|
|
@ -206,7 +211,7 @@ class OpArea extends CamOp {
|
||||||
let zroc = 0;
|
let zroc = 0;
|
||||||
let zinc = 1 / zs.length;
|
let zinc = 1 / zs.length;
|
||||||
for (let z of zs) {
|
for (let z of zs) {
|
||||||
let slice = newLayer();
|
let slice = newLayer(z);
|
||||||
let layers = slice.output();
|
let layers = slice.output();
|
||||||
let outs = [];
|
let outs = [];
|
||||||
if (tr_type === 'none') {
|
if (tr_type === 'none') {
|
||||||
|
|
@ -228,7 +233,8 @@ class OpArea extends CamOp {
|
||||||
// cut tabs when present
|
// cut tabs when present
|
||||||
if (tabs) outs = cutTabs(tabs, outs);
|
if (tabs) outs = cutTabs(tabs, outs);
|
||||||
slice.camLines = 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;
|
zroc += zinc;
|
||||||
progress(proc + (pinc * zroc), 'trace');
|
progress(proc + (pinc * zroc), 'trace');
|
||||||
layers
|
layers
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue