-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathtext2gcode.js
More file actions
executable file
·82 lines (64 loc) · 1.99 KB
/
Copy pathtext2gcode.js
File metadata and controls
executable file
·82 lines (64 loc) · 1.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#!/usr/bin/env node
var opentype = require('opentype.js');
var argv = require('yargs')
.usage('$0 --font=/path/to/text.ttf --diameter=2.5 --depth=-5 "hello world"')
.demand('font')
.describe('font', '/path/to/font.ttf')
.demand('depth')
.describe('depth', 'total depth to go (may be negative)')
.demand('diameter')
.describe('diameter', 'cutting tool diameter')
.describe('fs', 'size of the font in world units (mm/in)')
.default('fs', 20)
.describe('pass', 'total depth taken off per layer (depth per pass)')
.describe('rotate', 'rotate by % TAU (i.e. --rotate=.25 means 90 degrees)')
.default('rotate', 0)
.describe('mirror', 'mirror on the x axis')
.default('mirror', false)
.default('pass', .1)
.default('x', 0)
.describe('x', 'translate on the x')
.default('y', 0)
.describe('y', 'translate on the y')
.argv;
var gcanvas = require('gcanvas');
var text = argv._[0];
var fontFile = argv.font;
var size = text
var ctx = new (require('gcanvas'));
var fontsize = argv.fs || 30;
var TAU = Math.PI*2;
var defined = function(a) {
return typeof a !== 'undefined';
}
opentype.load(argv.font, function(err, font) {
if (err) {
throw err;
}
ctx.depth = argv.depth || -5;
ctx.depthOfCut = argv.pass || .1;
ctx.scale(argv.mirror ? 1 : -1, 1)
ctx.toolDiameter = argv.diameter || 1.6;
var width = 0;
font.forEachGlyph(text + ' ', 0, 0, fontsize, null, function(glyph, x, y) {
width = x;
});
var x = defined(argv.x) ? argv.x : 0;
var y = defined(argv.y) ? argv.y : 0;
ctx.translate((argv.mirror ? 0 : -width) + x, fontsize + y);
var path = font.getPath(text, 0, 0, fontsize, null);
argv.rotate && ctx.rotate(TAU * parseFloat(argv.rotate))
// Stroke and fill are buggy, use at your own risk!
if (argv.stroke) {
path.lineWidth = parseInt(argv.stroke);
path.stroke = 'black'
} else {
path.stroke = null;
}
if (!defined(argv.fill) || argv.fill) {
path.fill = 'black';
} else {
path.fill = null;
}
path.draw(ctx);
});