add z anchor. bump rev 2.5.d7

This commit is contained in:
Stewart Allen 2020-12-22 15:05:50 -05:00
commit 96c5f0868f
13 changed files with 64 additions and 29 deletions

View file

@ -1,6 +1,6 @@
{
"name": "grid-apps",
"version": "2.5.6D",
"version": "2.5.7D",
"description": "grid.space 3d slice & modeling tools",
"author": "Stewart Allen <sa@grid.space>",
"license": "MIT",

View file

@ -6,7 +6,7 @@
if (!self.kiri) {
self.kiri = {
beta: 2506,
beta: 2507,
driver: {}, // driver modules
loader: [] // module loading: array of functions
};

View file

@ -456,7 +456,8 @@
camDepthFirst: false,
camEaseDown: false,
camOriginTop: true,
camZTopOffset: 0,
camZAnchor: "top",
camZOffset: 0,
camZBottom: 0,
camZClearance: 1,
camZThru: 0,
@ -616,7 +617,6 @@
showSpeeds: true,
freeLayout: true,
autoLayout: true,
alignTop: true,
units: "mm",
exportOcto: false,
exportGhost: false,

View file

@ -130,6 +130,11 @@
API.platform.update_speeds();
}
function zAnchorSave() {
API.conf.update();
API.platform.update_top_z();
}
function booleanSave() {
let control = settings().controller;
let isDark = control.dark;
@ -139,7 +144,6 @@
control.showRulers = UI.showRulers.checked;
control.autoLayout = UI.autoLayout.checked;
control.freeLayout = UI.freeLayout.checked;
control.alignTop = UI.alignTop.checked;
control.autoSave = UI.autoSave.checked;
control.reverseZoom = UI.reverseZoom.checked;
control.dark = UI.dark.checked;
@ -1554,7 +1558,6 @@
units: UC.newSelect(LANG.op_unit_s, {title: LANG.op_unit_l, action:unitsSave, modes:CAM, trace:true}, "units"),
layout: UC.newGroup(LANG.lo_menu, $('prefs-lay'), {inline: true}),
alignTop: UC.newBoolean(LANG.op_alig_s, booleanSave, {title:LANG.op_alig_l}),
autoLayout: UC.newBoolean(LANG.op_auto_s, booleanSave, {title:LANG.op_auto_l}),
freeLayout: UC.newBoolean(LANG.op_free_s, booleanSave, {title:LANG.op_free_l}),
autoSave: UC.newBoolean(LANG.op_save_s, booleanSave, {title:LANG.op_save_l}),
@ -1751,10 +1754,13 @@
camStockOn: UC.newBoolean(LANG.cs_offe_s, onBooleanClick, {title:LANG.cs_offe_l, modes:CAM}),
camCommon: UC.newGroup(LANG.cc_menu, null, {modes:CAM}),
camZTopOffset: UC.newInput(LANG.ou_ztof_s, {title:LANG.ou_ztof_l, convert:UC.toFloat, modes:CAM, units:true}),
camZAnchor: UC.newSelect(LANG.ou_zanc_s, {title: LANG.ou_zanc_l, action:zAnchorSave, modes:CAM, trace:true}, "zanchor"),
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}),
camZClearance: UC.newInput(LANG.ou_zclr_s, {title:LANG.ou_zclr_l, convert:UC.toFloat, bound:UC.bound(0.01,100), modes:CAM, units: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 }}),
camSep: UC.newBlank({class:"pop-sep"}),
camZClearance: UC.newInput(LANG.ou_zclr_s, {title:LANG.ou_zclr_l, convert:UC.toFloat, bound:UC.bound(0.01,100), modes:CAM, units:true}),
camSep: UC.newBlank({class:"pop-sep"}),
camFastFeedZ: UC.newInput(LANG.cc_rzpd_s, {title:LANG.cc_rzpd_l, convert:UC.toFloat, modes:CAM, units:true}),
camFastFeed: UC.newInput(LANG.cc_rapd_s, {title:LANG.cc_rapd_l, convert:UC.toFloat, modes:CAM, units:true}),
@ -2280,7 +2286,6 @@
UI.showSpeeds.checked = control.showSpeeds;
UI.freeLayout.checked = control.freeLayout;
UI.autoLayout.checked = control.autoLayout;
UI.alignTop.checked = control.alignTop;
UI.reverseZoom.checked = control.reverseZoom;
UI.autoSave.checked = control.autoSave;
UI.decimate.checked = control.decimate;

View file

@ -190,6 +190,11 @@
{ name: "follow" },
// { name: "out" },
// { name: "in" }
],
zanchor: [
{ name: "top" },
{ name: "middle" },
{ name: "bottom" }
]
};
@ -1206,7 +1211,7 @@
let y = 0;
let z = 0;
if (MODE === MODES.CAM && proc.camOriginTop) {
z = (topZ + topZD) + 0.01;
z = (hasStock ? stock.z : topZ) + 0.01;
}
if (!center) {
if (hasStock) {
@ -1236,15 +1241,30 @@
}
function platformUpdateTopZ(zdelta) {
// preserve topZD and re-use when not supplied as argument
topZD = zdelta !== undefined ? zdelta : topZD;
let stock = settings.stock;
let hasStock = stock.x && stock.y && stock.z;
let alignTopOk = WIDGETS.length > 1 && settings.controller.alignTop;
let camz = (MODE === MODES.CAM) && (hasStock || alignTopOk);
let czto = hasStock ? settings.process.camZTopOffset : 0;
let ztop = camz ? (topZ + topZD) - czto : 0;
forAllWidgets(function(widget) {
widget.setTopZ(ztop);
if (MODE === MODES.CAM) {
let bounds = widget.getBoundingBox();
let wzmax = bounds.max.z;
let topz = hasStock ? stock.z : topZ;
let zdelta = settings.process.camZOffset || 0;
switch (settings.process.camZAnchor) {
case 'top':
widget.setTopZ(stock.z - zdelta);
break;
case 'middle':
widget.setTopZ(stock.z - (stock.z - wzmax) / 2);
break;
case 'bottom':
widget.setTopZ(wzmax + zdelta);
break;
}
} else {
widget.setTopZ(0);
}
});
}

View file

@ -147,6 +147,7 @@
y: 0,
z: 0
},
top: 0, // z top
mirror: false
},
this.stats = {
@ -391,13 +392,16 @@
PRO.setTopZ = function(z) {
let mesh = this.mesh,
pos = this.track.pos,
ltz = this.last_top_z || {};
ltz = this.last_top_z || {},
mbz = mesh.getBoundingBox().max.z;
if (z) {
pos.z = mesh.getBoundingBox().max.z - z;
pos.z = mbz - z;
mesh.position.z = -pos.z - 0.01;
this.track.top = z;
} else {
pos.z = 0;
mesh.position.z = 0;
this.track.top = mbz;
}
let ntz = {
pz: pos.z,

View file

@ -3,7 +3,7 @@
let terms = {
COPYRIGHT: "Copyright (C) Stewart Allen <sa@grid.space> - All Rights Reserved",
LICENSE: "See the license.md file included with the source distribution",
VERSION: "2.5.D6"
VERSION: "2.5.D7"
};
if (typeof(module) === 'object') {

View file

@ -704,7 +704,8 @@
const { stock, bounds, process } = API.conf.get();
const { camTabsWidth, camTabsHeight, camTabsDepth } = process;
const sz = stock.z || bounds.max.z;
const zp = sz - track.box.d + process.camZBottom - process.camZTopOffset + camTabsHeight / 2;
const zto = sz - iw.track.top;
const zp = sz - track.box.d + process.camZBottom - zto + camTabsHeight / 2;
ic.x += n.x * camTabsDepth / 2; // offset from part
ic.z -= n.y * camTabsDepth / 2; // offset swap z,y
ic.y = zp; // offset swap in world space y,z

View file

@ -58,7 +58,7 @@
points = 0,
stock = settings.stock,
hasStock = spro.camStockOn && stock.x && stock.y && stock.z,
ztOff = hasStock ? spro.camZTopOffset : 0,
ztOff = hasStock ? stock.z - widget.track.top : 0,
bounds = widget.getBoundingBox(),
zmax = hasStock ? stock.z : bounds.max.z,
runbox = {

View file

@ -58,12 +58,14 @@
let facing = POLY.offset(inset, -(roughToolDiam * op.step), { count: 999, flat: true });
let zdiv = ztOff / roughDown;
let zstep = (zdiv % 1 > 0) ? ztOff / (Math.floor(zdiv) + 1) : roughDown;
if (roughTop && ztOff === 0) {
if (ztOff === 0) {
// compensate for lack of z top offset in this scenario
ztOff = zstep;
}
let zsteps = Math.round(ztOff / zstep);
let camFaces = this.camFaces = [];
for (let z = zMax + ztOff - zstep; z >= zMax; z -= zstep) {
let zstart = zMax + ztOff - zstep;
for (let z = zstart; zsteps > 0; zsteps--) {
let slice = shadowTop.slice.clone(false);
slice.z = z;
slice.camMode = PRO.LEVEL;
@ -73,6 +75,7 @@
.addPolys(slice.camLines);
sliceAll.push(slice);
camFaces.push(slice);
z -= zstep;
}
}

View file

@ -63,7 +63,8 @@
alignTop = settings.controller.alignTop,
zclear = (process.camZClearance || 1),
zmax_outer = hasStock ? stock.z + zclear : outerz + zclear,
ztOff = hasStock ? process.camZTopOffset : 0,
wztop = widget.track.top,
ztOff = hasStock ? stock.z - wztop : 0,
bounds = widget.getBoundingBox(),
boundsz = bounds.max.z + ztOff,
zadd = hasStock ? stock.z - boundsz : alignTop ? outerz - boundsz : 0,

View file

@ -34,7 +34,8 @@
zMin = Math.max(bounds.min.z, zBottom),
zMax = bounds.max.z,
zThru = zBottom === 0 ? (proc.camZThru || 0) : 0,
ztOff = hasStock ? proc.camZTopOffset : 0,
wztop = widget.track.top,
ztOff = hasStock ? stock.z - wztop : 0,
minToolDiam = Infinity,
maxToolDiam = -Infinity,
thruHoles,

View file

@ -136,8 +136,6 @@ kiri.lang['en-us'] = {
op_shru_l: "show axes rulers\non major gridlines",
op_sped_s: "show speeds",
op_sped_l: "show speed to color bar\nin preview mode",
op_alig_s: "align top",
op_alig_l: "align parts to the\ntallest part when\nno stock is set",
op_auto_s: "auto layout",
op_auto_l: "automatically layout platform\nwhen new items added",
op_free_s: "free layout",
@ -403,12 +401,14 @@ kiri.lang['en-us'] = {
// OUTPUT CAM
ou_toll_s: "tolerance",
ou_toll_l: "surface precision\nin workspace units\nlower is slower and\nuses more memory\n0 = automatic based\non animate preference",
ou_ztof_s: "z top offset",
ou_ztof_l: "offset from stock surface\nto top face of part\nin workspace units",
ou_zanc_s: "z anchor",
ou_zanc_l: "controls the position of the part\nwhen stock Z exceeds part Z",
ou_ztof_s: "z offset",
ou_ztof_l: "offset z anchor\nin workspace units\nhas no effect when\nanchor is middle",
ou_zbot_s: "z bottom",
ou_zbot_l: "offset from part bottom\nto limit cutting depth\nin workspace units",
ou_zclr_s: "z clearance",
ou_zclr_l: "travel offset from z top\nin workspace units",
ou_zclr_l: "safe travel offset\nfrom top of part\nin workspace units",
ou_ztru_s: "z thru",
ou_ztru_l: "extend cutout pass down\nin workspace units",
ou_conv_s: "conventional",