deblan.io-murph/public/stl_viewer/parser.min.js

2 lines
9.6 KiB
JavaScript

//=========== Stl Viewer v1.13, by Omri Rips, Viewstl.com, July 2021 ; admin@viewstl.com ===========
function parse_3d_file(e,r,t,n){var i=null;switch(e.split(".").pop().split("?")[0].toLowerCase()){case"stl":i=parse_stl_bin(r);break;case"obj":i=parse_obj(r);break;case"vf":i=parse_vf(arrayBufferToString(r));break;case"3mf":return void parse_3mf(r,t,n);default:i=parse_stl_bin(r)}t&&t(i)}function arrayBufferToString(e,r,t){if("undefined"!=typeof TextDecoder)return new TextDecoder("utf-8").decode(e);for(var n=new Uint8Array(e),i=n.length,s="",a=0;a<i;a+=16383){var o=16383;a+16383>i&&(o=i-a),s+=String.fromCharCode.apply(null,n.subarray(a,a+o))}return s}function parse_stl_ascii(e){try{var r=arrayBufferToString(e),t=[],n=[],i={};r=(r=(r=(r=(r=(r=(r=(r=(r=(r=(r=(r=r.replace(/\r/,"\n")).replace(/^solid[^\n]*/,"")).replace(/\n/g," ")).replace(/facet normal /g,"")).replace(/outer loop/g,"")).replace(/vertex /g,"")).replace(/endloop/g,"")).replace(/endfacet/g,"")).replace(/endsolid[^\n]*/,"")).replace(/facet/g,"")).replace(/\s+/g," ")).replace(/^\s+/,"");for(var s,a=0,o=r.split(" "),l=[],c=o.length/12-1,f=0;f<c;f++){l=[];for(var d=0;d<3;d++)f1=parseFloat(o[a+3*d+3]),f2=parseFloat(o[a+3*d+4]),f3=parseFloat(o[a+3*d+5]),null==(s=i[[f1,f2,f3]])&&(s=t.length,t.push(new Array(f1,f2,f3)),i[[f1,f2,f3]]=s),l.push(s);n.push(new Array(l[0],l[1],l[2])),a+=12}return{vertices:t,faces:n,colors:!1}}catch(e){return"Can't parse file"}}function parse_stl_bin(e){var r,t,n,i,s,a,o,l=[],c=[],f={};if(!e)return null;var d=arrayBufferToString(e.slice(0,80)).toLowerCase().indexOf("color"),u=new DataView(e,0),p=!0;d>-1&&(def_red_color=u.getUint8(d+6,!0)/31,def_green_color=u.getUint8(d+7,!0)/31,def_blue_color=u.getUint8(d+8,!0)/31);var v=80;try{var _=u.getUint32(v,!0)}catch(e){return"Can't parse file"}var g=84+50*_;if(e.byteLength!=g)return parse_stl_ascii(e);try{for(v+=4;_--;)v+=12,null==(r=f[[t=u.getFloat32(v,!0),n=u.getFloat32(v+4,!0),i=u.getFloat32(v+8,!0)]])&&(r=l.length,l.push(new Array(t,n,i)),f[[t,n,i]]=r),s=r,v+=12,null==(r=f[[t=u.getFloat32(v,!0),n=u.getFloat32(v+4,!0),i=u.getFloat32(v+8,!0)]])&&(r=l.length,l.push(new Array(t,n,i)),f[[t,n,i]]=r),a=r,v+=12,null==(r=f[[t=u.getFloat32(v,!0),n=u.getFloat32(v+4,!0),i=u.getFloat32(v+8,!0)]])&&(r=l.length,l.push(new Array(t,n,i)),f[[t,n,i]]=r),o=r,d>-1?(v+=12,face_color=u.getUint16(v,!0),32768==face_color||65535==face_color?(color_red=def_red_color,color_green=def_green_color,color_blue=def_blue_color):(p=!1,color_red=(31&face_color)/31,color_green=((992&face_color)>>5)/31,color_blue=((31744&face_color)>>10)/31),c.push(new Array(s,a,o,color_red,color_green,color_blue)),v+=2):(c.push(new Array(s,a,o)),v+=14);return f=null,{vertices:l,faces:c,colors:d>-1&&!p}}catch(e){return"Can't parse file"}}function parse_vf(e){var r=JSON.parse(e),t=[],n=[];try{var s=r.vertices.length;for(i=0;i<s;i++)t.push(new Array(r.vertices[i][0],r.vertices[i][1],r.vertices[i][2]));s=r.faces.length;for(i=0;i<s;i++)n.push(new Array(r.faces[i][0],r.faces[i][1],r.faces[i][2]));return{vertices:t,faces:n,colors:!1}}catch(e){return"Can't parse file"}}function init_zip(e,r){var t=null;try{t=new JSZip}catch(r){e&&console.log("JSZip is missing",r.message),t=null}return t||e?t:(importScripts(r),init_zip(!0,r))}function parse_3mf(e,r,t){if("<?xml"==arrayBufferToString(e.slice(0,5)))return parse_3mf_from_txt(arrayBufferToString(e),r);var n=init_zip(!1,t);if(!n)return!1;var i=!1;n.loadAsync(e).then(function(){for(var e=Object.keys(n.files),t=e.length;t--;)"3D/3dmodel.model"==n.files[e[t]].name&&(i=!0,n.files[e[t]].async("text").then(function(e){return parse_3mf_from_txt(e,r)}));i||r("3D/3dmodel.model in 3mf file not found")})}function parse_3mf_from_txt(e,r){var t=[],n=[],i=[],s=[],a=!1,o=/vertex\s+.*(x|y|z)\s*=\s*([0-9,\.\"\+\-e]+)\s+.*(x|y|z)\s*=\s*([0-9,\.\"\+\-e]+)\s+.*(x|y|z)\s*=\s*([0-9,\.\"\+\-e]+)\s*/i,l=/triangle\s+.*(v1|v2|v3)\s*=\s*([0-9\"]+)\s+.*(v1|v2|v3)\s*=\s*([0-9\"]+)\s+.*(v1|v2|v3)\s*=\s*([0-9\"]+)\s*(?:pid=([0-9\"]+)\s+)?(?:p[1|2|3]=([0-9\"]+)\s)?\s*/i,c=/(?:m:\S+|basematerials)\s+id=([0-9\"]+)\s*/i,f=/(?:m:(\S+)|base)\s+.*color=([0-9A-F\"\#]+)\s*/i,d=/<object\s+/i,u=/<component\s+.*objectid=([0-9\"]+)/i,p=/item\s+.*objectid=([0-9\"]+)\s+.*transform=(([0-9\".e-]+\s+){12})/i,v={},_={},g=null,h=0,x=0,y=0,m=/<item\s+.*objectid=([0-9\"]+)/i,b=e.split(/[\r\n]+/g);b.length<5&&(b=e.split(/(?=<)/g));for(var w=!1,A=0;A<b.length;A++){var F=b[A];if(F=F.replace(/"/g,""),U=o.exec(F)){var S={x:0,y:0,z:0};S[U[1]]=U[2],S[U[3]]=U[4],S[U[5]]=U[6],t.push([S.x,S.y,S.z]),x++}else{if(U=l.exec(F)){var B={v1:0,v2:0,v3:0},z=null,I=g?g.v_start_index:0;B[U[1]]=parseInt(U[2])+I,B[U[3]]=parseInt(U[4])+I,B[U[5]]=parseInt(U[6])+I,void 0!==U[7]&&v[U[7]]&&void 0!==U[8]&&v[U[7]]&&v[U[7]].color&&v[U[7]].color[U[8]]&&(z=v[U[7]].color[U[8]].substr(1)),!z&&g&&void 0!==g.pid&&void 0!==g.pindex&&v[g.pid]&&v[g.pid].color&&v[g.pid].color[g.pindex]&&(z=v[g.pid].color[g.pindex].substr(1)),z?(a=!0,z={red:parseInt(z.substr(0,2),16)/255,green:parseInt(z.substr(2,2),16)/255,blue:parseInt(z.substr(4,2),16)/255},n.push([B.v1,B.v2,B.v3,z.red,z.green,z.blue])):n.push([B.v1,B.v2,B.v3]),y++}else{if(U=c.exec(F))v[h=U[1]]||(v[h]={});else if(U=u.exec(F)){if(!g)continue;if(!_[U[1]])continue;t=t.concat(JSON.parse(JSON.stringify(t.slice(_[U[1]].v_start_index,_[U[1]].v_end_index+1))));var J=/transform=(([0-9\".e-]+\s+){12})/i.exec(F);if(J&&12==(N=J[1].trim().split(/[ ,]+/)).length){var O=t.length-1;transform_vertices(t,O-(_[U[1]].v_end_index-_[U[1]].v_start_index),O,N)}for(var T=JSON.parse(JSON.stringify(n.slice(_[U[1]].f_start_index,_[U[1]].f_end_index+1))),j=t.length-_[U[1]].v_end_index-1,C=T.length;C--;)T[C][0]+=j,T[C][1]+=j,T[C][2]+=j;n=n.concat(T),x=t.length,y=n.length}else{if(U=d.exec(F)){if(!(U=/id=([0-9\"]+)/i.exec(F)))continue;g&&(g.v_end_index=x-1),g&&(g.f_end_index=y-1);var L={};L.id=U[1],L.v_start_index=x,L.f_start_index=y,(U=/pid=([0-9\"]+)/i.exec(F))&&(L.pid=parseInt(U[1])),(U=/pindex=([0-9\"]+)/i.exec(F))&&(L.pindex=parseInt(U[1])),_[(g=L).id]=g}else{if(U=f.exec(F)){if(void 0===U[1]&&(U[1]="color"),!v[h]){console.log("warning: no source id for "+U[1]);continue}v[h][U[1]]||(v[h][U[1]]=[]),v[h][U[1]].push(U[2])}else{var U;if("<build>"!=F.trim())if("</build>"!=F.trim()){if(w)if(U=m.exec(F)){if(!_[U[1]])continue;var N,M=void 0===_[U[1]].v_end_index?x-1:_[U[1]].v_end_index,D=p.exec(F);D&&12==(N=D[2].trim().split(/[ ,]+/)).length&&transform_vertices(t,_[D[1]].v_start_index,M,N);for(j=(i=i.concat(t.slice(_[U[1]].v_start_index,M+1))).length-M-1,M=void 0===_[U[1]].f_end_index?y-1:_[U[1]].f_end_index,C=(T=JSON.parse(JSON.stringify(n.slice(_[U[1]].f_start_index,M+1)))).length;C--;)T[C][0]+=j,T[C][1]+=j,T[C][2]+=j;s=s.concat(T)}else;}else w=!1;else w=!0}}}}}}r({vertices:i,faces:s,colors:a})}function transform_vertices(e,r,t,n){for(var i=[[],[],[],[]],s=0;s<3;s++)i[0][s]=parseFloat(n[s]);i[0].push(0);for(s=3;s<6;s++)i[1][s-3]=parseFloat(n[s]);i[1].push(0);for(s=6;s<9;s++)i[2][s-6]=parseFloat(n[s]);i[2].push(0);for(s=9;s<12;s++)i[3][s-9]=parseFloat(n[s]);i[3].push(1);for(var a=r;a<=t;a++){var o=matrix_multiply([e[a].concat(1)],i);e[a]=[o[0][0],o[0][1],o[0][2]]}}function matrix_multiply(e,r){console.log();for(var t=e.length,n=e[0].length,i=(r.length,r[0].length),s=new Array(t),a=0;a<t;++a){s[a]=new Array(i);for(var o=0;o<i;++o){s[a][o]=0;for(var l=0;l<n;++l)s[a][o]+=e[a][l]*r[l][o]}}return s}function geo_to_vf(e){var r=[],t=[],n=e.vertices.length;for(i=0;i<n;i++)r.push([e.vertices[i].x,e.vertices[i].y,e.vertices[i].z]);n=e.faces.length;for(i=0;i<n;i++)t.push([e.faces[i].a,e.faces[i].b,e.faces[i].c]);return{vertices:r,faces:t,colors:!1}}function parse_obj(e){var r=arrayBufferToString(e);function t(e,r,t){return new Array(parseFloat(e),parseFloat(r),parseFloat(t))}function n(e){return(e=parseInt(e))>=0?e-1:e+l.length}function i(e,r,t,i){d.push(new Array(n(e),n(r),n(t)))}function s(e,r,t){void 0===e[3]?(i(e[0],e[1],e[2]),void 0!==r&&r.length>0&&(r[0],r[1],r[2])):(void 0!==t&&t.length>0?(i(e[0],e[1],e[3],(t[0],t[1],t[3])),i(e[1],e[2],e[3],(t[1],t[2],t[3]))):(i(e[0],e[1],e[3]),i(e[1],e[2],e[3])),void 0!==r&&r.length>0&&(r[0],r[1],r[3],r[1],r[2],r[3]))}/^o /gm.test(r);for(var a,o,l=[],c=[],f=[],d=[],u=/v( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)/,p=/vn( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)/,v=/vt( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)/,_=/f( +-?\d+)( +-?\d+)( +-?\d+)( +-?\d+)?/,g=/f( +(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+))?/,h=/f( +(-?\d+)\/(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+)\/(-?\d+))?/,x=/f( +(-?\d+)\/\/(-?\d+))( +(-?\d+)\/\/(-?\d+))( +(-?\d+)\/\/(-?\d+))( +(-?\d+)\/\/(-?\d+))?/,y=r.split("\n"),m=0;m<y.length;m++){var b,w=y[m];0!==(w=w.trim()).length&&"#"!==w.charAt(0)&&(null!==(b=u.exec(w))?l.push(t(b[1],b[2],b[3])):null!==(b=p.exec(w))?c.push(t(b[1],b[2],b[3])):null!==(b=v.exec(w))?f.push((a=b[1],o=b[2],new Array(parseFloat(a),parseFloat(o)))):null!==(b=_.exec(w))?s([b[1],b[2],b[3],b[4]]):null!==(b=g.exec(w))?s([b[2],b[5],b[8],b[11]],[b[3],b[6],b[9],b[12]]):null!==(b=h.exec(w))?s([b[2],b[6],b[10],b[14]],[b[3],b[7],b[11],b[15]],[b[4],b[8],b[12],b[16]]):null!==(b=x.exec(w))?s([b[2],b[5],b[8],b[11]],[],[b[3],b[6],b[9],b[12]]):/^o /.test(w)||/^g /.test(w)||/^usemtl /.test(w)||/^mtllib /.test(w)||/^s /.test(w))}return{vertices:l,faces:d,colors:!1}}ArrayBuffer.prototype.slice||(ArrayBuffer.prototype.slice=function(e,r){if(void 0===e&&(e=0),void 0===r&&(r=this.byteLength),e=Math.floor(e),r=Math.floor(r),e<0&&(e+=this.byteLength),r<0&&(r+=this.byteLength),e=Math.min(Math.max(0,e),this.byteLength),(r=Math.min(Math.max(0,r),this.byteLength))-e<=0)return new ArrayBuffer(0);var t=new ArrayBuffer(r-e),n=new Uint8Array(t),i=new Uint8Array(this,e,r-e);return n.set(i),t});