grid-apps-cmms/web/boot/index.html
Stewart Allen e0b1c4e31f CAM routing refactor, area operation, and taper ball tool implementation
Major routing improvements:
- Refactor depth-first routing algorithm for better path optimization
- Reimplemented outline, roughing, pocket, and trace as area operation wrappers
- Add pocket shadow travel routing with optimized descent using travel bounds
- Improve contour routing with arc detection and polyEmit arc strategy
- Add area smoothing and ease-down options
- Fix outline handling with thru holes and surface reversal on tip2tip
- Move widget shadow methods into widget class for faster hole detection
- Better camInnerFirst support and proper feed/plunge defaults

Tool system improvements:
- Implement taper ball tool type with full support
- Add renderTool2() for profile-based visualization
- Convert tool menu to init code with bound vars
- Fix auto tool and auto spindle for prep operations
- Update tool profile generation for taperball geometry
- Add calcTaperBallExtent() for proper ball tangency calculations

Code cleanup:
- Remove duplicated slicer code from specialized slicers
- Asyncify shadowAt operations
- Deprecate pocket engrave operation
- Simplify upNover implementation
- Fix animation with new tool+settings requirements
2025-12-06 00:09:17 -05:00

68 lines
No EOL
2 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Kiri:Moto (loading)</title>
<style>
body {
top: 0;
left: 0;
right: 0;
bottom: 0;
display: flex;
position: fixed;
align-items: center;
flex-direction: column;
justify-content: center;
font-family: sans-serif;
font-weight: bold;
}
</style>
<script type="module">
import { version } from '/lib/moto/license.js';
(async () => {
const reg = await navigator.serviceWorker.register('/boot/service.js', { scope: '/' });
await reg.update();
await navigator.serviceWorker.ready;
if (!navigator.serviceWorker.controller) {
console.log('No controller → reloading under SW control');
location.reload();
return;
}
// turn url params into key/value map
const map = Object.fromEntries(
(location.search || location.hash).slice(1).split('&')
.map(v => v.split('='))
.map(([k, v = true]) => [k, v])
);
if (map.debug) {
console.log({ map });
}
navigator.serviceWorker.controller.postMessage({
mode: map.mode,
clear: map.clear,
disable: map.disable,
version: map.version || version
});
navigator.serviceWorker.addEventListener('message', e => {
console.log('[SM]', e.data);
setTimeout(() => {
if (map.mesh) {
location.replace('/mesh/index.html');
} else {
location.replace('/kiri/index.html');
}
}, map.delay || 10);
});
})();
</script>
</head>
<body>Booting Grid.Space</body>
</html>