STLLoader.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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
  6. * by Solidworks and other CAD programs.
  7. *
  8. * Limitations: Currently supports ASCII format only
  9. *
  10. * Usage:
  11. * var loader = new THREE.STLLoader();
  12. * loader.addEventListener( 'load', function ( event ) {
  13. * var object = event.content;
  14. * // Optionally apply some sort of material...
  15. * if(material instanceof THREE.Material){
  16. * for ( var i = 0; i < object.children.length; i ++ ) {
  17. * object.children[ i ].material = material;
  18. * }
  19. * }
  20. * object.updateMatrix(); // Not sure if this is needed.
  21. * stl = object;
  22. * init();
  23. * animate();
  24. * } );
  25. * loader.load( './models/stl/slotted_disk.stl' );
  26. *
  27. */
  28. THREE.STLLoader = function () {
  29. THREE.EventTarget.call( this );
  30. };
  31. THREE.STLLoader.prototype = {
  32. constructor: THREE.STLLoader,
  33. load: function ( url ) {
  34. var scope = this;
  35. var xhr = new XMLHttpRequest();
  36. xhr.addEventListener( 'load', function ( event ) {
  37. scope.dispatchEvent( { type: 'load', content: scope.parse( event.target.responseText ) } );
  38. }, false );
  39. xhr.addEventListener( 'progress', function ( event ) {
  40. scope.dispatchEvent( { type: 'progress', loaded: event.loaded, total: event.total } );
  41. }, false );
  42. xhr.addEventListener( 'error', function () {
  43. scope.dispatchEvent( { type: 'error', message: 'Couldn\'t load URL [' + url + ']' } );
  44. }, false );
  45. xhr.open( 'GET', url, true );
  46. xhr.send( null );
  47. },
  48. parse: function ( data ) {
  49. function face3( a, b, c, normals ) {
  50. return new THREE.Face3( a, b, c, normals );
  51. }
  52. var group = new THREE.Object3D();
  53. var geometry = new THREE.Geometry();
  54. var pattern, result;
  55. facet_pattern = /facet([\s\S]*?)endfacet/g;
  56. while ( ( facet_result = facet_pattern.exec( data ) ) != null ) {
  57. facet_text = facet_result[0];
  58. var face_normal = new THREE.Vector3();
  59. // Find the normal info
  60. 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;
  61. while( (normal_result = normal_pattern.exec(facet_text)) != null )
  62. {
  63. //console.log(vsprintf("normal: %f %f %f", [+(normal_result[1]), +(normal_result[3]), +(normal_result[5])]));
  64. var face_normal = new THREE.Vector3( +(normal_result[1]), +(normal_result[3]), +(normal_result[5]) );
  65. //geometry.normals.push(new THREE.Vector3( +(normal_result[1]), +(normal_result[3]), +(normal_result[5])));
  66. }
  67. // Find the vertex info
  68. 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;
  69. while( (vertex_result = vertex_pattern.exec(facet_text)) != null )
  70. {
  71. //console.log(vsprintf("vertex: %f %f %f", [+(vertex_result[1]), +(vertex_result[3]), +(vertex_result[5])]));
  72. geometry.vertices.push(new THREE.Vector3(+(vertex_result[1]), +(vertex_result[3]), +(vertex_result[5])));
  73. }
  74. var len = geometry.vertices.length;
  75. geometry.faces.push( face3(len-3, len-2, len-1, face_normal) );
  76. }
  77. geometry.computeCentroids();
  78. group.add( new THREE.Mesh( geometry, new THREE.MeshLambertMaterial() ) );
  79. return group;
  80. }
  81. };