Skip to content

Commit 6afa4e3

Browse files
authored
Merge pull request #161 from remcoder/feature/line-heigth
Layer height
2 parents 88c7c17 + bc5982d commit 6afa4e3

4 files changed

Lines changed: 40 additions & 13 deletions

File tree

demo/js/demo.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,8 @@ function initDemo() {
158158
canvas: canvasElement,
159159
buildVolume: settings?.buildVolume || { x: 190, y: 210, z: 0 },
160160
initialCameraPosition: [180, 150, 300],
161-
backgroundColor: initialBackgroundColor
161+
backgroundColor: initialBackgroundColor,
162+
lineHeight: 0.3
162163
}));
163164

164165
backgroundColor.value = initialBackgroundColor;

src/__tests__/gcode-parser.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,25 @@ test('2 extrusion moves with a z diff exactly at the threshold should result in
121121
expect(parsed.layers[0].commands.length).toEqual(2);
122122
});
123123

124+
test('Layers should have calculated heights', () => {
125+
const threshold = 0.05;
126+
const parser = new Parser(threshold);
127+
const gcode = `G0 X0 Y0 Z0.1 E1
128+
G1 X10 Y10 Z0.2 E2
129+
G1 X20 Y20 Z0.3 E3
130+
G1 X30 Y30 Z0.5 E4
131+
G1 X40 Y40 Z0.8 E5
132+
`;
133+
const parsed = parser.parseGCode(gcode);
134+
expect(parsed).not.toBeNull();
135+
expect(parsed.layers).not.toBeNull();
136+
expect(parsed.layers.length).toEqual(5);
137+
expect(parsed.layers[0].height).toEqual(expect.closeTo(0.1, 3));
138+
expect(parsed.layers[1].height).toEqual(expect.closeTo(0.1, 3));
139+
expect(parsed.layers[2].height).toEqual(expect.closeTo(0.1, 3));
140+
expect(parsed.layers[3].height).toEqual(expect.closeTo(0.2, 3));
141+
});
142+
124143
test('T0 command should result in a tool change to tool with index 0', () => {
125144
const parser = new Parser(0);
126145
const gcode = `G1 X0 Y0 Z1 E1

src/gcode-parser.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,8 @@ export class Layer {
9797
constructor(
9898
public layer: number,
9999
public commands: GCodeCommand[],
100-
public lineNumber: number
100+
public lineNumber: number,
101+
public height: number = 0
101102
) {}
102103
}
103104

@@ -106,7 +107,7 @@ export class Parser {
106107
preamble = new Layer(-1, [], 0); // TODO: remove preamble and treat as a regular layer? Unsure of the benefit
107108
layers: Layer[] = [];
108109
curZ = 0;
109-
maxZ = -Infinity; // cannot start at 0 because of tolerance. first layer will always be created
110+
maxZ = 0; // cannot start at 0 because of tolerance. first layer will always be created
110111
metadata: Metadata = { thumbnails: {} };
111112
tolerance = 0; // The higher the tolerance, the fewer layers are created, so performance will improve.
112113

@@ -232,10 +233,11 @@ export class Parser {
232233
if (
233234
(params.e ?? 0) > 0 && // extruding?
234235
(params.x != undefined || params.y != undefined) && // moving?
235-
Math.abs(this.curZ - this.maxZ) > this.tolerance // new layer?
236+
Math.abs(this.curZ - (this.maxZ || -Infinity)) > this.tolerance // new layer?
236237
) {
238+
const layerHeight = Math.abs(this.curZ - this.maxZ);
237239
this.maxZ = this.curZ;
238-
this.layers.push(new Layer(this.layers.length, [], lineNumber));
240+
this.layers.push(new Layer(this.layers.length, [], lineNumber, layerHeight));
239241
}
240242
}
241243

src/webgl-preview.ts

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import {
2929

3030
import { ExtrusionGeometry } from './extrusion-geometry';
3131

32-
type RenderLayer = { extrusion: number[]; travel: number[]; z: number };
32+
type RenderLayer = { extrusion: number[]; travel: number[]; z: number; height: number };
3333
type GVector3 = {
3434
x: number;
3535
y: number;
@@ -61,6 +61,7 @@ export type GCodePreviewOptions = {
6161
initialCameraPosition?: number[];
6262
lastSegmentColor?: ColorRepresentation;
6363
lineWidth?: number;
64+
lineHeight?: number;
6465
nonTravelMoves?: string[];
6566
minLayerThreshold?: number;
6667
renderExtrusion?: boolean;
@@ -96,6 +97,7 @@ export class WebGLPreview {
9697
renderTubes = false;
9798
extrusionWidth = 0.6;
9899
lineWidth?: number;
100+
lineHeight?: number;
99101
startLayer?: number;
100102
endLayer?: number;
101103
singleLayerMode = false;
@@ -134,6 +136,7 @@ export class WebGLPreview {
134136
this.endLayer = opts.endLayer;
135137
this.startLayer = opts.startLayer;
136138
this.lineWidth = opts.lineWidth;
139+
this.lineHeight = opts.lineHeight;
137140
this.buildVolume = opts.buildVolume;
138141
this.initialCameraPosition = opts.initialCameraPosition ?? this.initialCameraPosition;
139142
this.debug = opts.debug ?? this.debug;
@@ -341,13 +344,15 @@ export class WebGLPreview {
341344

342345
renderLayer(index: number): void {
343346
if (index > this.maxLayerIndex) return;
347+
const l = this.layers[index];
344348

345349
const currentLayer: RenderLayer = {
346350
extrusion: [],
347351
travel: [],
348-
z: this.state.z
352+
z: this.state.z,
353+
height: l.height
349354
};
350-
const l = this.layers[index];
355+
351356
for (const cmd of l.commands) {
352357
if (cmd.gcode == 'g20') {
353358
this.setInches();
@@ -421,15 +426,15 @@ export class WebGLPreview {
421426
const endPoint = layer.extrusion.splice(-3);
422427
const preendPoint = layer.extrusion.splice(-3);
423428
if (this.renderTubes) {
424-
this.addTubeLine(layer.extrusion, layerColor.getHex());
425-
this.addTubeLine([...preendPoint, ...endPoint], lastSegmentColor.getHex());
429+
this.addTubeLine(layer.extrusion, layerColor.getHex(), layer.height);
430+
this.addTubeLine([...preendPoint, ...endPoint], lastSegmentColor.getHex(), layer.height);
426431
} else {
427432
this.addLine(layer.extrusion, layerColor.getHex());
428433
this.addLine([...preendPoint, ...endPoint], lastSegmentColor.getHex());
429434
}
430435
} else {
431436
if (this.renderTubes) {
432-
this.addTubeLine(layer.extrusion, extrusionColor.getHex());
437+
this.addTubeLine(layer.extrusion, extrusionColor.getHex(), layer.height);
433438
} else {
434439
this.addLine(layer.extrusion, extrusionColor.getHex());
435440
}
@@ -598,7 +603,7 @@ export class WebGLPreview {
598603
this.group?.add(lineSegments);
599604
}
600605

601-
addTubeLine(vertices: number[], color: number): void {
606+
addTubeLine(vertices: number[], color: number, layerHeight = 0.2): void {
602607
let curvePoints: Vector3[] = [];
603608
const extrusionPaths: Vector3[][] = [];
604609

@@ -619,7 +624,7 @@ export class WebGLPreview {
619624
}
620625

621626
extrusionPaths.forEach((extrusionPath) => {
622-
const geometry = new ExtrusionGeometry(extrusionPath, this.extrusionWidth, 0.2, 4);
627+
const geometry = new ExtrusionGeometry(extrusionPath, this.extrusionWidth, this.lineHeight || layerHeight, 4);
623628
this.disposables.push(geometry);
624629

625630
const material = new MeshLambertMaterial({ color: color });

0 commit comments

Comments
 (0)