diff --git a/README.md b/README.md
index df113ea..3957352 100644
--- a/README.md
+++ b/README.md
@@ -7,8 +7,8 @@ import THREE from 'three.js';
import * as SLICER from 'doodle3d-slicer';
const settings = new SLICER.Settings({
- ...SLICER.printerSettings['ultimaker2go'],
- ...SLICER.userSettings
+ ...SLICER.printerSettings['ultimaker2go'],
+ ...SLICER.userSettings
});
const geometry = new THREE.TorusGeometry(20, 10, 30, 30);
@@ -17,6 +17,6 @@ const slicer = new SLICER.Slicer();
slicer.setGeometry(geometry);
slicer.slice(settings, false).then(gcode => {
- document.getElementById('gcode').innerHTML = gcode.replace(/(?:\r\n|\r|\n)/g, '
');
+ document.getElementById('gcode').innerHTML = gcode.replace(/(?:\r\n|\r|\n)/g, '
');
});
```
diff --git a/example/SlicerViewer.js b/example/SlicerViewer.js
index d82fc44..c678e60 100644
--- a/example/SlicerViewer.js
+++ b/example/SlicerViewer.js
@@ -1,45 +1,45 @@
import React from 'react';
export default class SlicerViewer extends React.Component {
- state = {
- slice: 0
- };
+ state = {
+ slice: 0
+ };
- changeSlider = (event) => {
- this.setState({
- ...this.state,
- slice: parseInt(event.target.value)
- });
- };
+ changeSlider = (event) => {
+ this.setState({
+ ...this.state,
+ slice: parseInt(event.target.value)
+ });
+ };
- render() {
- const { slice } = this.state;
- const { layerIntersectionPoints, settings, layerShapes } = this.props;
+ render() {
+ const { slice } = this.state;
+ const { layerIntersectionPoints, settings, layerShapes } = this.props;
- const numLayers = settings.dimensionsZ / settings.layerHeight;
+ const numLayers = settings.dimensionsZ / settings.layerHeight;
- const intersectionPoints = layerIntersectionPoints[slice + 1];
- const shape = layerShapes[slice];
+ const intersectionPoints = layerIntersectionPoints[slice + 1];
+ const shape = layerShapes[slice];
- return (
-
-
-
-
- );
- }
+ return (
+
+
+
+
+ );
+ }
}
diff --git a/example/app.js b/example/app.js
index 48119be..fbce837 100644
--- a/example/app.js
+++ b/example/app.js
@@ -7,27 +7,27 @@ import generateRawData from './generateRawData.js';
import SlicerViewer from './SlicerViewer.js';
const settings = new SLICER.Settings({
- ...SLICER.printerSettings['ultimaker2go'],
- ...SLICER.userSettings
+ ...SLICER.printerSettings['ultimaker2go'],
+ ...SLICER.userSettings
});
const stlLoader = new THREE.STLLoader();
stlLoader.load('stl/Airplane.stl', (geometry) => {
- geometry.applyMatrix(new THREE.Matrix4().makeRotationX(Math.PI / -2));
- geometry.applyMatrix(new THREE.Matrix4().setPosition(new THREE.Vector3(50, -0.1, 50)));
- // geometry.applyMatrix(new THREE.Matrix4().scale(0.8));
- geometry.mergeVertices();
- geometry.computeFaceNormals();
+ geometry.applyMatrix(new THREE.Matrix4().makeRotationX(Math.PI / -2));
+ geometry.applyMatrix(new THREE.Matrix4().setPosition(new THREE.Vector3(50, -0.1, 50)));
+ // geometry.applyMatrix(new THREE.Matrix4().scale(0.8));
+ geometry.mergeVertices();
+ geometry.computeFaceNormals();
- const rawData = generateRawData(geometry, settings);
+ const rawData = generateRawData(geometry, settings);
- render(, document.getElementById('container'));
+ render(, document.getElementById('container'));
});
// const geometry = new THREE.TorusGeometry(20, 10, 30, 30).clone();
@@ -38,8 +38,8 @@ stlLoader.load('stl/Airplane.stl', (geometry) => {
// const rawData = generateRawData(geometry, settings);
//
// render(, document.getElementById('container'));
diff --git a/example/generateRawData.js b/example/generateRawData.js
index 333a15a..2530094 100644
--- a/example/generateRawData.js
+++ b/example/generateRawData.js
@@ -12,43 +12,43 @@ import applyPrecision from 'src/sliceActions/applyPrecision.js';
import removePrecision from 'src/sliceActions/removePrecision.js';
export default function generateRawData(geometry, settings) {
- const rawData = {};
+ const rawData = {};
- const lines = createLines(geometry, settings);
+ const lines = createLines(geometry, settings);
- const {
- layerIntersectionIndexes,
- layerIntersectionPoints
- } = calculateLayersIntersections(lines, settings);
+ const {
+ layerIntersectionIndexes,
+ layerIntersectionPoints
+ } = calculateLayersIntersections(lines, settings);
- rawData.layerIntersectionPoints = layerIntersectionPoints
- .map(intersectionPoints => intersectionPoints.map(intersectionPoint => intersectionPoint.clone()));
+ rawData.layerIntersectionPoints = layerIntersectionPoints
+ .map(intersectionPoints => intersectionPoints.map(intersectionPoint => intersectionPoint.clone()));
- const layerShapes = intersectionsToShapes(layerIntersectionIndexes, layerIntersectionPoints, lines, settings);
+ const layerShapes = intersectionsToShapes(layerIntersectionIndexes, layerIntersectionPoints, lines, settings);
- rawData.layerShapes = layerShapes
- .map(({ closedShapes, openShapes }) => ({
- closedShapes: closedShapes.map(closedShape => closedShape.map(vector => vector.clone())),
- openShapes: openShapes.map(openShape => openShape.map(vector => vector.clone()))
- }));
+ rawData.layerShapes = layerShapes
+ .map(({ closedShapes, openShapes }) => ({
+ closedShapes: closedShapes.map(closedShape => closedShape.map(vector => vector.clone())),
+ openShapes: openShapes.map(openShape => openShape.map(vector => vector.clone()))
+ }));
- applyPrecision(layerShapes);
+ applyPrecision(layerShapes);
- const slices = shapesToSlices(layerShapes, settings);
+ const slices = shapesToSlices(layerShapes, settings);
- generateInnerLines(slices, settings);
- generateInfills(slices, settings);
- generateSupport(slices, settings);
- addBrim(slices, settings);
- optimizePaths(slices, settings);
- removePrecision(slices);
+ generateInnerLines(slices, settings);
+ generateInfills(slices, settings);
+ generateSupport(slices, settings);
+ addBrim(slices, settings);
+ optimizePaths(slices, settings);
+ removePrecision(slices);
- rawData.slices = slices;
+ rawData.slices = slices;
- const gcode = slicesToGCode(slices, settings);
+ const gcode = slicesToGCode(slices, settings);
- rawData.gcode = gcode;
+ rawData.gcode = gcode;
- return rawData;
+ return rawData;
}
diff --git a/example/index.html b/example/index.html
index 1d01f2c..ffecf60 100644
--- a/example/index.html
+++ b/example/index.html
@@ -1,29 +1,29 @@
-
+
- Doodle3D Slicer
+ Doodle3D Slicer
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
+
-
+
diff --git a/example/main.css b/example/main.css
index 03cce6d..1e8fb3e 100644
--- a/example/main.css
+++ b/example/main.css
@@ -1,21 +1,21 @@
* {
- margin: 0;
- padding: 0;
+ margin: 0;
+ padding: 0;
}
#container {
- position: relative;
+ position: relative;
}
#container, svg {
- width: 100%;
- height: 100%;
+ width: 100%;
+ height: 100%;
}
svg, input {
- position: absolute;
+ position: absolute;
}
input {
- width: 100%;
+ width: 100%;
}
diff --git a/src/GCode.js b/src/GCode.js
index 8c3abd7..4da4e9e 100644
--- a/src/GCode.js
+++ b/src/GCode.js
@@ -10,178 +10,178 @@ const POSITION_Y = 'Y';
const POSITION_Z = 'Z';
export default class {
- constructor(settings) {
- this.gcode = '';
- this.current = {};
+ constructor(settings) {
+ this.gcode = '';
+ this.current = {};
- this.extruder = 0.0;
- this.bottom = true;
- this.isRetracted = false;
- this.isFanOn = false;
- this._nozzlePosition = new THREE.Vector2(0, 0);
+ this.extruder = 0.0;
+ this.bottom = true;
+ this.isRetracted = false;
+ this.isFanOn = false;
+ this._nozzlePosition = new THREE.Vector2(0, 0);
- if (settings !== undefined) {
- this.setSettings(settings);
- }
- }
+ if (settings !== undefined) {
+ this.setSettings(settings);
+ }
+ }
- _addGCode(command) {
- let str = '';
- let first = true;
+ _addGCode(command) {
+ let str = '';
+ let first = true;
- for (const action in command) {
- const value = command[action];
- const currentValue = this.current[action];
- if (first) {
- str = action + value;
+ for (const action in command) {
+ const value = command[action];
+ const currentValue = this.current[action];
+ if (first) {
+ str = action + value;
- first = false;
- } else if (currentValue !== value) {
- str += ` ${action}${value}`;
+ first = false;
+ } else if (currentValue !== value) {
+ str += ` ${action}${value}`;
- this.current[action] = value;
- }
- }
+ this.current[action] = value;
+ }
+ }
- this.gcode += `${str}\n`;
- }
+ this.gcode += `${str}\n`;
+ }
- setSettings(settings) {
- this.settings = settings;
+ setSettings(settings) {
+ this.settings = settings;
- return this;
- }
+ return this;
+ }
- turnFanOn(fanSpeed) {
- this.isFanOn = true;
+ turnFanOn(fanSpeed) {
+ this.isFanOn = true;
- const gcode = { [M_COMMAND]: 106 }
- if (fanSpeed !== undefined) gcode[FAN_SPEED] = fanSpeed;
+ const gcode = { [M_COMMAND]: 106 }
+ if (fanSpeed !== undefined) gcode[FAN_SPEED] = fanSpeed;
- this._addGCode(gcode);
+ this._addGCode(gcode);
- return this;
- }
+ return this;
+ }
- turnFanOff() {
- this.isFanOn = false;
+ turnFanOff() {
+ this.isFanOn = false;
- this._addGCode({ [M_COMMAND]: 107 });
+ this._addGCode({ [M_COMMAND]: 107 });
- return this;
- }
+ return this;
+ }
- moveTo(x, y, layer) {
- const {
- layerHeight,
- travelSpeed
- } = this.settings.config;
+ moveTo(x, y, layer) {
+ const {
+ layerHeight,
+ travelSpeed
+ } = this.settings.config;
- const z = (layer + 1) * layerHeight;
- const speed = travelSpeed * 60;
+ const z = (layer + 1) * layerHeight;
+ const speed = travelSpeed * 60;
- this._addGCode({
- [G_COMMAND]: 0,
- [POSITION_X]: x.toFixed(3),
- [POSITION_Y]: y.toFixed(3),
- [POSITION_Z]: z.toFixed(3),
- [SPEED]: speed.toFixed(3)
- });
+ this._addGCode({
+ [G_COMMAND]: 0,
+ [POSITION_X]: x.toFixed(3),
+ [POSITION_Y]: y.toFixed(3),
+ [POSITION_Z]: z.toFixed(3),
+ [SPEED]: speed.toFixed(3)
+ });
- this._nozzlePosition.set(x, y);
+ this._nozzlePosition.set(x, y);
- return this;
- }
+ return this;
+ }
- lineTo(x, y, layer, type) {
- const newNozzlePosition = new THREE.Vector2(x, y);
+ lineTo(x, y, layer, type) {
+ const newNozzlePosition = new THREE.Vector2(x, y);
- const {
- layerHeight,
- nozzleDiameter,
- filamentThickness,
- travelSpeed
- } = this.settings.config;
+ const {
+ layerHeight,
+ nozzleDiameter,
+ filamentThickness,
+ travelSpeed
+ } = this.settings.config;
- const profile = this.settings.config[(this.bottom ? 'bottom' : type)];
+ const profile = this.settings.config[(this.bottom ? 'bottom' : type)];
- let {
- speed,
- flowRate
- } = profile;
+ let {
+ speed,
+ flowRate
+ } = profile;
- speed *= 60;
- const z = (layer + 1) * layerHeight;
+ speed *= 60;
+ const z = (layer + 1) * layerHeight;
- const lineLength = this._nozzlePosition.distanceTo(newNozzlePosition);
+ const lineLength = this._nozzlePosition.distanceTo(newNozzlePosition);
- const filamentSurfaceArea = Math.pow((filamentThickness / 2), 2) * Math.PI;
- this.extruder += lineLength * nozzleDiameter * layerHeight / filamentSurfaceArea * flowRate;
+ const filamentSurfaceArea = Math.pow((filamentThickness / 2), 2) * Math.PI;
+ this.extruder += lineLength * nozzleDiameter * layerHeight / filamentSurfaceArea * flowRate;
- this._addGCode({
- [G_COMMAND]: 1,
- [POSITION_X]: x.toFixed(3),
- [POSITION_Y]: y.toFixed(3),
- [POSITION_Z]: z.toFixed(3),
- [SPEED]: speed.toFixed(3),
- [EXTRUDER]: this.extruder.toFixed(3)
- });
+ this._addGCode({
+ [G_COMMAND]: 1,
+ [POSITION_X]: x.toFixed(3),
+ [POSITION_Y]: y.toFixed(3),
+ [POSITION_Z]: z.toFixed(3),
+ [SPEED]: speed.toFixed(3),
+ [EXTRUDER]: this.extruder.toFixed(3)
+ });
- this._nozzlePosition.copy(newNozzlePosition);
+ this._nozzlePosition.copy(newNozzlePosition);
- return this;
- }
+ return this;
+ }
- unRetract() {
- const {
- retractionEnabled,
- retractionMinDistance,
- retractionSpeed
- } = this.settings.config;
+ unRetract() {
+ const {
+ retractionEnabled,
+ retractionMinDistance,
+ retractionSpeed
+ } = this.settings.config;
- if (this.isRetracted && retractionEnabled) {
- this.isRetracted = false;
+ if (this.isRetracted && retractionEnabled) {
+ this.isRetracted = false;
- const speed = retractionSpeed * 60;
+ const speed = retractionSpeed * 60;
- if (this.extruder > retractionMinDistance) {
- this._addGCode({
- [G_COMMAND]: 0,
- [EXTRUDER]: this.extruder.toFixed(3),
- [SPEED]: speed.toFixed(3)
- });
- }
- }
+ if (this.extruder > retractionMinDistance) {
+ this._addGCode({
+ [G_COMMAND]: 0,
+ [EXTRUDER]: this.extruder.toFixed(3),
+ [SPEED]: speed.toFixed(3)
+ });
+ }
+ }
- return this;
- }
+ return this;
+ }
- retract() {
- const {
- retractionAmount,
- retractionEnabled,
- retractionMinDistance,
- retractionSpeed
- } = this.settings.config;
+ retract() {
+ const {
+ retractionAmount,
+ retractionEnabled,
+ retractionMinDistance,
+ retractionSpeed
+ } = this.settings.config;
- if (!this.isRetracted && retractionEnabled) {
- this.isRetracted = true;
+ if (!this.isRetracted && retractionEnabled) {
+ this.isRetracted = true;
- const speed = retractionSpeed * 60;
+ const speed = retractionSpeed * 60;
- if (this.extruder > retractionMinDistance && retractionEnabled) {
- this._addGCode({
- [G_COMMAND]: 0,
- [EXTRUDER]: (this.extruder - retractionAmount).toFixed(3),
- [SPEED]: speed.toFixed(3)
- });
- }
- }
+ if (this.extruder > retractionMinDistance && retractionEnabled) {
+ this._addGCode({
+ [G_COMMAND]: 0,
+ [EXTRUDER]: (this.extruder - retractionAmount).toFixed(3),
+ [SPEED]: speed.toFixed(3)
+ });
+ }
+ }
- return this;
- }
+ return this;
+ }
- getGCode() {
- return this.settings.startCode() + this.gcode + this.settings.endCode();
- }
+ getGCode() {
+ return this.settings.startCode() + this.gcode + this.settings.endCode();
+ }
}
diff --git a/src/Settings.js b/src/Settings.js
index 33fc821..1f55b6b 100644
--- a/src/Settings.js
+++ b/src/Settings.js
@@ -1,53 +1,53 @@
export default class {
- constructor(config = {}) {
- this.config = config;
- }
- updateConfig(config) {
- this.config = { ...this.config, ...config };
+ constructor(config = {}) {
+ this.config = config;
+ }
+ updateConfig(config) {
+ this.config = { ...this.config, ...config };
- return this;
- }
- startCode() {
- const { startCode } = this.config;
- const gcode = this._subsituteVariables(startCode);
- return gcode;
- }
- endCode() {
- const { endCode } = this.config;
- const gcode = this._subsituteVariables(endCode);
- return gcode;
- }
- _subsituteVariables(gcode) {
- let {
- temperature,
- bedTemperature,
- heatTemperature,
- heatBedTemperature,
- travelSpeed,
- printerType,
- heatedbed
- } = this.config;
+ return this;
+ }
+ startCode() {
+ const { startCode } = this.config;
+ const gcode = this._subsituteVariables(startCode);
+ return gcode;
+ }
+ endCode() {
+ const { endCode } = this.config;
+ const gcode = this._subsituteVariables(endCode);
+ return gcode;
+ }
+ _subsituteVariables(gcode) {
+ let {
+ temperature,
+ bedTemperature,
+ heatTemperature,
+ heatBedTemperature,
+ travelSpeed,
+ printerType,
+ heatedbed
+ } = this.config;
- travelSpeed *= 60;
+ travelSpeed *= 60;
- switch (printerType) {
- case 'makerbot_replicator2': printerType = 'r2'; break;
- case 'makerbot_replicator2x': printerType = 'r2x'; break;
- case 'makerbot_thingomatic': printerType = 't6'; break;
- case 'makerbot_generic': printerType = 'r2'; break;
- case '_3Dison_plus': printerType = 'r2'; break;
- }
+ switch (printerType) {
+ case 'makerbot_replicator2': printerType = 'r2'; break;
+ case 'makerbot_replicator2x': printerType = 'r2x'; break;
+ case 'makerbot_thingomatic': printerType = 't6'; break;
+ case 'makerbot_generic': printerType = 'r2'; break;
+ case '_3Dison_plus': printerType = 'r2'; break;
+ }
- const heatedBedReplacement = heatedbed ? '' : ';';
+ const heatedBedReplacement = heatedbed ? '' : ';';
- gcode = gcode.replace(/{printingTemp}/gi, temperature);
- gcode = gcode.replace(/{printingBedTemp}/gi, bedTemperature);
- gcode = gcode.replace(/{preheatTemp}/gi, heatTemperature);
- gcode = gcode.replace(/{preheatBedTemp}/gi, heatBedTemperature);
- gcode = gcode.replace(/{printerType}/gi, printerType);
- gcode = gcode.replace(/{travelSpeed}/gi, travelSpeed);
- gcode = gcode.replace(/{if heatedBed}/gi, heatedBedReplacement);
+ gcode = gcode.replace(/{printingTemp}/gi, temperature);
+ gcode = gcode.replace(/{printingBedTemp}/gi, bedTemperature);
+ gcode = gcode.replace(/{preheatTemp}/gi, heatTemperature);
+ gcode = gcode.replace(/{preheatBedTemp}/gi, heatBedTemperature);
+ gcode = gcode.replace(/{printerType}/gi, printerType);
+ gcode = gcode.replace(/{travelSpeed}/gi, travelSpeed);
+ gcode = gcode.replace(/{if heatedBed}/gi, heatedBedReplacement);
- return gcode;
- }
+ return gcode;
+ }
}
diff --git a/src/Slice.js b/src/Slice.js
index 32b75bf..c5ef883 100644
--- a/src/Slice.js
+++ b/src/Slice.js
@@ -1,31 +1,31 @@
import Shape from 'Doodle3D/clipper-js';
export default class {
- constructor() {
- this.parts = [];
- }
- getOutline() {
- const outLines = new Shape([], true);
+ constructor() {
+ this.parts = [];
+ }
+ getOutline() {
+ const outLines = new Shape([], true);
- for (let i = 0; i < this.parts.length; i ++) {
- const part = this.parts[i];
+ for (let i = 0; i < this.parts.length; i ++) {
+ const part = this.parts[i];
- if (part.shape.closed) {
- outLines.join(this.parts[i].outerLine);
- }
- }
+ if (part.shape.closed) {
+ outLines.join(this.parts[i].outerLine);
+ }
+ }
- return outLines;
- }
- add(shape) {
- const part = { shape };
+ return outLines;
+ }
+ add(shape) {
+ const part = { shape };
- if (shape.closed) {
- part.innerLines = [];
- part.outerLine = new Shape([], true);
- part.fill = new Shape([], false);
- }
+ if (shape.closed) {
+ part.innerLines = [];
+ part.outerLine = new Shape([], true);
+ part.fill = new Shape([], false);
+ }
- this.parts.push(part);
- }
+ this.parts.push(part);
+ }
}
diff --git a/src/Slicer.js b/src/Slicer.js
index 9a1fa3a..20e76b1 100644
--- a/src/Slicer.js
+++ b/src/Slicer.js
@@ -3,60 +3,60 @@ import slice from './sliceActions/slice.js';
import SlicerWorker from './slicerWorker.js!worker';
export default class {
- setMesh(mesh) {
- mesh.updateMatrix();
+ setMesh(mesh) {
+ mesh.updateMatrix();
- this.setGeometry(mesh.geometry, mesh.matrix);
+ this.setGeometry(mesh.geometry, mesh.matrix);
- return this;
- }
- setGeometry(geometry, matrix) {
- if (geometry.type === 'BufferGeometry') {
- geometry = new THREE.Geometry().fromBufferGeometry(geometry);
- } else if (geometry.type === 'Geometry') {
- geometry = geometry.clone();
- } else {
- throw new Error('Geometry is not an instance of BufferGeometry or Geometry');
- }
+ return this;
+ }
+ setGeometry(geometry, matrix) {
+ if (geometry.type === 'BufferGeometry') {
+ geometry = new THREE.Geometry().fromBufferGeometry(geometry);
+ } else if (geometry.type === 'Geometry') {
+ geometry = geometry.clone();
+ } else {
+ throw new Error('Geometry is not an instance of BufferGeometry or Geometry');
+ }
- if (matrix) {
- geometry.applyMatrix(matrix);
- }
+ if (matrix) {
+ geometry.applyMatrix(matrix);
+ }
- geometry.mergeVertices();
- geometry.computeFaceNormals();
+ geometry.mergeVertices();
+ geometry.computeFaceNormals();
- this.geometry = geometry;
+ this.geometry = geometry;
- return this;
- }
- sliceSync(settings) {
- return slice(this.geometry, settings);
- }
- slice(settings) {
- const slicerWorker = new SlicerWorker();
+ return this;
+ }
+ sliceSync(settings) {
+ return slice(this.geometry, settings);
+ }
+ slice(settings) {
+ const slicerWorker = new SlicerWorker();
- const geometry = this.geometry.toJSON();
- const { config } = settings;
+ const geometry = this.geometry.toJSON();
+ const { config } = settings;
- return new Promise((resolve, reject) => {
- slicerWorker.onerror = reject;
+ return new Promise((resolve, reject) => {
+ slicerWorker.onerror = reject;
- slicerWorker.addEventListener('message', (event) => {
- const { message, data } = event.data;
- switch (message) {
- case 'SLICE': {
- slicerWorker.terminate();
- resolve(data.gcode);
- break;
- }
- }
- });
+ slicerWorker.addEventListener('message', (event) => {
+ const { message, data } = event.data;
+ switch (message) {
+ case 'SLICE': {
+ slicerWorker.terminate();
+ resolve(data.gcode);
+ break;
+ }
+ }
+ });
- slicerWorker.postMessage({
- message: 'SLICE',
- data: { geometry, config }
- });
- });
- }
+ slicerWorker.postMessage({
+ message: 'SLICE',
+ data: { geometry, config }
+ });
+ });
+ }
}
diff --git a/src/settings/printer_settings.json b/src/settings/printer_settings.json
index f1e3fc6..d4e4582 100644
--- a/src/settings/printer_settings.json
+++ b/src/settings/printer_settings.json
@@ -1,38 +1,38 @@
{
- "ultimaker": {
- "dimensionsX": 200,
- "dimensionsY": 200,
- "dimensionsZ": 200,
- "endCode": "M107 ;fan off\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;disable axes / steppers\nG90 ;absolute positioning\nM104 S{preheatTemp}\n{if heatedBed}M140 S{preheatBedTemp}\nM117 Done ;display message (20 characters to clear whole screen)\n",
- "filamentThickness": 2.85,
- "heatedBed": false,
- "heatupEnabled": true,
- "nozzleDiameter": 0.4,
- "startCode": ";Generated with Doodle3D (default)\nM109 S{printingTemp} ;set target temperature \n{if heatedBed}M190 S{printingBedTemp} ;set target bed temperature\nG21 ;metric values\nG91 ;relative positioning\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E10 ;extrude 10mm of feed stock\nG92 E0 ;zero the extruded length again\nG92 E0 ;zero the extruded length again\nG1 F9000\nG90 ;absolute positioning\nM117 Printing Doodle... ;display message (20 characters to clear whole screen)\n",
- "type": "ultimaker"
- },
- "ultimaker2": {
- "dimensionsX": 223,
- "dimensionsY": 223,
- "dimensionsZ": 205,
- "endCode": "M107 ;fan off\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+5.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 ;home the printer\nM84 ;disable axes / steppers\nG90 ;absolute positioning\nM104 S{preheatTemp}\n{if heatedBed}M140 S{preheatBedTemp}\nM117 Done ;display message (20 characters to clear whole screen)\n",
- "filamentThickness": 2.85,
- "heatedBed": true,
- "heatupEnabled": true,
- "nozzleDiameter": 0.4,
- "startCode": ";Generated with Doodle3D (ultimaker2)\nM109 S{printingTemp} ;set target temperature \n{if heatedBed}M190 S{printingBedTemp} ;set target bed temperature\nG21 ;metric values\nG90 ;absolute positioning\nM107 ;start with the fan off\nG28 ; home to endstops\nG1 Z15 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E10 ;extrude 10mm of feed stock\nG92 E0 ;zero the extruded length again\nG0 X0 Y0 F{travelSpeed} ;home position is not X0 Y0\nM117 Printing Doodle... ;display message (20 characters to clear whole screen)\n",
- "type": "ultimaker2"
- },
- "ultimaker2go": {
- "dimensionsX": 120,
- "dimensionsY": 120,
- "dimensionsZ": 115,
- "endCode": "M107 ;fan off\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 ;home the printer\nM84 ;disable axes / steppers\nG90 ;absolute positioning\nM104 S{preheatTemp}\n{if heatedBed}M140 S{preheatBedTemp}\nM117 Done ;display message (20 characters to clear whole screen)\n",
- "filamentThickness": 2.85,
- "heatedBed": false,
- "heatupEnabled": true,
- "nozzleDiameter": 0.4,
- "startCode": ";Generated with Doodle3D (ultimaker2go)\nM109 S{printingTemp} ;set target temperature \n{if heatedBed}M190 S{printingBedTemp} ;set target bed temperature\nG21 ;metric values\nG90 ;absolute positioning\nM107 ;start with the fan off\nG28 ; home to endstops\nG1 Z15 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E10 ;extrude 10mm of feed stock\nG92 E0 ;zero the extruded length again\nG0 X0 Y0 F{travelSpeed} ;home position is not X0 Y0\nM117 Printing Doodle... ;display message (20 characters to clear whole screen)\n",
- "type": "ultimaker2g0"
- }
+ "ultimaker": {
+ "dimensionsX": 200,
+ "dimensionsY": 200,
+ "dimensionsZ": 200,
+ "endCode": "M107 ;fan off\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;disable axes / steppers\nG90 ;absolute positioning\nM104 S{preheatTemp}\n{if heatedBed}M140 S{preheatBedTemp}\nM117 Done ;display message (20 characters to clear whole screen)\n",
+ "filamentThickness": 2.85,
+ "heatedBed": false,
+ "heatupEnabled": true,
+ "nozzleDiameter": 0.4,
+ "startCode": ";Generated with Doodle3D (default)\nM109 S{printingTemp} ;set target temperature \n{if heatedBed}M190 S{printingBedTemp} ;set target bed temperature\nG21 ;metric values\nG91 ;relative positioning\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E10 ;extrude 10mm of feed stock\nG92 E0 ;zero the extruded length again\nG92 E0 ;zero the extruded length again\nG1 F9000\nG90 ;absolute positioning\nM117 Printing Doodle... ;display message (20 characters to clear whole screen)\n",
+ "type": "ultimaker"
+ },
+ "ultimaker2": {
+ "dimensionsX": 223,
+ "dimensionsY": 223,
+ "dimensionsZ": 205,
+ "endCode": "M107 ;fan off\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+5.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 ;home the printer\nM84 ;disable axes / steppers\nG90 ;absolute positioning\nM104 S{preheatTemp}\n{if heatedBed}M140 S{preheatBedTemp}\nM117 Done ;display message (20 characters to clear whole screen)\n",
+ "filamentThickness": 2.85,
+ "heatedBed": true,
+ "heatupEnabled": true,
+ "nozzleDiameter": 0.4,
+ "startCode": ";Generated with Doodle3D (ultimaker2)\nM109 S{printingTemp} ;set target temperature \n{if heatedBed}M190 S{printingBedTemp} ;set target bed temperature\nG21 ;metric values\nG90 ;absolute positioning\nM107 ;start with the fan off\nG28 ; home to endstops\nG1 Z15 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E10 ;extrude 10mm of feed stock\nG92 E0 ;zero the extruded length again\nG0 X0 Y0 F{travelSpeed} ;home position is not X0 Y0\nM117 Printing Doodle... ;display message (20 characters to clear whole screen)\n",
+ "type": "ultimaker2"
+ },
+ "ultimaker2go": {
+ "dimensionsX": 120,
+ "dimensionsY": 120,
+ "dimensionsZ": 115,
+ "endCode": "M107 ;fan off\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 ;home the printer\nM84 ;disable axes / steppers\nG90 ;absolute positioning\nM104 S{preheatTemp}\n{if heatedBed}M140 S{preheatBedTemp}\nM117 Done ;display message (20 characters to clear whole screen)\n",
+ "filamentThickness": 2.85,
+ "heatedBed": false,
+ "heatupEnabled": true,
+ "nozzleDiameter": 0.4,
+ "startCode": ";Generated with Doodle3D (ultimaker2go)\nM109 S{printingTemp} ;set target temperature \n{if heatedBed}M190 S{printingBedTemp} ;set target bed temperature\nG21 ;metric values\nG90 ;absolute positioning\nM107 ;start with the fan off\nG28 ; home to endstops\nG1 Z15 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E10 ;extrude 10mm of feed stock\nG92 E0 ;zero the extruded length again\nG0 X0 Y0 F{travelSpeed} ;home position is not X0 Y0\nM117 Printing Doodle... ;display message (20 characters to clear whole screen)\n",
+ "type": "ultimaker2g0"
+ }
}
diff --git a/src/settings/user_settings.json b/src/settings/user_settings.json
index 125341b..c6257a6 100644
--- a/src/settings/user_settings.json
+++ b/src/settings/user_settings.json
@@ -1,47 +1,47 @@
{
- "heatupBedTemperature": 70,
- "heatupTemperature": 20,
- "temperature": 210.0,
- "layerHeight": 0.15,
- "bottomThickness": 0.4,
- "topThickness": 0.8,
- "shellThickness": 0.4,
- "brimOffset": 4.0,
- "fillGridSize": 5.0,
- "infillOverlap": 0.0,
- "travelSpeed": 200.0,
- "retractionAmount": 3.0,
- "retractionEnabled": true,
- "retractionSpeed": 50.0,
- "retractionMinDistance": 0.0,
- "supportAcceptanceMargin": 1.5,
- "supportDistanceY": 0.4,
- "supportEnabled": false,
- "supportGridSize": 6.0,
- "supportMargin": 2.0,
- "supportPlateSize": 4.0,
- "outerLine": {
- "flowRate": 1.0,
- "speed": 40.0
- },
- "innerLine": {
- "flowRate": 1.0,
- "speed": 50.0
- },
- "fill": {
- "flowRate": 1.0,
- "speed": 50.0
- },
- "brim": {
- "flowRate": 1.0,
- "speed": 40.0
- },
- "support": {
- "flowRate": 0.8,
- "speed": 40.0
- },
- "bottom": {
- "flowRate": 1.2,
- "speed": 40.0
- }
+ "heatupBedTemperature": 70,
+ "heatupTemperature": 20,
+ "temperature": 210.0,
+ "layerHeight": 0.15,
+ "bottomThickness": 0.4,
+ "topThickness": 0.8,
+ "shellThickness": 0.4,
+ "brimOffset": 4.0,
+ "fillGridSize": 5.0,
+ "infillOverlap": 0.0,
+ "travelSpeed": 200.0,
+ "retractionAmount": 3.0,
+ "retractionEnabled": true,
+ "retractionSpeed": 50.0,
+ "retractionMinDistance": 0.0,
+ "supportAcceptanceMargin": 1.5,
+ "supportDistanceY": 0.4,
+ "supportEnabled": false,
+ "supportGridSize": 6.0,
+ "supportMargin": 2.0,
+ "supportPlateSize": 4.0,
+ "outerLine": {
+ "flowRate": 1.0,
+ "speed": 40.0
+ },
+ "innerLine": {
+ "flowRate": 1.0,
+ "speed": 50.0
+ },
+ "fill": {
+ "flowRate": 1.0,
+ "speed": 50.0
+ },
+ "brim": {
+ "flowRate": 1.0,
+ "speed": 40.0
+ },
+ "support": {
+ "flowRate": 0.8,
+ "speed": 40.0
+ },
+ "bottom": {
+ "flowRate": 1.2,
+ "speed": 40.0
+ }
}
diff --git a/src/sliceActions/optimizePaths.js b/src/sliceActions/optimizePaths.js
index b160fce..438f489 100644
--- a/src/sliceActions/optimizePaths.js
+++ b/src/sliceActions/optimizePaths.js
@@ -10,72 +10,72 @@ export default function optimizePaths(slices, settings) {
const slice = slices[layer];
if (slice.brim !== undefined && slice.brim.paths.length > 0) {
- slice.brim = optimizeShape(slice.brim, start);
- start.copy(slice.brim.lastPoint(true));
+ slice.brim = optimizeShape(slice.brim, start);
+ start.copy(slice.brim.lastPoint(true));
}
const parts = [];
while (slice.parts.length > 0) {
- let closestDistance = Infinity;
- let closestPart;
+ let closestDistance = Infinity;
+ let closestPart;
- for (let i = 0; i < slice.parts.length; i ++) {
- const part = slice.parts[i];
+ for (let i = 0; i < slice.parts.length; i ++) {
+ const part = slice.parts[i];
let bounds;
- if (part.shape.closed) {
- bounds = part.outerLine.shapeBounds();
- } else {
- bounds = part.shape.shapeBounds();
- }
+ if (part.shape.closed) {
+ bounds = part.outerLine.shapeBounds();
+ } else {
+ bounds = part.shape.shapeBounds();
+ }
- const top = bounds.top - start.y;
- const bottom = start.y - bounds.bottom;
- const left = bounds.left - start.x;
- const right = start.x - bounds.right;
+ const top = bounds.top - start.y;
+ const bottom = start.y - bounds.bottom;
+ const left = bounds.left - start.x;
+ const right = start.x - bounds.right;
- const distance = Math.max(top, bottom, left, right);
+ const distance = Math.max(top, bottom, left, right);
- if (distance < closestDistance) {
- closestDistance = distance;
- closestPart = i;
- }
- }
+ if (distance < closestDistance) {
+ closestDistance = distance;
+ closestPart = i;
+ }
+ }
- const part = slice.parts.splice(closestPart, 1)[0];
- parts.push(part);
+ const part = slice.parts.splice(closestPart, 1)[0];
+ parts.push(part);
- if (part.shape.closed) {
- if (part.outerLine.paths.length > 0) {
- part.outerLine = optimizeShape(part.outerLine, start);
- start.copy(part.outerLine.lastPoint(true));
- }
+ if (part.shape.closed) {
+ if (part.outerLine.paths.length > 0) {
+ part.outerLine = optimizeShape(part.outerLine, start);
+ start.copy(part.outerLine.lastPoint(true));
+ }
- for (let i = 0; i < part.innerLines.length; i ++) {
- const innerLine = part.innerLines[i];
+ for (let i = 0; i < part.innerLines.length; i ++) {
+ const innerLine = part.innerLines[i];
- if (innerLine.paths.length > 0) {
- part.innerLines[i] = optimizeShape(innerLine, start);
- start.copy(part.innerLines[i].lastPoint(true));
- }
- }
+ if (innerLine.paths.length > 0) {
+ part.innerLines[i] = optimizeShape(innerLine, start);
+ start.copy(part.innerLines[i].lastPoint(true));
+ }
+ }
- if (part.fill.paths.length > 0) {
- part.fill = optimizeShape(part.fill, start);
- start.copy(part.fill.lastPoint(true));
- }
- } else {
- part.shape = optimizeShape(part.shape, start);
- start.copy(part.shape.lastPoint(true));
- }
+ if (part.fill.paths.length > 0) {
+ part.fill = optimizeShape(part.fill, start);
+ start.copy(part.fill.lastPoint(true));
+ }
+ } else {
+ part.shape = optimizeShape(part.shape, start);
+ start.copy(part.shape.lastPoint(true));
+ }
}
slice.parts = parts;
if (slice.support !== undefined && slice.support.length > 0) {
- slice.support = optimizeShape(slice.support, start);
- start.copy(slice.support.lastPoint(true));
+ slice.support = optimizeShape(slice.support, start);
+ start.copy(slice.support.lastPoint(true));
}
}
}