summit/frontend/node_modules/three-stdlib/loaders/GCodeLoader.cjs.map

1 line
9.6 KiB
Plaintext
Raw Normal View History

2025-12-08 16:31:30 +00:00
{"version":3,"file":"GCodeLoader.cjs","sources":["../../src/loaders/GCodeLoader.js"],"sourcesContent":["import {\n BufferGeometry,\n Euler,\n FileLoader,\n Float32BufferAttribute,\n Group,\n LineBasicMaterial,\n LineSegments,\n Loader,\n} from 'three'\n\n/**\n * GCodeLoader is used to load gcode files usually used for 3D printing or CNC applications.\n *\n * Gcode files are composed by commands used by machines to create objects.\n *\n * @class GCodeLoader\n * @param {Manager} manager Loading manager.\n */\n\nclass GCodeLoader extends Loader {\n constructor(manager) {\n super(manager)\n\n this.splitLayer = false\n }\n\n load(url, onLoad, onProgress, onError) {\n const scope = this\n\n const loader = new FileLoader(scope.manager)\n loader.setPath(scope.path)\n loader.setRequestHeader(scope.requestHeader)\n loader.setWithCredentials(scope.withCredentials)\n loader.load(\n url,\n function (text) {\n try {\n onLoad(scope.parse(text))\n } catch (e) {\n if (onError) {\n onError(e)\n } else {\n console.error(e)\n }\n\n scope.manager.itemError(url)\n }\n },\n onProgress,\n onError,\n )\n }\n\n parse(data) {\n let state = { x: 0, y: 0, z: 0, e: 0, f: 0, extruding: false, relative: false }\n let layers = []\n\n let currentLayer = undefined\n\n const pathMaterial = new LineBasicMaterial({ color: 0xff0000 })\n pathMaterial.name = 'path'\n\n const extrudingMaterial = new LineBasicMaterial({ color: 0x00ff00 })\n extrudingMaterial.name = 'extruded'\n\n function newLayer(line) {\n currentLayer = { vertex: [], pathVertex: [], z: line.z }\n layers.push(currentLayer)\n }\n\n //Create lie segment between p1 and p2\n function addSegment(p1, p2) {\n if (currentLayer === undefined) {\n newLayer(p1)\n }\n\n if (state.extruding) {\n currentLayer.vertex.push(p1.x, p1.y, p1.z)\n currentLayer.vertex.push(p2.x, p2.y, p2.z)\n } else {\n currentLayer.pathVertex.push(p1.x, p1.y, p1.z)\n currentLayer.pathVertex.push(p2.x, p2.y, p2.z)\n }\n }\n\n function delta(v1, v2) {\n return state.relative ? v2 : v2 - v1\n }\n\n function absolute(v1, v2) {\n return state.relative ? v1 + v2 : v2\n }\n\n let lines = data.replace(/;.+/g, '').split('\\n')\n\n for (let i = 0; i < lines.length; i++) {\n let tokens = lines[i].split(' ')\n let cmd = tokens[0].toUpperCase()\n\n //Argumments\n let args = {}\n tokens.splice(1).forEach(function (token) {\n if (token[0] !== undefined) {\n let key = token[0].toLowerCase()\n let value = parseFloat(token.substring(1))\n args[key] = value\n }\n })\n\n //Process commands\n //G0/G1 Linear Movement\n if (cmd === 'G0' || cmd === 'G1') {\n let line = {\n x: args.x !== undefined ? absolute(state.x, args.x) : state.x,\n y: args.y !== undefined ? absolute(state.y, args.y) : state.y,\n z: args.z !== undefined ? absolute(state.z, args.z) : state.z,\n e: args.e !== undefined ? absolute(state.e, args.e) : state.e,\n f: args.f !== undefined ? absolute(state.f, args.f) : state.f,\n }\n\n //Layer change detection is or made by watching Z, it's made by watching when we extrude at a new Z position\n if (delta(state.e, line.e) > 0) {\n line.extruding = delta(state.e, line.e) > 0\n\n if (currentLayer == undefined || line.z != currentLayer.z) {\n newLayer(line)\n }\n }\n\n addSegment(state, line)\n state = line\n } else if (cmd === 'G2' || cmd === 'G3') {\n //G2/G3 - Arc Movement ( G2 clock wise and G3 counter clock wise )\n //console.warn( 'THREE.GCodeLoader: Arc command not supported' );\n } else if (cmd === 'G90') {\n //G90: Set to Absolute Positioning\n state.relative = false\n } else if (cmd === 'G91') {\