STLLoader.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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 object = event.content;
  14. *
  15. * for ( var i = 0; i < object.children.length; i ++ ) {
  16. *
  17. * object.children[ i ].material = material;
  18. *
  19. * }
  20. *
  21. * scene.add( object );
  22. *
  23. * } );
  24. * loader.load( './models/stl/slotted_disk.stl' );
  25. */
  26. THREE.STLLoader = function () {
  27. THREE.EventTarget.call( this );
  28. };
  29. THREE.STLLoader.prototype = {
  30. constructor: THREE.STLLoader,
  31. load: function ( url ) {
  32. var scope = this;
  33. var xhr = new XMLHttpRequest();
  34. xhr.addEventListener( 'load', function ( event ) {
  35. scope.dispatchEvent( { type: 'load', content: scope.parse( event.target.responseText ) } );
  36. }, false );
  37. xhr.addEventListener( 'progress', function ( event ) {
  38. scope.dispatchEvent( { type: 'progress', loaded: event.loaded, total: event.total } );
  39. }, false );
  40. xhr.addEventListener( 'error', function () {
  41. scope.dispatchEvent( { type: 'error', message: 'Couldn\'t load URL [' + url + ']' } );
  42. }, false );
  43. xhr.open( 'GET', url, true );
  44. xhr.send( null );
  45. },
  46. parse: function ( data ) {
  47. function face3( a, b, c, normals ) {
  48. return new THREE.Face3( a, b, c, normals );
  49. }
  50. var group = new THREE.Object3D();
  51. var geometry = new THREE.Geometry();
  52. var pattern, result;
  53. pattern = /facet([\s\S]*?)endfacet/g;
  54. while ( ( result = pattern.exec( data ) ) != null ) {
  55. facet_text = facet_result[ 0 ];
  56. var face_normal = new THREE.Vector3();
  57. // Normal
  58. 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;
  59. while( ( result = pattern.exec( facet_text ) ) != null ) {
  60. var normal = new THREE.Vector3( +( result[1]), +( result[3] ), +( result[5] ) );
  61. }
  62. // Vertex
  63. 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;
  64. while( ( result = pattern.exec( facet_text ) ) != null ) {
  65. geometry.vertices.push( new THREE.Vector3(+(result[1]), +(result[3]), +(result[ 5 ] ) ) );
  66. }
  67. var len = geometry.vertices.length;
  68. geometry.faces.push( face3( len - 3, len - 2, len - 1, normal ) );
  69. }
  70. geometry.computeCentroids();
  71. group.add( new THREE.Mesh( geometry, new THREE.MeshLambertMaterial() ) );
  72. return group;
  73. }
  74. };