123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- /**
- * @author aleeper / http://adamleeper.com/
- * @author mrdoob / http://mrdoob.com/
- *
- * Description: A THREE loader for STL ASCII files, as created
- * by Solidworks and other CAD programs.
- *
- * Limitations: Currently supports ASCII format only
- *
- * Usage:
- * var loader = new THREE.STLLoader();
- * loader.addEventListener( 'load', function ( event ) {
- * var object = event.content;
- * // Optionally apply some sort of material...
- * if(material instanceof THREE.Material){
- * for ( var i = 0; i < object.children.length; i ++ ) {
- * object.children[ i ].material = material;
- * }
- * }
- * object.updateMatrix(); // Not sure if this is needed.
- * stl = object;
- * init();
- * animate();
- * } );
- * loader.load( './models/stl/slotted_disk.stl' );
- *
- */
- THREE.STLLoader = function () {
- THREE.EventTarget.call( this );
- };
- THREE.STLLoader.prototype = {
- constructor: THREE.STLLoader,
- load: function ( url ) {
- var scope = this;
- var xhr = new XMLHttpRequest();
- xhr.addEventListener( 'load', function ( event ) {
- scope.dispatchEvent( { type: 'load', content: scope.parse( event.target.responseText ) } );
- }, false );
- xhr.addEventListener( 'progress', function ( event ) {
- scope.dispatchEvent( { type: 'progress', loaded: event.loaded, total: event.total } );
- }, false );
- xhr.addEventListener( 'error', function () {
- scope.dispatchEvent( { type: 'error', message: 'Couldn\'t load URL [' + url + ']' } );
- }, false );
- xhr.open( 'GET', url, true );
- xhr.send( null );
- },
- parse: function ( data ) {
- function face3( a, b, c, normals ) {
- return new THREE.Face3( a, b, c, normals );
- }
- var group = new THREE.Object3D();
- var geometry = new THREE.Geometry();
- var pattern, result;
- facet_pattern = /facet([\s\S]*?)endfacet/g;
- while ( ( facet_result = facet_pattern.exec( data ) ) != null ) {
- facet_text = facet_result[0];
- var face_normal = new THREE.Vector3();
- // Find the normal info
- normal_pattern = /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;
- while( (normal_result = normal_pattern.exec(facet_text)) != null )
- {
- //console.log(vsprintf("normal: %f %f %f", [+(normal_result[1]), +(normal_result[3]), +(normal_result[5])]));
- var face_normal = new THREE.Vector3( +(normal_result[1]), +(normal_result[3]), +(normal_result[5]) );
- //geometry.normals.push(new THREE.Vector3( +(normal_result[1]), +(normal_result[3]), +(normal_result[5])));
- }
- // Find the vertex info
- vertex_pattern = /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( (vertex_result = vertex_pattern.exec(facet_text)) != null )
- {
- //console.log(vsprintf("vertex: %f %f %f", [+(vertex_result[1]), +(vertex_result[3]), +(vertex_result[5])]));
- geometry.vertices.push(new THREE.Vector3(+(vertex_result[1]), +(vertex_result[3]), +(vertex_result[5])));
- }
- var len = geometry.vertices.length;
- geometry.faces.push( face3(len-3, len-2, len-1, face_normal) );
- }
- geometry.computeCentroids();
- group.add( new THREE.Mesh( geometry, new THREE.MeshLambertMaterial() ) );
- return group;
- }
- };
|