diff --git a/src/kiri/app/conf/defaults.js b/src/kiri/app/conf/defaults.js index b4e6ed56..6bd700e4 100644 --- a/src/kiri/app/conf/defaults.js +++ b/src/kiri/app/conf/defaults.js @@ -604,6 +604,7 @@ export const conf = { camToolInit: true, camTraceDogbone: false, camTraceDown: 0, + camTraceIgnore: false, camTraceLines: false, camTraceMerge: false, camTraceOffOver: 0, diff --git a/src/kiri/mode/cam/app/cl-ops.js b/src/kiri/mode/cam/app/cl-ops.js index 9fe753cf..0e7edf71 100644 --- a/src/kiri/mode/cam/app/cl-ops.js +++ b/src/kiri/mode/cam/app/cl-ops.js @@ -487,6 +487,7 @@ export function createPopOps() { offover: 'camTraceOffOver', dogbone: 'camTraceDogbone', revbone: 'camTraceDogbone', + ignore: 'camTraceIgnore', merge: 'camTraceMerge', ov_topz: 0, ov_botz: 0, @@ -502,6 +503,7 @@ export function createPopOps() { offover: UC.newInput(LANG.cc_offd_s, { title: LANG.cc_offd_l, convert: toFloat, units, show: () => env.poppedRec.offset !== "none" || env.poppedRec.mode === "clear" }), sep: UC.newBlank({ class: "pop-sep", modes: MODES.CAM, xshow: zDogSep }), thru: UC.newBoolean(LANG.cc_thru_s, undefined, { title: LANG.cc_thru_l }), + ignore: UC.newBoolean(LANG.co_igno_s, undefined, { title: LANG.co_igno_l, show: () => env.poppedRec.mode === 'clear' }), merge: UC.newBoolean(LANG.co_merg_s, undefined, { title: LANG.co_merg_l, show: () => !env.popOp.trace.rec.down }), dogbone: UC.newBoolean(LANG.co_dogb_s, undefined, { title: LANG.co_dogb_l, show: canDogBones }), revbone: UC.newBoolean(LANG.co_dogr_s, undefined, { title: LANG.co_dogr_l, show: canDogBonesRev }), diff --git a/src/kiri/mode/cam/work/op-area.js b/src/kiri/mode/cam/work/op-area.js index 8297d419..148671ae 100644 --- a/src/kiri/mode/cam/work/op-area.js +++ b/src/kiri/mode/cam/work/op-area.js @@ -191,7 +191,12 @@ class OpArea extends CamOp { let outs = []; let clip = []; let firstOff = -(toolDiam / 2 + (op.leave_xy ?? 0)); - POLY.subtract([ area ], shadow, clip, undefined, undefined, 0); + // remove shadow from area + if (op.ignore) { + clip = [ area ]; + } else { + POLY.subtract([ area ], shadow, clip, undefined, undefined, 0); + } POLY.offset(clip, [ firstOff, -toolOver ], { count: op.walls ? 1 : (op.steps ?? 999), outs, flat: true, z: z - zMov, ...offopt }); @@ -258,7 +263,7 @@ class OpArea extends CamOp { for (let z of zs) { let slice = newLayer(z); let layers = slice.output(); - let shadow = await shadowAt(z); + let shadow = op.base ? state.shadow.base : await shadowAt(z); let outs = []; if (tr_type === 'none') { // todo: move this out of the zs loop and only setZ when needed diff --git a/src/kiri/mode/cam/work/op-outline.js b/src/kiri/mode/cam/work/op-outline.js index 198eab31..e21dfaa2 100644 --- a/src/kiri/mode/cam/work/op-outline.js +++ b/src/kiri/mode/cam/work/op-outline.js @@ -25,9 +25,11 @@ class OpOutline extends CamOp { let areas = shadow.base.clone(true); ops_list.push(new OpArea(state, { areas: { [widget.id]: areas.map(p => p.toArray()) }, + base: true, direction, dogbones, down, + drape: true, expand: 0, mode: 'trace', omitinner: omitvoid, diff --git a/src/kiri/mode/cam/work/op-trace.js b/src/kiri/mode/cam/work/op-trace.js index 25ae2065..cbf3512e 100644 --- a/src/kiri/mode/cam/work/op-trace.js +++ b/src/kiri/mode/cam/work/op-trace.js @@ -12,7 +12,7 @@ class OpTrace extends CamOp { async slice(progress) { let { op, state } = this; - let { areas, direction, down, expand, follow, offover, offset, outline, mode, ov_botz, ov_topz } = op; + let { areas, direction, down, expand, follow, offover, offset, outline, ignore, mode, ov_botz, ov_topz } = op; let { plunge, rate, refine, smooth, spindle, step, steps, thru, tolerance, tool } = op; let trace = { areas, @@ -21,6 +21,7 @@ class OpTrace extends CamOp { down, expand, follow, + ignore, mode: mode === 'clear' ? 'clear' : 'trace', outline, ov_botz, diff --git a/src/kiri/mode/fdm/app/init-ui.js b/src/kiri/mode/fdm/app/init-ui.js index 00837bd5..d7d4642f 100644 --- a/src/kiri/mode/fdm/app/init-ui.js +++ b/src/kiri/mode/fdm/app/init-ui.js @@ -380,6 +380,8 @@ function supportDone() { // Use popVisualState to restore original material w.popVisualState('paint'); }); + api.conf.save(); + api.space.save(); } // manual supports clear diff --git a/web/kiri/lang/en.js b/web/kiri/lang/en.js index a74666b9..5c3fdfc3 100644 --- a/web/kiri/lang/en.js +++ b/web/kiri/lang/en.js @@ -549,6 +549,8 @@ self.lang['en-us'] = { co_menu: "outline", co_merg_s: "merge overlap", co_merg_l: ["merge overlapping lines to prevent overcutting into adjacent solids"], + co_igno_s: "ignore part", + co_igno_l: ["do not constrain cutting areas","to part boundaries. this allows","using the part as negative space"], co_dogb_s: "dogbones", co_dogb_l: ["insert dogbone cuts","into inside corners"], co_dogr_s: "reverse bones",