diff --git a/src/kiri-mode/cam/client.js b/src/kiri-mode/cam/client.js index a9c23c2b..770e480a 100644 --- a/src/kiri-mode/cam/client.js +++ b/src/kiri-mode/cam/client.js @@ -1366,6 +1366,19 @@ CAM.init = function(kiri, api) { // filter: UC.newRow([ UC.newButton(LANG.filter, contourFilter) ], {class:"ext-buttons f-row"}) }; + function canDogBones() { + if (!poppedRec) return false; + return poppedRec.mode === 'follow';// && poppedRec.offset && poppedRec.offset !== 'none'; + } + + function canDogBonesRev() { + return canDogBones() && poppedRec.dogbone; + } + + function zDogSep() { + return canDogBones() || zBottom(); + } + createPopOp('trace', { mode: 'camTraceType', offset: 'camTraceOffset', @@ -1395,10 +1408,10 @@ CAM.init = function(kiri, api) { down: UC.newInput(LANG.cc_sdwn_s, {title:LANG.cc_sdwn_l, convert:UC.toFloat, units:true}), thru: UC.newInput(LANG.cc_thru_s, {title:LANG.cc_thru_l, convert:UC.toFloat, units:true}), offover: UC.newInput(LANG.cc_offd_s, {title:LANG.cc_offd_l, convert:UC.toFloat, units:true, show:() => poppedRec.offset !== "none"}), - sep: UC.newBlank({class:"pop-sep", modes:MCAM, poop:true }), + sep: UC.newBlank({class:"pop-sep", modes:MCAM, xshow:zDogSep}), bottom: UC.newBoolean(LANG.cf_botm_s, undefined, {title:LANG.cf_botm_l, show:(op,conf) => conf.process.camZBottom}), - dogbone: UC.newBoolean(LANG.co_dogb_s, undefined, {title:LANG.co_dogb_l}), - revbone: UC.newBoolean(LANG.co_dogr_s, undefined, {title:LANG.co_dogr_l, show:(op) => poppedRec.dogbone}), + 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}), sep: UC.newBlank({class:"pop-sep"}), menu: UC.newRow([ UC.newButton(undefined, func.traceAdd, {icon:''}), diff --git a/src/kiri-mode/cam/ops.js b/src/kiri-mode/cam/ops.js index 30738a91..7e63207e 100644 --- a/src/kiri-mode/cam/ops.js +++ b/src/kiri-mode/cam/ops.js @@ -1001,7 +1001,7 @@ class OpTrace extends CamOp { return slice; } function followZ(poly) { - if (op.dogbones) { + if (op.dogbone) { CAM.addDogbones(poly, toolDiam / 5, !op.revbone); } let z = poly.getZ(); diff --git a/src/kiri-mode/cam/slice.js b/src/kiri-mode/cam/slice.js index 61e2596d..e6bb3a00 100644 --- a/src/kiri-mode/cam/slice.js +++ b/src/kiri-mode/cam/slice.js @@ -292,33 +292,29 @@ CAM.addDogbones = function(poly, dist, reverse) { if (Array.isArray(poly)) { return poly.forEach(p => CAM.addDogbones(p, dist)); } - // if (poly.open) return; let open = poly.open; let isCW = poly.isClockwise(); if (reverse || poly.parent) isCW = !isCW; let oldpts = poly.points.slice(); let lastpt = oldpts[oldpts.length - 1]; let lastsl = lastpt.slopeTo(oldpts[0]).toUnit(); + let length = oldpts.length + (open ? 0 : 1); let newpts = [ ]; - for (let i=0; i 45) { - let newa = base.newSlopeFromAngle(lastsl.angle + bdiff); - newpts.push(lastpt.projectOnSlope(newa, dist)); - newpts.push(lastpt.clone()); - } else if (!isCW && adiff < -45) { - let newa = base.newSlopeFromAngle(lastsl.angle - bdiff); - newpts.push(lastpt.projectOnSlope(newa, dist)); - newpts.push(lastpt.clone()); + if (!open || (i > 1 && i < length)) { + if (isCW && adiff > 45) { + let newa = base.newSlopeFromAngle(lastsl.angle + bdiff); + newpts.push(lastpt.projectOnSlope(newa, dist)); + newpts.push(lastpt.clone()); + } else if (!isCW && adiff < -45) { + let newa = base.newSlopeFromAngle(lastsl.angle - bdiff); + newpts.push(lastpt.projectOnSlope(newa, dist)); + newpts.push(lastpt.clone()); + } } lastsl = nextsl; lastpt = nextpt;