diff --git a/src/kiri-mode/cam/animate2.js b/src/kiri-mode/cam/animate2.js index f9681c77..734c7f67 100644 --- a/src/kiri-mode/cam/animate2.js +++ b/src/kiri-mode/cam/animate2.js @@ -104,8 +104,8 @@ kiri.load(() => { geo.setIndex(new THREE.BufferAttribute(ia, 1)); const mat = new THREE.MeshMatcapMaterial({ flatShading: true, - transparent: false, - opacity: 1, + transparent: true, + opacity: 0.1, color: 0x888888, side: THREE.DoubleSide }); @@ -385,7 +385,7 @@ kiri.load(() => { stockSlices = []; const { x, y, z } = stock; - const sliceCount = 20; + const sliceCount = 1; const sliceWidth = stock.x / sliceCount; for (let i=0; i 0; } - function setAnimationStyle(settings) { - let changed = isIndexed !== settings.process.camStockIndexed; - isIndexed = settings.process.camStockIndexed; + function setAnimationStyle() { + const { camStockIndexed, camStockOn } = current.process; + let newIndexed = camStockIndexed && camStockOn; + let changed = isIndexed !== newIndexed; + isIndexed = newIndexed; if (!isIndexed || !isCamMode) { for (let widget of API.widgets.all()) { widget.setAxisIndex(0); } } - if (!(isCamMode && changed)) { + if (!isCamMode) { return; } if (isIndexed) { - settings.process.camZAnchor = "middle"; + current.process.camZAnchor = "middle"; } animVer = isIndexed ? 1 : 0; SPACE.platform.setVisible(!isIndexed); + $('cam-index').style.display = isIndexed ? '' : 'none'; + if (!changed) { + return; + } for (let widget of api.widgets.all()) { widget.setIndexed(camStock && isIndexed ? camStock.scale.z : 0); } api.platform.update_top_z(); - $('cam-index').style.display = isIndexed ? '' : 'none'; // add or remove clock op depending on indexing const cp = current.process; if (!cp.ops) { @@ -104,7 +109,7 @@ CAM.init = function(kiri, api) { api.event.on("widget.add", widget => { if (isCamMode) { - setAnimationStyle(api.conf.get()); + setAnimationStyle(); } }); @@ -173,7 +178,7 @@ CAM.init = function(kiri, api) { api.ui.camTabs.marker.style.display = hasTabs ? 'flex' : 'none'; api.ui.camStock.marker.style.display = proc.camStockOn ? 'flex' : 'none'; updateStock(settings, 'settings.saved.internal'); - setAnimationStyle(settings); + setAnimationStyle(); func.opRender(); }); @@ -182,9 +187,11 @@ CAM.init = function(kiri, api) { if (!isCamMode) return; validateTools(settings.tools); restoreTabs(api.widgets.all()); - setAnimationStyle(settings); + setAnimationStyle(); }); + api.event.on("boolean.click", api.platform.update_top_z); + api.event.on([ "init-done", "view.set", diff --git a/src/kiri-mode/cam/ops.js b/src/kiri-mode/cam/ops.js index 0b4f8c0d..42513d2d 100644 --- a/src/kiri-mode/cam/ops.js +++ b/src/kiri-mode/cam/ops.js @@ -481,6 +481,7 @@ class OpOutline extends CamOp { max: op.top ? zMax + ztOff : undefined }; let indices = slicer.interval(op.down, intopt); +console.log({slicer, indices, zBottom}); let trueShadow = process.camTrueShadow === true; // shift out first (top-most) slice indices.shift(); diff --git a/src/kiri-mode/cam/slice.js b/src/kiri-mode/cam/slice.js index 7f6d587a..373fe5f6 100644 --- a/src/kiri-mode/cam/slice.js +++ b/src/kiri-mode/cam/slice.js @@ -31,14 +31,22 @@ CAM.slice = function(settings, widget, onupdate, ondone) { proc = settings.process, stock = settings.stock || {}, hasStock = stock.x && stock.y && stock.z && proc.camStockOn, + isIndexed = hasStock && proc.camStockIndexed, camOps = widget.camops = [], sliceAll = widget.slices = [], bounds = widget.getBoundingBox(), - wztop = widget.track.top, - ztOff = hasStock ? stock.z - wztop : 0, - zbOff = hasStock ? wztop - widget.track.box.d : 0, - zBottom = proc.camZBottom - zbOff, - zMin = Math.max(bounds.min.z, zBottom), + track = widget.track, + // widget top z as defined by setTopz() + wztop = track.top, + // distance between top of part and top of stock + ztOff = isIndexed ? 0 : (hasStock ? stock.z - wztop : 0), + // distance between bottom of part and bottom of stock + zbOff = isIndexed ? 0 : (hasStock ? wztop - track.box.d : 0), + // defined z bottom offset by distance to stock bottom + // keeps the z bottom relative to the part when z align changes + zBottom = isIndexed ? bounds.min.z : proc.camZBottom - zbOff, + // greater of widget bottom and z bottom + zMin = isIndexed ? bounds.min.z : Math.max(bounds.min.z, zBottom), zMax = bounds.max.z, zThru = proc.camZBottom ? 0 : (proc.camZThru || 0), zTop = zMax + ztOff, @@ -141,7 +149,7 @@ CAM.slice = function(settings, widget, onupdate, ondone) { function setAxisIndex(degrees = 0, absolute = true) { axisIndex = absolute ? degrees : axisIndex + degrees; axisRotation = (Math.PI / 180) * axisIndex; - widget.setAxisIndex(-axisIndex); + widget.setAxisIndex(isIndexed ? -axisIndex : 0); } function addSlices(slices) { @@ -232,7 +240,7 @@ CAM.slice = function(settings, widget, onupdate, ondone) { // console.log('reshadow', progress.round(3)); }); } - tracker.rotation = axisRotation; + tracker.rotation = isIndexed ? axisRotation : 0; camOps.push(op); opSum += weight; } diff --git a/src/kiri/init.js b/src/kiri/init.js index 3c2219a6..c2213ae4 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -1918,12 +1918,12 @@ gapp.register("kiri.init", [], (root, exports) => { camStockOffset: uc.newBoolean(LANG.cs_offs_s, onBooleanClick, {title:LANG.cs_offs_l, modes:CAM}), camStockClipTo: uc.newBoolean(LANG.cs_clip_s, onBooleanClick, {title:LANG.cs_clip_l, modes:CAM}), camSep: uc.newBlank({class:"pop-sep"}), - camStockIndexed: uc.newBoolean(LANG.cs_indx_s, onBooleanClick, {title:LANG.cs_indx_l, modes:CAM, show: () => ui.camStockOn.checked}), + camStockIndexed: uc.newBoolean(LANG.cs_indx_s, onBooleanClick, {title:LANG.cs_indx_l, modes:CAM, show:() => ui.camStockOn.checked}), camStockOn: uc.newBoolean(LANG.cs_offe_s, onBooleanClick, {title:LANG.cs_offe_l, modes:CAM}), camCommon: uc.newGroup(LANG.cc_menu, null, {modes:CAM}), - camZAnchor: uc.newSelect(LANG.ou_zanc_s, {title: LANG.ou_zanc_l, action:zAnchorSave, modes:CAM, trace:true}, "zanchor"), - camSep: uc.newBlank({class:"pop-sep"}), + camZAnchor: uc.newSelect(LANG.ou_zanc_s, {title: LANG.ou_zanc_l, action:zAnchorSave, modes:CAM, trace:true, show:() => ui.camStockOn.checked && !ui.camStockIndexed.checked}, "zanchor"), + camSep: uc.newBlank({class:"pop-sep", show:() => ui.camStockOn.checked && !ui.camStockIndexed.checked}), camZOffset: uc.newInput(LANG.ou_ztof_s, {title:LANG.ou_ztof_l, convert:uc.toFloat, modes:CAM, units:true}), camZBottom: uc.newInput(LANG.ou_zbot_s, {title:LANG.ou_zbot_l, convert:uc.toFloat, modes:CAM, units:true, trigger: true}), camZThru: uc.newInput(LANG.ou_ztru_s, {title:LANG.ou_ztru_l, convert:uc.toFloat, bound:uc.bound(0.0,100), modes:CAM, units:true, show:() => { return ui.camZBottom.value == 0 }}), diff --git a/src/kiri/platform.js b/src/kiri/platform.js index 39421bf2..2adf2058 100644 --- a/src/kiri/platform.js +++ b/src/kiri/platform.js @@ -77,7 +77,7 @@ function platformUpdateOrigin() { space.platform.setRulers(ruler, ruler, 1 / api.view.unit_scale(), 'X', isBelt ? 'Z' : 'Y'); let { x, y, z } = origin; - let oz = process.camStockIndexed ? z / 2 : z; + let oz = process.camStockIndexed && process.camStockOn ? z / 2 : z; if (controller.showOrigin && MODE !== MODES.SLA) { space.platform.setOrigin(x, y, oz, true); } else {