123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- /**
- * @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 geometry = event.content;
- * scene.add( new THREE.Mesh( geometry ) );
- *
- * } );
- * loader.load( './models/stl/slotted_disk.stl' );
- */
- THREE.STLLoader = function () {
- THREE.EventDispatcher.call( this );
- };
- THREE.STLLoader.prototype = {
- constructor: THREE.STLLoader,
- load: function ( url, callback ) {
- var scope = this;
- var request = new XMLHttpRequest();
- request.addEventListener( 'load', function ( event ) {
- var geometry = scope.parse( event.target.responseText );
- scope.dispatchEvent( { type: 'load', content: geometry } );
- if ( callback ) callback( geometry );
- }, false );
- request.addEventListener( 'progress', function ( event ) {
- scope.dispatchEvent( { type: 'progress', loaded: event.loaded, total: event.total } );
- }, false );
- request.addEventListener( 'error', function () {
- scope.dispatchEvent( { type: 'error', message: 'Couldn\'t load URL [' + url + ']' } );
- }, false );
- request.open( 'GET', url, true );
- request.send( null );
- },
- parse: function ( data ) {
- var geometry = new THREE.Geometry();
- var patternFace = /facet([\s\S]*?)endfacet/g;
- var result;
- while ( ( result = patternFace.exec( data ) ) != null ) {
- var text = result[ 0 ];
- // Normal
- var 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;
- while ( ( result = patternNormal.exec( text ) ) != null ) {
- var normal = new THREE.Vector3( parseFloat( result[ 1 ] ), parseFloat( result[ 3 ] ), parseFloat( result[ 5 ] ) );
- }
- // Vertex
- var 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 = patternVertex.exec( text ) ) != null ) {
- geometry.vertices.push( new THREE.Vector3( parseFloat( result[ 1 ] ), parseFloat( result[ 3 ] ), parseFloat( result[ 5 ] ) ) );
- }
- var len = geometry.vertices.length;
- geometry.faces.push( new THREE.Face3( len - 3, len - 2, len - 1, normal ) );
- }
- geometry.computeCentroids();
- geometry.computeBoundingSphere();
- return geometry;
- }
- };
|