Skip to content

Commit 48f2cef

Browse files
committed
Merge branch 'develop'
2 parents f390f1c + 484a641 commit 48f2cef

File tree

13 files changed

+193
-182
lines changed

13 files changed

+193
-182
lines changed

simpleExample/index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ const settings = {
99
};
1010

1111
const geometry = new THREE.TorusGeometry(20, 10, 30, 30).clone();
12+
geometry.mergeVertices();
1213

1314
const onProgress = ({ progress: { done, total, action } }) => {
1415
const percentage = `${(done / total * 100).toFixed()}%`
@@ -17,4 +18,4 @@ const onProgress = ({ progress: { done, total, action } }) => {
1718

1819
sliceGeometry(settings, geometry, null, false, onProgress).then(gcode => {
1920
document.body.innerHTML = gcode.replace(/(?:\r\n|\r|\n)/g, '<br />');
20-
});
21+
});

src/settings/default.yml

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,49 +2,49 @@ dimensions:
22
x: 200
33
y: 200
44
z: 200
5-
temperature: 210
6-
bedTemperature: 70
7-
# heatBedTemperature: 20
8-
# heatTemperature: 20
9-
# heatupEnabled: true
10-
travelSpeed: 200.0
11-
layerHeight: 0.15
125
heatedBed: false
136
nozzleDiameter: 0.4
147
filamentThickness: 2.85
8+
temperature: 210
9+
bedTemperature: 70
10+
layerHeight: 0.15
11+
thickness:
12+
top: 1.2
13+
bottom: 1.2
14+
shell: 0.8
1515
retraction:
16-
amount: 3.0
1716
enabled: true
17+
amount: 3.0
1818
speed: 50.0
1919
minDistance: 0.0
20+
travel:
21+
speed: 200.0
2022
support:
23+
enabled: false
2124
acceptanceMargin: 1.5
2225
distanceY: 0.4
23-
enabled: false
2426
gridSize: 6.0
2527
margin: 2.0
2628
plateSize: 4.0
2729
flowRate: 0.8
2830
speed: 40.0
29-
outerLine:
31+
innerShell:
32+
flowRate: 1.0
33+
speed: 50.0
34+
outerShell:
3035
flowRate: 1.0
3136
speed: 40.0
32-
innerLine:
37+
innerInfill:
3338
flowRate: 1.0
34-
speed: 50.0
35-
fill:
39+
speed: 80.0
40+
gridSize: 5.0
41+
outerInfill:
3642
flowRate: 1.0
3743
speed: 50.0
38-
gridSize: 5.0
3944
brim:
45+
offset: 4.0
4046
flowRate: 1.0
4147
speed: 40.0
42-
offset: 4.0
43-
top:
44-
thickness: 1.2
45-
bottom:
48+
firstLayer:
4649
flowRate: 1.2
4750
speed: 40.0
48-
thickness: 0.4
49-
shell:
50-
thickness: 0.4

src/sliceActions/applyPrecision.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@ import { PRECISION } from '../constants.js'
22

33
export default function applyPrecision(shapes) {
44
for (let i = 0; i < shapes.length; i ++) {
5-
const { closedShapes, openShapes } = shapes[i];
5+
const { fillShapes, lineShapesOpen, lineShapesClosed } = shapes[i];
66

7-
scaleUpShape(closedShapes);
8-
scaleUpShape(openShapes);
7+
scaleUpShape(fillShapes);
8+
scaleUpShape(lineShapesOpen);
9+
scaleUpShape(lineShapesClosed);
910
}
1011
}
1112

src/sliceActions/generateInfills.js

Lines changed: 29 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,21 @@ import Shape from 'clipper-js';
55
export default function generateInfills(slices, settings) {
66
let {
77
layerHeight,
8-
fill: { gridSize: fillGridSize },
9-
bottom: { thickness: bottomThickness },
10-
top: { thickness: topThickness },
8+
innerInfill: { gridSize: infillGridSize },
9+
thickness: {
10+
top: topThickness,
11+
bottom: bottomThickness
12+
},
1113
nozzleDiameter
1214
} = settings;
1315

14-
fillGridSize /= PRECISION;
16+
infillGridSize /= PRECISION;
1517
nozzleDiameter /= PRECISION;
1618

1719
const bottomSkinCount = Math.ceil(bottomThickness/layerHeight);
1820
const topSkinCount = Math.ceil(topThickness/layerHeight);
1921
const nozzleRadius = nozzleDiameter / 2;
20-
const hightemplateSize = Math.sqrt(2 * Math.pow(nozzleDiameter, 2));
22+
const outerFillTemplateSize = Math.sqrt(2 * Math.pow(nozzleDiameter, 2));
2123

2224
for (let layer = 0; layer < slices.length; layer ++) {
2325
const slice = slices[layer];
@@ -32,39 +34,35 @@ export default function generateInfills(slices, settings) {
3234
for (let i = 0; i < slice.parts.length; i ++) {
3335
const part = slice.parts[i];
3436

35-
if (!part.shape.closed) {
36-
continue;
37-
}
37+
if (!part.closed) continue;
3838

39-
const outerLine = part.outerLine;
39+
const innerShell = part.shell[part.shell.length - 1];
4040

41-
if (outerLine.paths.length > 0) {
42-
const inset = (part.innerLines.length > 0) ? part.innerLines[part.innerLines.length - 1] : outerLine;
41+
if (innerShell.paths.length === 0) continue;
4342

44-
const fillArea = inset.offset(-nozzleRadius);
45-
let lowFillArea;
46-
let highFillArea;
47-
if (surroundingLayer) {
48-
highFillArea = fillArea.difference(surroundingLayer).intersect(fillArea);
49-
lowFillArea = fillArea.difference(highFillArea);
50-
} else {
51-
highFillArea = fillArea;
52-
}
43+
const fillArea = innerShell.offset(-nozzleRadius);
44+
let innerFillArea;
45+
let outerFillArea;
46+
if (surroundingLayer) {
47+
outerFillArea = fillArea.difference(surroundingLayer).intersect(fillArea);
48+
innerFillArea = fillArea.difference(outerFillArea);
49+
} else {
50+
outerFillArea = fillArea;
51+
}
5352

54-
if (lowFillArea && lowFillArea.paths.length > 0) {
55-
const bounds = lowFillArea.shapeBounds();
56-
const lowFillTemplate = getFillTemplate(bounds, fillGridSize, true, true);
53+
if (innerFillArea && innerFillArea.paths.length > 0) {
54+
const bounds = innerFillArea.shapeBounds();
55+
const innerFillTemplate = getFillTemplate(bounds, infillGridSize, true, true);
5756

58-
part.fill.join(lowFillTemplate.intersect(lowFillArea));
59-
}
57+
part.innerFill.join(innerFillTemplate.intersect(innerFillArea));
58+
}
6059

61-
if (highFillArea.paths.length > 0) {
62-
const bounds = highFillArea.shapeBounds();
63-
const even = (layer % 2 === 0);
64-
const highFillTemplate = getFillTemplate(bounds, hightemplateSize, even, !even);
60+
if (outerFillArea.paths.length > 0) {
61+
const bounds = outerFillArea.shapeBounds();
62+
const even = (layer % 2 === 0);
63+
const outerFillTemplate = getFillTemplate(bounds, outerFillTemplateSize, even, !even);
6564

66-
part.fill.join(highFillTemplate.intersect(highFillArea));
67-
}
65+
part.outerFill.join(outerFillTemplate.intersect(outerFillArea));
6866
}
6967
}
7068
}

src/sliceActions/generateInnerLines.js

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,34 +12,36 @@ export default function generateInnerLines(slices, settings) {
1212
let {
1313
layerHeight,
1414
nozzleDiameter,
15-
shell: { thickness: shellThickness }
15+
thickness: { shell: shellThickness }
1616
} = settings;
17+
1718
nozzleDiameter /= PRECISION;
1819
shellThickness /= PRECISION;
20+
1921
const nozzleRadius = nozzleDiameter / 2;
20-
const shells = Math.round(shellThickness / nozzleDiameter);
22+
const numShells = Math.round(shellThickness / nozzleDiameter);
2123

2224
for (let layer = 0; layer < slices.length; layer ++) {
2325
const slice = slices[layer];
2426

2527
for (let i = 0; i < slice.parts.length; i ++) {
2628
const part = slice.parts[i];
2729

28-
if (!part.shape.closed) continue;
30+
if (!part.closed) continue;
2931

3032
const outerLine = part.shape.offset(-nozzleRadius, offsetOptions);
3133

3234
if (outerLine.paths.length > 0) {
33-
part.outerLine.join(outerLine);
35+
part.shell.push(outerLine);
3436

3537
// start with 1 because outerLine is the 1st (0) shell
36-
for (let shell = 1; shell < shells; shell += 1) {
37-
const offset = shell * nozzleDiameter;
38+
for (let inset = 1; inset < numShells; inset += 1) {
39+
const offset = inset * nozzleDiameter;
3840

39-
const innerLine = outerLine.offset(-offset, offsetOptions);
41+
const shell = outerLine.offset(-offset, offsetOptions);
4042

41-
if (innerLine.paths.length > 0) {
42-
part.innerLines.push(innerLine);
43+
if (shell.paths.length > 0) {
44+
part.shell.push(shell);
4345
} else {
4446
break;
4547
}

src/sliceActions/generateOutlines.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@ export default function calculateOutlines(slices, settings) {
55
const slice = slices[layer];
66

77
slice.outline = slice.parts.reduce((shape, part) => {
8-
if (part.outerLine) shape.join(part.outerLine);
8+
if (part.closed) {
9+
const [outerLine] = part.shell;
10+
shape.join(outerLine);
11+
}
912
return shape;
1013
}, new Shape([], true));
1114
}

src/sliceActions/helpers/GCode.js

Lines changed: 16 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,15 @@ const POSITION_Y = 'Y';
1010
const POSITION_Z = 'Z';
1111

1212
export default class {
13-
constructor(settings) {
13+
constructor(nozzleToFilamentRatio) {
14+
this._nozzleToFilamentRatio = nozzleToFilamentRatio;
15+
1416
this._gcode = '';
1517
this._currentValues = {};
16-
this._settings = settings;
1718
this._nozzlePosition = new THREE.Vector2(0, 0);
1819
this._extruder = 0.0;
1920
this._isRetracted = false;
2021
this._isFanOn = false;
21-
22-
this.bottom = true;
2322
}
2423

2524
_addGCode(command) {
@@ -62,14 +61,8 @@ export default class {
6261
return this;
6362
}
6463

65-
moveTo(x, y, layer) {
66-
const {
67-
layerHeight,
68-
travelSpeed
69-
} = this._settings;
70-
71-
const z = layer * layerHeight + 0.2;
72-
const speed = travelSpeed * 60;
64+
moveTo(x, y, z, { speed }) {
65+
speed *= 60;
7366

7467
this._addGCode({
7568
[MOVE]: 0,
@@ -84,30 +77,13 @@ export default class {
8477
return this;
8578
}
8679

87-
lineTo(x, y, layer, type) {
80+
lineTo(x, y, z, { speed, flowRate }) {
8881
const newNozzlePosition = new THREE.Vector2(x, y);
8982

90-
const {
91-
layerHeight,
92-
nozzleDiameter,
93-
filamentThickness,
94-
travelSpeed
95-
} = this._settings;
96-
97-
const profile = this._settings[(this.bottom ? 'bottom' : type)];
98-
99-
let {
100-
speed,
101-
flowRate
102-
} = profile;
103-
10483
speed *= 60;
105-
const z = layer * layerHeight + 0.2;
10684

10785
const lineLength = this._nozzlePosition.distanceTo(newNozzlePosition);
108-
109-
const filamentSurfaceArea = Math.pow((filamentThickness / 2), 2) * Math.PI;
110-
this._extruder += lineLength * ((nozzleDiameter * layerHeight) / filamentSurfaceArea) * flowRate;
86+
this._extruder += this._nozzleToFilamentRatio * lineLength * flowRate;
11187

11288
this._addGCode({
11389
[MOVE]: 1,
@@ -123,21 +99,13 @@ export default class {
12399
return this;
124100
}
125101

126-
unRetract() {
127-
const {
128-
retraction: {
129-
enabled: retractionEnabled,
130-
minDistance: retractionMinDistance,
131-
speed: retractionSpeed
132-
}
133-
} = this._settings;
134-
135-
if (this._isRetracted && retractionEnabled) {
102+
unRetract({ enabled, speed, minDistance }) {
103+
if (this._isRetracted && enabled) {
136104
this._isRetracted = false;
137105

138-
const speed = retractionSpeed * 60;
106+
speed *= 60;
139107

140-
if (this._extruder > retractionMinDistance) {
108+
if (this._extruder > minDistance) {
141109
this._addGCode({
142110
[MOVE]: 0,
143111
[EXTRUDER]: this._extruder.toFixed(3),
@@ -149,25 +117,16 @@ export default class {
149117
return this;
150118
}
151119

152-
retract() {
153-
const {
154-
retraction: {
155-
amount: retractionAmount,
156-
enabled: retractionEnabled,
157-
minDistance: retractionMinDistance,
158-
speed: retractionSpeed
159-
}
160-
} = this._settings;
161-
162-
if (!this._isRetracted && retractionEnabled) {
120+
retract({ enabled, speed, minDistance, amount }) {
121+
if (!this._isRetracted && enabled) {
163122
this._isRetracted = true;
164123

165-
const speed = retractionSpeed * 60;
124+
speed *= 60;
166125

167-
if (this._extruder > retractionMinDistance) {
126+
if (this._extruder > minDistance) {
168127
this._addGCode({
169128
[MOVE]: 0,
170-
[EXTRUDER]: (this._extruder - retractionAmount).toFixed(3),
129+
[EXTRUDER]: (this._extruder - amount).toFixed(3),
171130
[SPEED]: speed.toFixed(3)
172131
});
173132
}

src/sliceActions/helpers/Slice.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@ export default class {
44
constructor() {
55
this.parts = [];
66
}
7-
add(shape) {
8-
const part = { shape };
7+
add(shape, closed) {
8+
const part = { shape, closed };
99

10-
if (shape.closed) {
11-
part.innerLines = [];
12-
part.outerLine = new Shape([], true);
13-
part.fill = new Shape([], false);
10+
if (closed) {
11+
part.shell = [];
12+
part.innerFill = new Shape([], false);
13+
part.outerFill = new Shape([], false);
1414
}
1515

1616
this.parts.push(part);

0 commit comments

Comments
 (0)