Permalink
Please
sign in to comment.
Showing
with
3,194 additions
and 0 deletions.
- +42 −0 css/main.css
- +38 −0 index.html
- +187 −0 js/loader/stl.js
- +323 −0 js/main.js
- +72 −0 js/slacer/mesh.js
- +234 −0 js/slacer/slicer.js
- +154 −0 js/slacer/viewcontrols.js
- +132 −0 js/slacer/viewer.js
- +102 −0 js/slacer/viewer2d.js
- +114 −0 js/slacer/viewer3d.js
- +106 −0 vendor/ArrowHelper.js
- +33 −0 vendor/AxisHelper.js
- +669 −0 vendor/OrbitControls.js
- +118 −0 vendor/lodash.min.js
- +870 −0 vendor/three.min.js
@@ -0,0 +1,42 @@ | ||
html, body { | ||
margin: 0; | ||
padding: 0; | ||
overflow: hidden; | ||
} | ||
|
||
.box { | ||
margin: 5px; | ||
} | ||
|
||
.fl { | ||
float: left; | ||
} | ||
|
||
#mesh ul { | ||
margin: 0; | ||
padding: 5px; | ||
border-radius: 6px; | ||
list-style-type: none; | ||
background-color: #000000; | ||
} | ||
|
||
#mesh .label, | ||
#mesh .value { | ||
padding: 2px; | ||
display: inline-block; | ||
} | ||
|
||
#mesh .label { | ||
width: 80px; | ||
color: #eeeeee; | ||
} | ||
|
||
#mesh .value { | ||
width: 50px; | ||
float: right; | ||
color: #ff0000; | ||
font-size: 0.8em; | ||
text-align: right; | ||
border-radius: 4px; | ||
background-color: #550000; | ||
} |
@@ -0,0 +1,38 @@ | ||
<!DOCTYPE html> | ||
<html lang="en"> | ||
<head> | ||
<meta charset="utf-8" /> | ||
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> | ||
<meta name="viewport" content="width=device-width, initial-scale=1" /> | ||
<title>SLAcer.js</title> | ||
<link rel="stylesheet" type="text/css" href="css/main.css" /> | ||
</head> | ||
<body> | ||
<div id="mesh" class="box fl"> | ||
<ul> | ||
<li><span class="label">faces</span><span class="value" id="mesh-faces-value">n/a</span></li> | ||
<li><span class="label">volume</span><span class="value" id="mesh-volume-value">n/a</span></li> | ||
<li><span class="label">layerHeight</span><span class="value" id="layer-height-value">n/a</span></li> | ||
<li><span class="label">layers</span><span class="value"><span id="layer-value">n/a</span> / <span id="layers-value">n/a</span></span></li> | ||
<li><span class="label">zPosition</span><span class="value" id="z-position-value">n/a</span></li> | ||
<li><input id="z-position-input" type="range" value="0" min="0" max="1" step="1" /></li> | ||
</ul> | ||
</div> | ||
<div id="viewers"> | ||
<div id="viewer1" class="box fl">loading...</div> | ||
<div id="viewer2" class="box fl">loading...</div> | ||
<div id="viewer3" class="box fl">loading...</div> | ||
</div> | ||
<script src="vendor/lodash.min.js" type="text/javascript"></script> | ||
<script src="vendor/three.min.js" type="text/javascript"></script> | ||
<script src="js/slacer/mesh.js" type="text/javascript"></script> | ||
<script src="js/slacer/viewer.js" type="text/javascript"></script> | ||
<script src="vendor/OrbitControls.js" type="text/javascript"></script> | ||
<script src="js/slacer/viewcontrols.js" type="text/javascript"></script> | ||
<script src="js/slacer/viewer3d.js" type="text/javascript"></script> | ||
<script src="js/slacer/viewer2d.js" type="text/javascript"></script> | ||
<script src="js/slacer/slicer.js" type="text/javascript"></script> | ||
<script src="js/loader/stl.js" type="text/javascript"></script> | ||
<script src="js/main.js" type="text/javascript"></script> | ||
</body> | ||
</html> |
@@ -0,0 +1,187 @@ | ||
// namespace | ||
var MeshesJS = MeshesJS || {}; | ||
|
||
;(function() { | ||
|
||
// Constructor | ||
function STLLoader(dropTarget) { | ||
this.dropTarget = dropTarget || null; | ||
this.addDropListener(); | ||
} | ||
|
||
// methods | ||
STLLoader.prototype.onDragLeave = function(e) { | ||
e.stopPropagation(); | ||
e.preventDefault(); | ||
} | ||
|
||
STLLoader.prototype.onDrop = function(e) { | ||
this.onDragLeave(e); | ||
this.loadFile((e.target.files || e.dataTransfer.files)[0]); | ||
} | ||
|
||
STLLoader.prototype.addDropListener = function(dropTarget) { | ||
var dropTarget = dropTarget || this.dropTarget; | ||
if (dropTarget) { | ||
var self = this; | ||
dropTarget.addEventListener('drop' , function(e) { self.onDrop(e); } , false); | ||
dropTarget.addEventListener('dragover' , function(e) { self.onDragLeave(e); }, false); | ||
dropTarget.addEventListener('dragleave', function(e) { self.onDragLeave(e); }, false); | ||
} | ||
}; | ||
|
||
STLLoader.prototype.removeDropListener = function(dropTarget) { | ||
var dropTarget = dropTarget || this.dropTarget; | ||
if (dropTarget) { | ||
var self = this; | ||
dropTarget.removeEventListener('drop' , function(e) { self.onDrop(e); } , false); | ||
dropTarget.removeEventListener('dragover' , function(e) { self.onDragLeave(e); }, false); | ||
dropTarget.removeEventListener('dragleave', function(e) { self.onDragLeave(e); }, false); | ||
} | ||
}; | ||
|
||
STLLoader.prototype.onGeometry = function(geometry) {}; | ||
STLLoader.prototype.onError = function(error) {}; | ||
|
||
STLLoader.prototype.loadFile = function(file) { | ||
// self alias | ||
var self = this; | ||
|
||
// file reader instance | ||
var reader = new FileReader(); | ||
|
||
// on file loaded | ||
reader.onloadend = function(event) { | ||
// if error/abort | ||
if (this.error) { | ||
self.onError(this.error); | ||
return; | ||
} | ||
|
||
// Parse ASCII STL | ||
if (typeof this.result === 'string' ) { | ||
self.loadString(this.result); | ||
return; | ||
} | ||
|
||
// buffer reader | ||
var view = new DataView(this.result); | ||
|
||
// get faces number | ||
try { | ||
var faces = view.getUint32(80, true); | ||
} | ||
catch(error) { | ||
self.onError(error); | ||
return; | ||
} | ||
|
||
// is binary ? | ||
var binary = view.byteLength == (80 + 4 + 50 * faces); | ||
|
||
if (! binary) { | ||
// get the file contents as string | ||
// (faster than convert array buffer) | ||
reader.readAsText(file); | ||
return; | ||
} | ||
|
||
// parse binary STL | ||
self.loadBinaryData(view, faces); | ||
}; | ||
|
||
// start reading file as array buffer | ||
reader.readAsArrayBuffer(file); | ||
}; | ||
|
||
STLLoader.prototype.loadString = function(data) { | ||
var length, normal, patternNormal, patternVertex, result, text; | ||
var geometry = new THREE.Geometry(); | ||
var patternFace = /facet([\s\S]*?)endfacet/g; | ||
|
||
while((result = patternFace.exec(data)) !== null) { | ||
text = result[0]; | ||
|
||
patternNormal = /normal[\s]+([\-+]?[0-9]+\.?[0-9]*([eE][\-+]?[0-9]+)?)+[\s]+([\-+]?[0-9]*\.?[0-9]+([eE][\-+]?[0-9]+)?)+[\s]+([\-+]?[0-9]*\.?[0-9]+([eE][\-+]?[0-9]+)?)+/g; | ||
patternVertex = /vertex[\s]+([\-+]?[0-9]+\.?[0-9]*([eE][\-+]?[0-9]+)?)+[\s]+([\-+]?[0-9]*\.?[0-9]+([eE][\-+]?[0-9]+)?)+[\s]+([\-+]?[0-9]*\.?[0-9]+([eE][\-+]?[0-9]+)?)+/g; | ||
|
||
while((result = patternNormal.exec(text)) !== null) { | ||
normal = new THREE.Vector3( | ||
parseFloat(result[1]), | ||
parseFloat(result[3]), | ||
parseFloat(result[5]) | ||
); | ||
} | ||
|
||
while((result = patternVertex.exec(text)) !== null) { | ||
geometry.vertices.push(new THREE.Vector3( | ||
parseFloat(result[1]), | ||
parseFloat(result[3]), | ||
parseFloat(result[5]) | ||
)); | ||
} | ||
|
||
length = geometry.vertices.length; | ||
|
||
geometry.faces.push(new THREE.Face3(length-3, length-2, length-1, normal)); | ||
} | ||
|
||
geometry.computeBoundingBox(); | ||
geometry.computeBoundingSphere(); | ||
|
||
this.onGeometry(geometry); | ||
}; | ||
|
||
STLLoader.prototype.loadBinaryData = function(view, faces) { | ||
if (! view instanceof DataView) { | ||
var view = new DataView(view); | ||
} | ||
|
||
if (! faces) { | ||
try { | ||
var faces = view.getUint32(80, true); | ||
} | ||
catch(error) { | ||
this.onError(error); | ||
return; | ||
} | ||
} | ||
|
||
var dataOffset = 84; | ||
var faceLength = 12 * 4 + 2; | ||
var offset = 0; | ||
var geometry = new THREE.BufferGeometry(); | ||
var vertices = new Float32Array( faces * 3 * 3 ); | ||
var normals = new Float32Array( faces * 3 * 3 ); | ||
|
||
for ( var face = 0; face < faces; face ++ ) { | ||
var start = dataOffset + face * faceLength; | ||
var normalX = view.getFloat32( start, true ); | ||
var normalY = view.getFloat32( start + 4, true ); | ||
var normalZ = view.getFloat32( start + 8, true ); | ||
|
||
for (var i = 1; i <= 3; i ++) { | ||
var vertexstart = start + i * 12; | ||
|
||
normals[ offset ] = normalX; | ||
normals[ offset + 1 ] = normalY; | ||
normals[ offset + 2 ] = normalZ; | ||
|
||
vertices[ offset ] = view.getFloat32( vertexstart, true ); | ||
vertices[ offset + 1 ] = view.getFloat32( vertexstart + 4, true ); | ||
vertices[ offset + 2 ] = view.getFloat32( vertexstart + 8, true ); | ||
|
||
offset += 3; | ||
} | ||
} | ||
|
||
geometry.addAttribute('position', new THREE.BufferAttribute(vertices, 3)); | ||
geometry.addAttribute('normal', new THREE.BufferAttribute(normals, 3)); | ||
|
||
this.onGeometry(geometry); | ||
}; | ||
|
||
// export module | ||
MeshesJS.STLLoader = STLLoader; | ||
|
||
})(); |

Oops, something went wrong.
0 comments on commit
49eab4c