STLLoader.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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.EventTarget.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. scope.dispatchEvent( { type: 'load', content: scope.parse( event.target.responseText ) } );
  29. }, false );
  30. request.addEventListener( 'progress', function ( event ) {
  31. scope.dispatchEvent( { type: 'progress', loaded: event.loaded, total: event.total } );
  32. }, false );
  33. request.addEventListener( 'error', function () {
  34. scope.dispatchEvent( { type: 'error', message: 'Couldn\'t load URL [' + url + ']' } );
  35. }, false );
  36. if ( callback ) {
  37. scope.addEventListener( 'load', function ( event ) {
  38. callback( event.content );
  39. } );
  40. }
  41. request.open( 'GET', url, true );
  42. request.send( null );
  43. },
  44. parse: function ( data ) {
  45. var geometry = new THREE.Geometry();
  46. var patternFace = /facet([\s\S]*?)endfacet/g;
  47. var result;
  48. while ( ( result = patternFace.exec( data ) ) != null ) {
  49. var text = result[ 0 ];
  50. // Normal
  51. 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;
  52. while( ( result = patternNormal.exec( text ) ) != null ) {
  53. var normal = new THREE.Vector3( result[ 1 ], result[ 3 ], result[ 5 ] );
  54. }
  55. // Vertex
  56. 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;
  57. while( ( result = patternVertex.exec( text ) ) != null ) {
  58. geometry.vertices.push(
  59. new THREE.Vector3( result[ 1 ], result[ 3 ], result[ 5 ] )
  60. );
  61. }
  62. var len = geometry.vertices.length;
  63. geometry.faces.push( new THREE.Face3( len - 3, len - 2, len - 1, normal ) );
  64. }
  65. geometry.computeCentroids();
  66. geometry.computeBoundingSphere();
  67. return geometry;
  68. }
  69. };