STLLoader.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. /**
  2. * @author aleeper / http://adamleeper.com/
  3. * @author mrdoob / http://mrdoob.com/
  4. *
  5. * Description: A THREE loader for STL ASCII files, as created by Solidworks and other CAD programs.
  6. *
  7. * Limitations: Currently supports ASCII format only
  8. *
  9. * Usage:
  10. * var loader = new THREE.STLLoader();
  11. * loader.addEventListener( 'load', function ( event ) {
  12. *
  13. * var geometry = event.content;
  14. * scene.add( new THREE.Mesh( geometry ) );
  15. *
  16. * } );
  17. * loader.load( './models/stl/slotted_disk.stl' );
  18. */
  19. THREE.STLLoader = function () {
  20. THREE.EventDispatcher.call( this );
  21. };
  22. THREE.STLLoader.prototype = {
  23. constructor: THREE.STLLoader,
  24. load: function ( url, callback ) {
  25. var scope = this;
  26. var request = new XMLHttpRequest();
  27. request.addEventListener( 'load', function ( event ) {
  28. var geometry = scope.parse( event.target.responseText );
  29. scope.dispatchEvent( { type: 'load', content: geometry } );
  30. if ( callback ) callback( geometry );
  31. }, false );
  32. request.addEventListener( 'progress', function ( event ) {
  33. scope.dispatchEvent( { type: 'progress', loaded: event.loaded, total: event.total } );
  34. }, false );
  35. request.addEventListener( 'error', function () {
  36. scope.dispatchEvent( { type: 'error', message: 'Couldn\'t load URL [' + url + ']' } );
  37. }, false );
  38. request.open( 'GET', url, true );
  39. request.send( null );
  40. },
  41. parse: function ( data ) {
  42. var geometry = new THREE.Geometry();
  43. var patternFace = /facet([\s\S]*?)endfacet/g;
  44. var result;
  45. while ( ( result = patternFace.exec( data ) ) != null ) {
  46. var text = result[ 0 ];
  47. // Normal
  48. 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;
  49. while ( ( result = patternNormal.exec( text ) ) != null ) {
  50. var normal = new THREE.Vector3( parseFloat( result[ 1 ] ), parseFloat( result[ 3 ] ), parseFloat( result[ 5 ] ) );
  51. }
  52. // Vertex
  53. 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;
  54. while ( ( result = patternVertex.exec( text ) ) != null ) {
  55. geometry.vertices.push( new THREE.Vector3( parseFloat( result[ 1 ] ), parseFloat( result[ 3 ] ), parseFloat( result[ 5 ] ) ) );
  56. }
  57. var len = geometry.vertices.length;
  58. geometry.faces.push( new THREE.Face3( len - 3, len - 2, len - 1, normal ) );
  59. }
  60. geometry.computeCentroids();
  61. geometry.computeBoundingSphere();
  62. return geometry;
  63. }
  64. };