| | <!DOCTYPE html> |
| | <html lang="en"> |
| | <head> |
| | <meta charset="UTF-8"> |
| | <title>G-code Viewer</title> |
| | <style> |
| | body { |
| | margin: 0; |
| | overflow: hidden; |
| | } |
| | canvas { |
| | display: block; |
| | } |
| | </style> |
| | <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/110/three.min.js"></script> |
| | </head> |
| | <body> |
| | <script> |
| | |
| | const scene = new THREE.Scene(); |
| | const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); |
| | const renderer = new THREE.WebGLRenderer(); |
| | renderer.setSize(window.innerWidth, window.innerHeight); |
| | document.body.appendChild(renderer.domElement); |
| | |
| | |
| | const gridHelper = new THREE.GridHelper(200, 50); |
| | scene.add(gridHelper); |
| | |
| | |
| | function loadGCode(gcode) { |
| | const material = new THREE.LineBasicMaterial({ color: 0x00ff00 }); |
| | const points = []; |
| | const lines = gcode.split("\n"); |
| | |
| | let currentX = 0, currentY = 0, currentZ = 0; |
| | let isRelative = false; |
| | |
| | lines.forEach((line) => { |
| | line = line.trim(); |
| | if (line.startsWith("G90")) { |
| | isRelative = false; |
| | } else if (line.startsWith("G91")) { |
| | isRelative = true; |
| | } |
| | |
| | const matchX = line.match(/X([-+]?\d*\.?\d+)/); |
| | const matchY = line.match(/Y([-+]?\d*\.?\d+)/); |
| | const matchZ = line.match(/Z([-+]?\d*\.?\d+)/); |
| | |
| | let newX = currentX; |
| | let newY = currentY; |
| | let newZ = currentZ; |
| | |
| | if (matchX) { |
| | const deltaX = parseFloat(matchX[1]); |
| | newX = isRelative ? currentX + deltaX : deltaX; |
| | } |
| | if (matchY) { |
| | const deltaY = parseFloat(matchY[1]); |
| | newY = isRelative ? currentY + deltaY : deltaY; |
| | } |
| | if (matchZ) { |
| | const deltaZ = parseFloat(matchZ[1]); |
| | newZ = isRelative ? currentZ + deltaZ : deltaZ; |
| | } |
| | |
| | points.push(new THREE.Vector3(newX, newY, newZ)); |
| | |
| | currentX = newX; |
| | currentY = newY; |
| | currentZ = newZ; |
| | }); |
| | |
| | const geometry = new THREE.BufferGeometry().setFromPoints(points); |
| | const line = new THREE.Line(geometry, material); |
| | scene.add(line); |
| | } |
| | |
| | |
| | camera.position.set(0, 50, 200); |
| | camera.lookAt(0, 0, 0); |
| | |
| | |
| | function animate() { |
| | requestAnimationFrame(animate); |
| | renderer.render(scene, camera); |
| | } |
| | animate(); |
| | |
| | |
| | if (window.gcode) { |
| | loadGCode(window.gcode); |
| | } else { |
| | console.error("No G-code provided"); |
| | } |
| | </script> |
| | </body> |
| | </html> |