mirror of
https://github.com/Doodle3D/Doodle3D-Slicer.git
synced 2025-02-01 22:05:10 +01:00
fixed mergin vertexes
This commit is contained in:
parent
203fe6df19
commit
e441c142b4
86
build/d3d.js
vendored
86
build/d3d.js
vendored
@ -644,41 +644,75 @@ D3D.Paths.prototype.scaleDown = function (factor) {
|
|||||||
|
|
||||||
return this;
|
return this;
|
||||||
};
|
};
|
||||||
|
D3D.Paths.prototype.lastPoint = function () {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var lastPath = this[this.length - 1];
|
||||||
|
var lastPoint = this.closed ? lastPath[0] : lastPath[lastPath.length - 1];
|
||||||
|
return new THREE.Vector2(lastPoint.X, lastPoint.Y);
|
||||||
|
};
|
||||||
D3D.Paths.prototype.optimizePath = function (start) {
|
D3D.Paths.prototype.optimizePath = function (start) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var optimizedPaths = new D3D.Paths();
|
var optimizedPaths = new D3D.Paths([], this.closed);
|
||||||
|
var donePaths = [];
|
||||||
|
|
||||||
while (optimizedPaths.length !== this.length) {
|
while (optimizedPaths.length !== this.length) {
|
||||||
var minLength = undefined;
|
var minLength = false;
|
||||||
var reverse;
|
var reverse;
|
||||||
var minPath;
|
var minPath;
|
||||||
|
var offset;
|
||||||
|
var pathIndex;
|
||||||
|
|
||||||
for (var i = 0; i < this.length; i ++) {
|
for (var i = 0; i < this.length; i ++) {
|
||||||
var path = this[i];
|
var path = this[i];
|
||||||
|
|
||||||
if (optimizedPaths.indexOf(path) === -1) {
|
if (donePaths.indexOf(i) === -1) {
|
||||||
var startPoint = new THREE.Vector2(path[0].X, path[0].Y);
|
|
||||||
var endPoint = new THREE.Vector2(path[path.length - 1].X, path[path.length - 1].Y);
|
if (this.closed) {
|
||||||
var length = startPoint.sub(start).length();
|
for (var j = 0; j < path.length; j ++) {
|
||||||
if (minLength === undefined || length < minLength) {
|
var point = new THREE.Vector2(path[j].X, path[j].Y);
|
||||||
minPath = path;
|
var length = point.sub(start).length();
|
||||||
minLength = length;
|
if (minLength === false || length < minLength) {
|
||||||
reverse = false;
|
minPath = path;
|
||||||
|
minLength = length;
|
||||||
|
offset = j;
|
||||||
|
pathIndex = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
var length = endPoint.sub(start).length();
|
else {
|
||||||
if (length < minLength) {
|
var startPoint = new THREE.Vector2(path[0].X, path[0].Y);
|
||||||
minPath = path;
|
var length = startPoint.sub(start).length();
|
||||||
minLength = length;
|
if (minLength === false || length < minLength) {
|
||||||
reverse = true;
|
minPath = path;
|
||||||
|
minLength = length;
|
||||||
|
reverse = false;
|
||||||
|
pathIndex = i;
|
||||||
|
}
|
||||||
|
var endPoint = new THREE.Vector2(path[path.length - 1].X, path[path.length - 1].Y);
|
||||||
|
var length = endPoint.sub(start).length();
|
||||||
|
if (length < minLength) {
|
||||||
|
minPath = path;
|
||||||
|
minLength = length;
|
||||||
|
reverse = true;
|
||||||
|
pathIndex = i;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (reverse) {
|
if (this.closed) {
|
||||||
minPath.reverse();
|
minPath = minPath.concat(minPath.splice(0, offset));
|
||||||
|
var point = minPath[0];
|
||||||
}
|
}
|
||||||
var point = minPath[minPath.length - 1];
|
else {
|
||||||
|
if (reverse) {
|
||||||
|
minPath.reverse();
|
||||||
|
}
|
||||||
|
var point = minPath[minPath.length - 1];
|
||||||
|
}
|
||||||
|
donePaths.push(pathIndex);
|
||||||
start = new THREE.Vector2(point.X, point.Y);
|
start = new THREE.Vector2(point.X, point.Y);
|
||||||
optimizedPaths.push(minPath);
|
optimizedPaths.push(minPath);
|
||||||
}
|
}
|
||||||
@ -728,8 +762,8 @@ D3D.Paths.prototype.draw = function (context, color) {
|
|||||||
for (var i = 0; i < this.length; i ++) {
|
for (var i = 0; i < this.length; i ++) {
|
||||||
var shape = this[i];
|
var shape = this[i];
|
||||||
|
|
||||||
//var point = shape[0];
|
var point = shape[0];
|
||||||
//context.fillText(i, point.X*2, point.Y*2);
|
context.fillText(i, point.X*2, point.Y*2);
|
||||||
|
|
||||||
context.beginPath();
|
context.beginPath();
|
||||||
var length = this.closed ? (shape.length + 1) : shape.length;
|
var length = this.closed ? (shape.length + 1) : shape.length;
|
||||||
@ -978,6 +1012,8 @@ D3D.Slicer.prototype.slicesToData = function (slices, printer) {
|
|||||||
var brimOffset = printer.config["printer.brimOffset"] * scale;
|
var brimOffset = printer.config["printer.brimOffset"] * scale;
|
||||||
var skinCount = Math.ceil(shellThickness/layerHeight);
|
var skinCount = Math.ceil(shellThickness/layerHeight);
|
||||||
|
|
||||||
|
var start = new THREE.Vector2(0, 0);
|
||||||
|
|
||||||
var data = [];
|
var data = [];
|
||||||
|
|
||||||
var lowFillTemplate = this.getFillTemplate({
|
var lowFillTemplate = this.getFillTemplate({
|
||||||
@ -1038,10 +1074,10 @@ D3D.Slicer.prototype.slicesToData = function (slices, printer) {
|
|||||||
fill.join(highFillTemplate.intersect(highFillArea));
|
fill.join(highFillTemplate.intersect(highFillArea));
|
||||||
}
|
}
|
||||||
|
|
||||||
var lastPath = insets[insets.length - 1];
|
outerLayer = outerLayer.optimizePath(start);
|
||||||
var lastPoint = lastPath[lastPath.length - 1];
|
insets = insets.optimizePath(outerLayer.lastPoint());
|
||||||
var start = new THREE.Vector2(lastPoint.X, lastPoint.Y);
|
fill = fill.optimizePath(insets.lastPoint());
|
||||||
fill = fill.optimizePath(start);
|
start = fill.lastPoint();
|
||||||
|
|
||||||
layerData.push({
|
layerData.push({
|
||||||
outerLayer: outerLayer.scaleDown(scale),
|
outerLayer: outerLayer.scaleDown(scale),
|
||||||
@ -1116,7 +1152,7 @@ D3D.Slicer.prototype.dataToGcode = function (data, printer) {
|
|||||||
gcode.push([
|
gcode.push([
|
||||||
"G0",
|
"G0",
|
||||||
"X" + point.X.toFixed(3) + " Y" + point.Y.toFixed(3) + " Z" + z,
|
"X" + point.X.toFixed(3) + " Y" + point.Y.toFixed(3) + " Z" + z,
|
||||||
"F" + (travelSpeed*60)
|
"F" + (travelSpeed * 60)
|
||||||
].join(" "));
|
].join(" "));
|
||||||
|
|
||||||
if (extruder > retractionMinDistance && retractionEnabled) {
|
if (extruder > retractionMinDistance && retractionEnabled) {
|
||||||
|
2
build/d3d.min.js
vendored
2
build/d3d.min.js
vendored
File diff suppressed because one or more lines are too long
BIN
models/sonder_one_piece.stl
Normal file
BIN
models/sonder_one_piece.stl
Normal file
Binary file not shown.
@ -115,12 +115,12 @@ mesh.position.z = 100;
|
|||||||
//scene.add(mesh);
|
//scene.add(mesh);
|
||||||
|
|
||||||
var loader = new THREE.STLLoader();
|
var loader = new THREE.STLLoader();
|
||||||
loader.load("models/diamond.stl", function (geometry) {
|
loader.load("models/sonder_one_piece.stl", function (geometry) {
|
||||||
var geometry = new THREE.BoxGeometry(10, 10, 10, 1, 1, 1);
|
//var geometry = new THREE.BoxGeometry(10, 10, 10, 1, 1, 1);
|
||||||
//var geometry = new THREE.SphereGeometry(10, 10, 10);
|
//var geometry = new THREE.SphereGeometry(10, 10, 10);
|
||||||
//var geometry = new THREE.TorusGeometry(20, 10, 30, 30);
|
//var geometry = new THREE.TorusGeometry(20, 10, 30, 30);
|
||||||
|
|
||||||
|
/*
|
||||||
var geometry = (function () {
|
var geometry = (function () {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
@ -136,7 +136,7 @@ loader.load("models/diamond.stl", function (geometry) {
|
|||||||
matrix.makeRotationX(Math.PI*1.5);
|
matrix.makeRotationX(Math.PI*1.5);
|
||||||
|
|
||||||
var geometry = new THREE.ExtrudeGeometry(circle, {
|
var geometry = new THREE.ExtrudeGeometry(circle, {
|
||||||
amount: 3,
|
amount: 10,
|
||||||
bevelEnabled: false,
|
bevelEnabled: false,
|
||||||
steps: 1
|
steps: 1
|
||||||
});
|
});
|
||||||
@ -144,19 +144,19 @@ loader.load("models/diamond.stl", function (geometry) {
|
|||||||
|
|
||||||
return geometry;
|
return geometry;
|
||||||
})();
|
})();
|
||||||
|
*/
|
||||||
|
|
||||||
var mesh = new THREE.Mesh(geometry, material);
|
var mesh = new THREE.Mesh(geometry, material);
|
||||||
|
|
||||||
mesh.position.x = 100;
|
mesh.position.x = 100;
|
||||||
mesh.position.z = 100;
|
mesh.position.z = 100;
|
||||||
|
|
||||||
/*
|
///*
|
||||||
mesh.rotation.x = -Math.PI/2;
|
//mesh.rotation.x = -Math.PI/2;
|
||||||
mesh.scale.x = mesh.scale.y = mesh.scale.z = 3;
|
mesh.scale.x = mesh.scale.y = mesh.scale.z = 1;
|
||||||
//mesh is lifted a little bit...
|
//mesh is lifted a little bit...
|
||||||
mesh.position.y = -0.6552429199218741;
|
//mesh.position.y = 26.5;
|
||||||
*/
|
//*/
|
||||||
scene.add(mesh);
|
scene.add(mesh);
|
||||||
|
|
||||||
var slicer = new D3D.Slicer().setMesh(mesh);
|
var slicer = new D3D.Slicer().setMesh(mesh);
|
||||||
@ -164,8 +164,8 @@ loader.load("models/diamond.stl", function (geometry) {
|
|||||||
var canvas = document.getElementById("canvas");
|
var canvas = document.getElementById("canvas");
|
||||||
var context = canvas.getContext("2d");
|
var context = canvas.getContext("2d");
|
||||||
|
|
||||||
//var img = slicer.drawPaths(printer, 7, 8);
|
var img = slicer.drawPaths(printer, 7, 8);
|
||||||
//context.drawImage(img, 0, 0);
|
context.drawImage(img, 0, 0);
|
||||||
|
|
||||||
gcode = slicer.getGcode(printer);
|
gcode = slicer.getGcode(printer);
|
||||||
});
|
});
|
||||||
|
@ -200,8 +200,8 @@ D3D.Paths.prototype.draw = function (context, color) {
|
|||||||
for (var i = 0; i < this.length; i ++) {
|
for (var i = 0; i < this.length; i ++) {
|
||||||
var shape = this[i];
|
var shape = this[i];
|
||||||
|
|
||||||
var point = shape[0];
|
//var point = shape[0];
|
||||||
context.fillText(i, point.X*2, point.Y*2);
|
//context.fillText(i, point.X*2, point.Y*2);
|
||||||
|
|
||||||
context.beginPath();
|
context.beginPath();
|
||||||
var length = this.closed ? (shape.length + 1) : shape.length;
|
var length = this.closed ? (shape.length + 1) : shape.length;
|
||||||
|
@ -20,19 +20,38 @@ D3D.Slicer = function () {
|
|||||||
D3D.Slicer.prototype.setMesh = function (mesh) {
|
D3D.Slicer.prototype.setMesh = function (mesh) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
mesh.updateMatrix();
|
//convert buffergeometry to geometry;
|
||||||
|
|
||||||
var geometry = mesh.geometry.clone();
|
var geometry = mesh.geometry.clone();
|
||||||
if (geometry instanceof THREE.BufferGeometry) {
|
if (geometry instanceof THREE.BufferGeometry) {
|
||||||
geometry = new THREE.Geometry().fromBufferGeometry(geometry);
|
geometry = new THREE.Geometry().fromBufferGeometry(geometry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//remove duplicate vertices;
|
||||||
|
for (var i = 0; i < geometry.vertices.length; i ++) {
|
||||||
|
var vertexA = geometry.vertices[i];
|
||||||
|
|
||||||
|
for (var j = i + 1; j < geometry.vertices.length; j ++) {
|
||||||
|
var vertexB = geometry.vertices[j];
|
||||||
|
|
||||||
|
if (vertexA.equals(vertexB)) {
|
||||||
|
geometry.vertices[j] = vertexA;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
geometry.mergeVertices();
|
geometry.mergeVertices();
|
||||||
|
|
||||||
|
//apply mesh matrix on geometry;
|
||||||
|
mesh.updateMatrix();
|
||||||
geometry.applyMatrix(mesh.matrix);
|
geometry.applyMatrix(mesh.matrix);
|
||||||
|
geometry.computeFaceNormals();
|
||||||
|
|
||||||
this.geometry = geometry;
|
this.geometry = geometry;
|
||||||
|
|
||||||
|
//get unique lines from geometry;
|
||||||
this.createLines();
|
this.createLines();
|
||||||
|
|
||||||
|
console.log(this.lines);
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
};
|
};
|
||||||
D3D.Slicer.prototype.createLines = function () {
|
D3D.Slicer.prototype.createLines = function () {
|
||||||
@ -283,6 +302,7 @@ D3D.Slicer.prototype.slicesToData = function (slices, printer) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var fillArea = (inset || outerLayer).offset(-wallThickness/2);
|
var fillArea = (inset || outerLayer).offset(-wallThickness/2);
|
||||||
|
//var fillArea = (inset || outerLayer).clone();
|
||||||
|
|
||||||
var highFillArea = fillArea.difference(surroundingLayer);
|
var highFillArea = fillArea.difference(surroundingLayer);
|
||||||
|
|
||||||
@ -290,17 +310,25 @@ D3D.Slicer.prototype.slicesToData = function (slices, printer) {
|
|||||||
|
|
||||||
var fill = new D3D.Paths([], false);
|
var fill = new D3D.Paths([], false);
|
||||||
|
|
||||||
fill.join(lowFillTemplate.intersect(lowFillArea));
|
if (lowFillTemplate.length > 0) {
|
||||||
|
fill.join(lowFillTemplate.intersect(lowFillArea));
|
||||||
|
}
|
||||||
|
|
||||||
if (highFillArea.length > 0) {
|
if (highFillArea.length > 0) {
|
||||||
var highFillTemplate = this.getFillTemplate(highFillArea.bounds(), wallThickness, (layer % 2 === 0), (layer % 2 === 1));
|
var bounds = highFillArea.bounds();
|
||||||
|
var even = (layer % 2 === 0);
|
||||||
|
var highFillTemplate = this.getFillTemplate(bounds, wallThickness, even, !even);
|
||||||
fill.join(highFillTemplate.intersect(highFillArea));
|
fill.join(highFillTemplate.intersect(highFillArea));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
outerLayer = outerLayer.optimizePath(start);
|
outerLayer = outerLayer.optimizePath(start);
|
||||||
insets = insets.optimizePath(outerLayer.lastPoint());
|
insets = insets.optimizePath(outerLayer.lastPoint());
|
||||||
fill = fill.optimizePath(insets.lastPoint());
|
fill = fill.optimizePath(insets.lastPoint());
|
||||||
start = fill.lastPoint();
|
start = fill.lastPoint();
|
||||||
|
*/
|
||||||
|
fill = fill.optimizePath(insets.lastPoint());
|
||||||
|
|
||||||
|
|
||||||
layerData.push({
|
layerData.push({
|
||||||
outerLayer: outerLayer.scaleDown(scale),
|
outerLayer: outerLayer.scaleDown(scale),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user