a DSL to do numerical control for CNC machines

gwen 3690b6ed6f spooling 3 سال پیش
examples bafa44dae8 initial stuff 4 سال پیش
.gitignore 9eec99b9d9 gitignore 4 سال پیش
LICENSE d4fe8a89a8 Initial commit 4 سال پیش
README.md 3690b6ed6f spooling 3 سال پیش
cylinder.jsnc f6566e0fb0 lots of stuff 4 سال پیش
gcode.json bafa44dae8 initial stuff 4 سال پیش
index.html bafa44dae8 initial stuff 4 سال پیش
index.js 26c7ee709e delete the old code when we emit 4 سال پیش
jsconfig.json 89aa3c3e31 a bunch of stuff but mostly adding letters 4 سال پیش
stdPaths.jsnc 33b9cf456a added newline, tweaked spacing 4 سال پیش

README.md

JSNC (javascript numerical control)

JSNC is a small DSL and library for generating gcode for CNC machines. It allows you to use all the power of a scripting language to create otherwise difficult toolpaths. It is inspired in part by OpenSCAD.

Features

  • all of javascript! JSNC is basically just a handful of preprocess steps that convert your jsnc code into vanila javascript which gets (gasp) eval'd. So any neato feature in JS is yours for the taking
  • A small (but growing) standard library of shapes/paths and functions.
  • It's own font! I've designed a font so you can write your heart out. Currently only supports A-Z period space and newlines.
  • Emiting gcode is super clean. any time a gcode is hit in the flow of your program it's pushed onto the stack of gcodes to be emitted into the final output
  • auto-cleans excessive G90 and G91 codes
    • these codes are used to switch between absolute and relative mode
    • When one is found it is checked against the last known state so that extra calls aren't emitted into the final gcode

"Instalation"

For the moment the "installation" is just cloning the repo and running an http server in the folder.

Code Sample

Here is a snippet that generates a Lorentz Attractor. goodluck modeling THAT in autocad :P

let x = 0.01;
let y = 0.01;
let z = 0.01;

let o = 10;
let p = 28;
let B = 8 / 3;
let dt = 0.001;
let scale = 2;

G21
G90
G0 Z0 F1300

for (let i = 0; i < 100000; i++) {
  const dx = o * (y - x);
  const dy = x * (p - z) - y;
  const dz = x * y - B * z;

  x += dx * dt;
  y += dy * dt;
  z += dz * dt;

  G0 X${trnc(x)*scale} Y${trnc(y)*scale}
}

function trnc(v){
  return Math.round(v*1000)/1000
}

G0 Z1
M5