a DSL to do numerical control for CNC machines

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

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