refactor cam stock visualization
This commit is contained in:
parent
ba13531297
commit
8a1118d6c1
12 changed files with 253 additions and 189 deletions
|
|
@ -9,16 +9,35 @@
|
|||
CAM = KIRI.driver.CAM,
|
||||
PRO = CAM.process,
|
||||
newPolygon = BASE.newPolygon,
|
||||
newPoint = BASE.newPoint;
|
||||
newPoint = BASE.newPoint,
|
||||
isArrange,
|
||||
isCamMode,
|
||||
camStock,
|
||||
API, SPACE, MODES, VIEWS, UI, UC;
|
||||
|
||||
CAM.init = function(kiri, api) {
|
||||
// console.log({kiri,api})
|
||||
SPACE = api.const.SPACE;
|
||||
MODES = api.const.MODES;
|
||||
VIEWS = api.const.VIEWS;
|
||||
UI = api.ui;
|
||||
UC = api.uc;
|
||||
API = api;
|
||||
|
||||
api.event.on("mode.set", (mode) => {
|
||||
const isCAM = mode === 'CAM';
|
||||
$('set-tools').style.display = isCAM ? '' : 'none';
|
||||
kiri.space.platform.setColor(isCAM ? 0xeeeeee : 0xcccccc);
|
||||
isCamMode = mode === 'CAM';
|
||||
$('set-tools').style.display = isCamMode ? '' : 'none';
|
||||
kiri.space.platform.setColor(isCamMode ? 0xeeeeee : 0xcccccc);
|
||||
updateStock(undefined, 'internal');
|
||||
});
|
||||
|
||||
api.event.on("view.set", (mode) => {
|
||||
isArrange = (mode === VIEWS.ARRANGE);
|
||||
});
|
||||
|
||||
api.event.on("settings.saved", (settings) => {
|
||||
const proc = settings.process;
|
||||
// show/hide dots in enabled process pop buttons
|
||||
api.ui.camTabs.marker.style.display = proc.camTabsOn ? 'flex' : 'none';
|
||||
api.ui.camRough.marker.style.display = proc.camRoughOn ? 'flex' : 'none';
|
||||
api.ui.camDrill.marker.style.display =
|
||||
|
|
@ -26,32 +45,142 @@
|
|||
api.ui.camOutline.marker.style.display = proc.camOutlineOn ? 'flex' : 'none';
|
||||
api.ui.camContour.marker.style.display =
|
||||
proc.camContourXOn || proc.camContourYOn ? 'flex' : 'none';
|
||||
updateStock(settings, 'settings.saved.internal');
|
||||
});
|
||||
|
||||
function updateStock() {
|
||||
const STACKS = api.const.STACKS;
|
||||
const SPACE = api.const.SPACE;
|
||||
const stock = api.conf.get().stock;
|
||||
const {x, y, z} = stock;
|
||||
if (x && y && z) {
|
||||
const render = new KIRI.Render().setLayer('bounds', { face: 0xaaaaaa, line: 0xaaaaaa }, true);
|
||||
const stack = STACKS.create('bounds', SPACE.platform.world);
|
||||
stack.add(render.addPolys([
|
||||
newPolygon().centerRectangle({x:0, y:0, z:0}, x, y),
|
||||
newPolygon().centerRectangle({x:0, y:0, z}, x, y)
|
||||
], { thin: true } ));
|
||||
const hx = x/2, hy = y/2;
|
||||
stack.add(render.addLines([
|
||||
newPoint( hx, -hy, 0), newPoint( hx, -hy, stock.z),
|
||||
newPoint( hx, hy, 0), newPoint( hx, hy, stock.z),
|
||||
newPoint(-hx, -hy, 0), newPoint(-hx, -hy, stock.z),
|
||||
newPoint(-hx, hy, 0), newPoint(-hx, hy, stock.z),
|
||||
], { thin: true }));
|
||||
}
|
||||
}
|
||||
|
||||
api.event.on("slice.end", updateStock);
|
||||
api.event.on("preview.end", updateStock);
|
||||
api.event.on([
|
||||
"init-done",
|
||||
// update stock when modes change?
|
||||
"slice.end",
|
||||
"preview.end",
|
||||
// update stock when preferences change
|
||||
// "boolean.click",
|
||||
"boolean.update",
|
||||
// update stock when objects move
|
||||
"platform.layout",
|
||||
"selection.drag",
|
||||
"selection.move",
|
||||
// force bounds update, too
|
||||
"selection.scale",
|
||||
"selection.rotate"
|
||||
], updateStock);
|
||||
};
|
||||
|
||||
function updateStock(args, event) {
|
||||
const SPACE = API.const.SPACE;
|
||||
|
||||
if (!isCamMode) {
|
||||
if (camStock) {
|
||||
SPACE.platform.remove(camStock);
|
||||
camStock = null;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
const STACKS = API.const.STACKS;
|
||||
const refresh = (event === "selection.scale" || event === 'selection.rotate');
|
||||
|
||||
let settings = API.conf.get();
|
||||
let widgets = API.widgets.all();
|
||||
let proc = settings.process;
|
||||
let enabled = UI.camStockOn.checked;
|
||||
let offset = UI.camStockOffset.checked;
|
||||
let stockSet = offset || (proc.camStockX && proc.camStockY && proc.camStockZ > 0);
|
||||
let scale = API.view.unit_scale();
|
||||
let topZ = API.platform.top_z();
|
||||
let delta = 0;
|
||||
let csox = 0;
|
||||
let csoy = 0;
|
||||
let stock = settings.stock = { };
|
||||
|
||||
// create/inject cam stock if stock size other than default
|
||||
if (enabled && stockSet && widgets.length) {
|
||||
// UI.stock.style.display = offset ? 'inline-block' : 'none';
|
||||
let csx = proc.camStockX * scale;
|
||||
let csy = proc.camStockY * scale;
|
||||
let csz = proc.camStockZ * scale;
|
||||
if (offset) {
|
||||
let min = { x: Infinity, y: Infinity, z: 0 };
|
||||
let max = { x: -Infinity, y: -Infinity, z: -Infinity };
|
||||
widgets.forEach(function(widget) {
|
||||
let wbnd = widget.getBoundingBox(refresh);
|
||||
let wpos = widget.track.pos;
|
||||
min = {
|
||||
x: Math.min(min.x, wpos.x + wbnd.min.x),
|
||||
y: Math.min(min.y, wpos.y + wbnd.min.y),
|
||||
z: 0
|
||||
};
|
||||
max = {
|
||||
x: Math.max(max.x, wpos.x + wbnd.max.x),
|
||||
y: Math.max(max.y, wpos.y + wbnd.max.y),
|
||||
z: Math.max(max.z, wbnd.max.z)
|
||||
};
|
||||
});
|
||||
csx += max.x - min.x;
|
||||
csy += max.y - min.y;
|
||||
csz += max.z - min.z;
|
||||
csox = min.x + ((max.x - min.x) / 2);
|
||||
csoy = min.y + ((max.y - min.y) / 2);
|
||||
}
|
||||
if (!camStock) {
|
||||
let geo = new THREE.BoxGeometry(1, 1, 1);
|
||||
let mat = new THREE.MeshBasicMaterial({
|
||||
color: 0x777777,
|
||||
opacity: 0.2,
|
||||
transparent: true,
|
||||
side:THREE.DoubleSide
|
||||
});
|
||||
camStock = new THREE.Mesh(geo, mat);
|
||||
camStock.renderOrder = 2;
|
||||
SPACE.platform.add(camStock);
|
||||
}
|
||||
stock = settings.stock = {
|
||||
x: csx,
|
||||
y: csy,
|
||||
z: csz,
|
||||
center: {
|
||||
x: csox,
|
||||
y: csoy,
|
||||
z: csz / 2
|
||||
}
|
||||
};
|
||||
camStock.scale.x = csx + 0.005;
|
||||
camStock.scale.y = csy + 0.005;
|
||||
camStock.scale.z = csz + 0.005;
|
||||
camStock.position.x = csox;
|
||||
camStock.position.y = csoy;
|
||||
camStock.position.z = csz / 2;
|
||||
delta = csz - topZ;
|
||||
} else if (camStock) {
|
||||
SPACE.platform.remove(camStock);
|
||||
camStock = null;
|
||||
delta = 0;
|
||||
}
|
||||
|
||||
if (isArrange) {
|
||||
STACKS.clear();
|
||||
}
|
||||
|
||||
const {x, y, z} = stock;
|
||||
if (x && y && z) {
|
||||
const render = new KIRI.Render().setLayer('bounds', { face: 0xaaaaaa, line: 0xaaaaaa });
|
||||
const stack = STACKS.create('bounds', SPACE.platform.world);
|
||||
stack.add(render.addPolys([
|
||||
newPolygon().centerRectangle({x:csox, y:csoy, z:0}, x, y),
|
||||
newPolygon().centerRectangle({x:csox, y:csoy, z}, x, y)
|
||||
], { thin: true } ));
|
||||
const hx = x/2, hy = y/2;
|
||||
stack.add(render.addLines([
|
||||
newPoint(csox + hx, csoy - hy, 0), newPoint(csox + hx, csoy - hy, stock.z),
|
||||
newPoint(csox + hx, csoy + hy, 0), newPoint(csox + hx, csoy + hy, stock.z),
|
||||
newPoint(csox - hx, csoy - hy, 0), newPoint(csox - hx, csoy - hy, stock.z),
|
||||
newPoint(csox - hx, csoy + hy, 0), newPoint(csox - hx, csoy + hy, stock.z),
|
||||
], { thin: true }));
|
||||
}
|
||||
|
||||
API.platform.update_top_z(delta);
|
||||
API.platform.update_origin();
|
||||
SPACE.update();
|
||||
}
|
||||
|
||||
})();
|
||||
|
|
|
|||
|
|
@ -55,14 +55,14 @@
|
|||
outer = settings.bounds,
|
||||
outerz = outer.max.z,
|
||||
slices = widget.slices,
|
||||
bounds = widget.getCamBounds(settings),
|
||||
boundsz = bounds.max.z,
|
||||
hasStock = process.camStockOffset || (process.camStockZ && process.camStockX && process.camStockY),
|
||||
hasStock = stock.x && stock.y && stock.z && process.camStockOn,
|
||||
startCenter = process.outputOriginCenter,
|
||||
alignTop = settings.controller.alignTop,
|
||||
zclear = (process.camZClearance || 1),
|
||||
zmax_outer = hasStock ? stock.z + zclear : outerz + zclear,
|
||||
ztOff = process.camZTopOffset,
|
||||
ztOff = hasStock ? process.camZTopOffset : 0,
|
||||
bounds = widget.getBoundingBox(),
|
||||
boundsz = bounds.max.z + ztOff,
|
||||
zadd = hasStock ? stock.z - boundsz : alignTop ? outerz - boundsz : 0,
|
||||
zmax = outerz + zclear,
|
||||
wmpos = widget.mesh.position,
|
||||
|
|
@ -247,8 +247,8 @@
|
|||
deltaXY = 0;
|
||||
}
|
||||
} //else (TODO verify no else here b/c above could change isMove)
|
||||
// move over things
|
||||
if ((deltaXY > toolDiam || (deltaZ > toolDiam && deltaXY > tolerance)) && (isMove || absDeltaZ >= tolerance)) {
|
||||
// move over things ... try checking path clearance tests for *every* move
|
||||
if ((deltaXY > toolDiam || (deltaZ > tolerance && deltaXY > tolerance)) && (isMove || absDeltaZ >= tolerance)) {
|
||||
let maxz = getZClearPath(
|
||||
terrain,
|
||||
lastPoint.x,// - wmx,
|
||||
|
|
|
|||
|
|
@ -24,13 +24,15 @@
|
|||
CAM.slice = function(settings, widget, onupdate, ondone) {
|
||||
let conf = settings,
|
||||
proc = conf.process,
|
||||
stock = settings.stock || {},
|
||||
hasStock = stock.x && stock.y && stock.z && proc.camStockOn,
|
||||
sliceAll = widget.slices = [],
|
||||
unitsName = settings.controller.units,
|
||||
roughTool = new CAM.Tool(conf, proc.camRoughTool),
|
||||
roughToolDiam = roughTool.fluteDiameter(),
|
||||
drillTool = new CAM.Tool(conf, proc.camDrillTool),
|
||||
drillToolDiam = drillTool.fluteDiameter(),
|
||||
procFacing = proc.camRoughOn && proc.camZTopOffset,
|
||||
procFacing = proc.camRoughOn && proc.camZTopOffset && hasStock,
|
||||
procRough = proc.camRoughOn && proc.camRoughDown,
|
||||
procOutlineIn = proc.camOutlineIn,
|
||||
procOutlineOn = proc.camOutlineOn,
|
||||
|
|
@ -54,13 +56,12 @@
|
|||
zMin = Math.max(bounds.min.z, zBottom),
|
||||
zMax = bounds.max.z,
|
||||
zThru = zBottom === 0 ? (proc.camZThru || 0) : 0,
|
||||
ztOff = proc.camZTopOffset,
|
||||
ztOff = hasStock ? proc.camZTopOffset : 0,
|
||||
camRoughStock = proc.camRoughStock,
|
||||
camRoughDown = proc.camRoughDown,
|
||||
minStepDown = Math.min(1, roughDown, outlineDown),
|
||||
maxToolDiam = 0,
|
||||
thruHoles,
|
||||
stock = settings.stock || {};
|
||||
thruHoles;
|
||||
|
||||
if (stock.x && stock.y && stock.z) {
|
||||
if (stock.x + 0.00001 < bounds.max.x - bounds.min.x) {
|
||||
|
|
|
|||
Loading…
Reference in a new issue