From e4b97cb853381467c1df4544dc2db23f13d49457 Mon Sep 17 00:00:00 2001 From: omrips Date: Mon, 7 Dec 2020 15:28:08 +0200 Subject: [PATCH] Add files via upload --- build/stl_viewer.min.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/stl_viewer.min.js b/build/stl_viewer.min.js index 9e61529..340b861 100644 --- a/build/stl_viewer.min.js +++ b/build/stl_viewer.min.js @@ -1,2 +1,2 @@ -//=========== Stl Viewer v1.11, by Omri Rips, Viewstl.com, November 2020 ; admin@viewstl.com =========== -var stl_viewer_script_path="";function StlViewer(e,t){e||console.log("error: no parent element");var _=this;this.error=null,this.options=t,this.parent_element=e,this.get_opt=function(e,t){return _.options?!1!==_.options[e]&&(_.options[e]?_.options[e]:t):t},this.canvas_width="100%",this.canvas_height="100%",this.bg_color="transparent",this.models_to_add=[],this.models=new Array,this.models_count=0,this.models_ref=new Array,this.allow_drag_and_drop=_.get_opt("allow_drag_and_drop",!0),this.model_loaded_callback=null,this.all_loaded_callback=null,this.load_error_callback=null,this.loading_progress_callback=null,this.max_model_id=0,this.load_status=new Array,this.load_session=0,this.loaded_models_arr=new Array,this.status=0,this.onmousedown_callback=null,this.zoom=-1,this.camerax=0,this.cameray=0,this.cameraz=0,this.camera_state=null,this.auto_rotate=!1,this.mouse_zoom=!0,this.load_three_files=_.get_opt("load_three_files",stl_viewer_script_path),this.ready="undefined"!=typeof THREE,this.ready_callback=null,this.auto_resize=!0,this.on_model_drop=null,this.center_models=!0,this.controls_type=0,this.zoom=-1,this.pre_loaded_ab_files=null,this.pre_loaded_vsj=null,this.zip_load_count=-1,this.send_no_model_click_event=!1,this.grid=null,this.set_on_model_mousedown=function(e){_.onmousedown_callback=e,_.onmousedown_callback&&(_.parent_element.addEventListener("mousedown",_.onmousedown),_.parent_element.addEventListener("touchstart",_.onmousedown))},this.set_drag_and_drop=function(e){e?(_.parent_element.addEventListener("dragover",_.handleDragOver),_.parent_element.addEventListener("drop",_.handleFileDrop)):(_.parent_element.removeEventListener("dragover",_.handleDragOver),_.parent_element.removeEventListener("drop",_.handleFileDrop))},this.set_options=function(){_.canvas_width=_.get_opt("width",_.canvas_width),_.canvas_height=_.get_opt("height",_.canvas_height),_.bg_color=_.get_opt("bg_color",_.bg_color),_.models_to_add=_.get_opt("models",_.models_to_add),_.model_loaded_callback=_.get_opt("model_loaded_callback",_.model_loaded_callback),_.all_loaded_callback=_.get_opt("all_loaded_callback",_.all_loaded_callback),_.load_error_callback=_.get_opt("load_error_callback",_.load_error_callback),_.loading_progress_callback=_.get_opt("loading_progress_callback",_.loading_progress_callback),_.onmousedown_callback=_.get_opt("on_model_mousedown",_.onmousedown_callback),_.onmousedown_callback||(_.onmousedown_callback=_.get_opt("on_model_mouseclick",null)),_.send_no_model_click_event=_.get_opt("send_no_model_click_event",_.send_no_model_click_event),_.zoom=_.get_opt("zoom",_.zoom),_.camerax=_.get_opt("camerax",_.camerax),_.cameray=_.get_opt("cameray",_.cameray),_.auto_rotate=_.get_opt("auto_rotate",_.auto_rotate),_.mouse_zoom=_.get_opt("mouse_zoom",_.mouse_zoom),_.ready_callback=_.get_opt("ready_callback",null),_.auto_resize=_.get_opt("auto_resize",_.auto_resize),_.on_model_drop=_.get_opt("on_model_drop",_.on_model_drop),_.center_models=_.get_opt("center_models",_.center_models),_.controls_type=_.get_opt("controls",_.controls_type),_.grid=_.get_opt("grid",!!_.grid),0<=_.zoom?_.cameraz=_.zoom:_.cameraz=_.get_opt("cameraz",_.cameraz),_.camera_state=_.get_opt("camera_state",_.camera_state),_.allow_drag_and_drop&&_.set_drag_and_drop(!0)},_.is_ie=!!window.MSStream,this.MSG2WORKER_DATA=0,this.MSG2WORKER_LOAD=1,this.MSG2WORKER_ERROR=2,this.MSGFROMWORKER_STL_LOADED=3,this.MSGFROMWORKER_LOAD_IN_PROGRESS=4,this.load_model=function(e){return _.max_model_id=Math.max(_.max_model_id,e.id),e.filename||e.local_file?_.load_from_stl_file(e,!1):e.mesh?_.add_from_existing_mesh(e):void _.models_count--},this.add_from_existing_mesh=function(e){_.set_model_custom_props(e),e.mesh.model_id=e.id,_.set_geo_minmax(e),_.recalc_dims(e),e.color="#"+e.mesh.material.color.getHexString(),_.scene.add(e.mesh),_.model_loaded(e.id),_.check_loading_status(e,0,0),e.mesh.geometry.boundingBox||e.mesh.geometry.computeBoundingBox(),_.model_loaded_callback&&_.model_loaded_callback(e.id)},this.load_from_stl_file=function(a){var i=new Worker(("string"==typeof _.load_three_files?_.load_three_files:"")+"load_stl.min.js");i.onmessage=function(e){switch(e.data.msg_type){case _.MSGFROMWORKER_STL_LOADED:a.colors=e.data.colors;var t,o=_.vf_to_geo(e.data.vertices,e.data.faces,!!e.data.colors&&e.data.colors);o?(t=new THREE.MeshLambertMaterial({color:9474192,wireframe:!1,vertexColors:a.color?THREE.NoColors:THREE.FaceColors}),_.is_ie||(t.side=THREE.DoubleSide),a.display||(a.display="flat"),_.set_material_display(a.display,t,o),a.mesh=new THREE.Mesh(o,t),_.set_model_custom_props(a),_.set_geo_minmax(a),a.mesh.model_id=a.id,_.recalc_dims(a),_.scene.add(a.mesh),_.model_loaded(a.id),_.model_loaded_callback&&_.model_loaded_callback(a.id)):console.log("Error VF data "),i.terminate(),i=void 0,_.pre_loaded_ab_files&&a.filename&&_.pre_loaded_ab_files[a.filename]&&delete _.pre_loaded_ab_files[a.filename];break;case _.MSGFROMWORKER_LOAD_IN_PROGRESS:_.check_loading_status(a,e.data.loaded,e.data.total);break;case _.MSG2WORKER_ERROR:_.models_count--,_.model_error("ERROR: "+e.data.data,_.load_error_callback),_.pre_loaded_ab_files&&a.filename&&_.pre_loaded_ab_files[a.filename]&&delete _.pre_loaded_ab_files[a.filename]}},a.bytes_loaded=0,a.bytes_total=0;var e=null;_.pre_loaded_ab_files&&a.filename&&_.pre_loaded_ab_files[a.filename]&&(e=_.pre_loaded_ab_files[a.filename]),i.postMessage({msg_type:_.MSG2WORKER_DATA,data:a,load_from_blob_or_ab:e,get_progress:null!=_.loading_progress_callback}),i.postMessage({msg_type:_.MSG2WORKER_LOAD})},this.model_loaded=function(e){_.loaded_models_arr[e]=1,Object.keys(_.loaded_models_arr).length>=_.models_count&&(_.camera_state?_.camera_state=null:_.set_zoom(),_.set_light(),_.set_grid(!!_.grid),_.load_session++,_.all_loaded_callback&&_.all_loaded_callback())},this.set_grid=function(e,t,o){var a,i;_.grid&&_.scene.remove(_.grid),_.grid=null,e&&((t=t||2.5*Math.max(Math.abs(_.maxx),Math.abs(_.minx)))<=0&&(a=isNaN(window.innerHeight)?window.clientHeight:window.innerHeight,i=isNaN(window.innerWidth)?window.clientWidth:window.innerWidth,t=.8*Math.min(a,i)),o=o||10,_.grid=new THREE.GridHelper(t,o),_.scene.add(_.grid))},this.remove_model=function(e){if(void 0===_.models_ref[e])return _.model_error("remove_model - id not found: "+e);var t=_.models[_.models_ref[e]];t&&(delete _.models[_.models_ref[e]],delete _.models_ref[e],delete _.loaded_models_arr[e],_.max_model_id=-1,Object.keys(_.models_ref).forEach(function(e){_.max_model_id=Math.max(_.models[_.models_ref[e]].id,_.max_model_id)}),_.models_count=Object.keys(_.models).length,_.scene.remove(t.mesh))},this.zoom_done=!1,this.set_zoom=function(e,t){var o;e&&(_.zoom=e),_.zoom_done&&!t||(_.zoom_done=!0,o=Math.max(Math.abs(_.maxx-_.minx),Math.abs(_.maxy-_.miny),Math.abs(_.maxz-_.minz)),_.camera.position.set(_.camera.position.x,_.camera.position.y,0<=_.zoom?_.zoom:2*o))},this.get_camera_state=function(){if(!_.camera)return null;var e=new THREE.Vector3,t=new THREE.Vector3,o=new THREE.Vector3(0,0,0);return e.copy(_.camera.position),t.copy(_.camera.up),_.controls&&o.copy(_.controls.target),{position:e,up:t,target:o}},this.set_camera_state=function(e){if(!_.camera)return null;if(!e)return _.model_error("set_camera_state - no state vector");if(void 0!==e.position){if(void 0===e.position.x)return _.model_error("set_camera_state - invalid position x");if(void 0===e.position.y)return _.model_error("set_camera_state - invalid position y");if(void 0===e.position.z)return _.model_error("set_camera_state - invalid position z");_.camera.position.set(e.position.x,e.position.y,e.position.z)}if(void 0!==e.up){if(void 0===e.up.x)return _.model_error("set_camera_state invalid up x");if(void 0===e.up.y)return _.model_error("set_camera_state invalid up y");if(void 0===e.up.z)return _.model_error("set_camera_state invalid up z");_.camera.up.set(e.up.x,e.up.y,e.up.z)}if(_.controls&&void 0!==e.target){if(void 0===e.target.x)return _.model_error("set_camera_state - invalid target x");if(void 0===e.target.y)return _.model_error("set_camera_state - invalid target y");if(void 0===e.target.z)return _.model_error("set_camera_state - invalid target z");_.controls.target.set(e.target.x,e.target.y,e.target.z)}},this.set_center_models=function(e){_.center_models=e},this.set_light=function(){_.directionalLight.position.x=2*_.maxy,_.directionalLight.position.y=2*_.miny,_.directionalLight.position.z=2*_.maxz,_.pointLight.position.x=(_.miny+_.maxy)/2,_.pointLight.position.y=(_.miny+_.maxy)/2,_.pointLight.position.z=2*_.maxz},this.stop_auto_zoom=function(){_.zoom=_.camera.position.z,_.zoom_done=!0},this.set_camera=function(e,t,o){t&&(_.zoom=t),_.camera.position.set(_.is_empty(e)?_.camera.position.x:e,_.is_empty(t)?_.camera.position.y:t,_.is_empty(o)?_.camera.position.z:o)},this.set_auto_zoom=function(){_.set_zoom(-1)},this.check_loading_status=function(e,t,o){e&&(_.load_status[e.id]={loaded:t,total:o,load_session:_.load_session}),_.loading_progress_callback&&Object.keys(_.load_status).length==_.models_count&&_.loading_progress_callback(_.load_status,_.load_session)},this.set_edges=function(e,t){if(void 0===_.models_ref[e])return _.model_error("set_edges - id not found: "+e);var o=_.models[_.models_ref[e]];o&&_.set_or_update_geo_edges(o,t)},this.set_or_update_geo_edges=function(e,t,o){var a,i;(t&&!o||(e.edges&&_.scene.remove(e.edges),e.edges=null,t))&&(a=!1,o=o||!1,e.edges&&!o||(i=e.mesh.geometry,e.edges=new THREE.LineSegments(new THREE.EdgesGeometry(i),_.edges_material),a=!0),(e.x||e.y||e.z)&&e.edges.position.set(e.x?e.x:0,e.y?e.y:0,e.z?e.z:0),e.edges.rotation.setFromRotationMatrix(e.mesh.matrix),a&&_.scene.add(e.edges))},this.set_model_custom_props=function(e){e.units=e.units?e.units:"mm",_.set_model_units(e.id,e.units,!0),e.x=e.x?e.x:0,e.y=e.y?e.y:0,e.z=e.z?e.z:0,e.mesh.position.set(e.x,e.y,e.z),e.color?_.update_mesh_color(e.mesh,e.color,!1):e.colors&&_.update_mesh_color(e.mesh,"#FFFFFF",!0),e.rotationx=e.rotationx?e.rotationx:0,e.rotationy=e.rotationy?e.rotationy:0,e.rotationz=e.rotationz?e.rotationz:0,(e.rotationx||e.rotationy||e.rotationz)&&_.set_rotation(e.id,e.rotationx,e.rotationy,e.rotationz);var t=void 0!==e.scale?e.scale:1,o=void 0!==e.scalex?e.scalex:t,a=void 0!==e.scaley?e.scaley:t,i=void 0!==e.scalez?e.scalez:t;e.scalex=o,e.scaley=a,e.scalez=i,1==o&&1==a&&1==i||_.scale_geo(e,o,a,i),e.view_edges&&_.set_or_update_geo_edges(e,!0),void 0!==e.opacity&&this.set_material_opacity(e.mesh.material,e.opacity),e.animation&&(_.animation[e.id]=1)},this.set_scale=function(e,t,o,a){if(void 0===_.models_ref[e])return _.model_error("set_scale - id not found: "+e);var i,n,s,r=_.models[_.models_ref[e]];r&&r.mesh&&r.mesh.geometry&&(i=Math.max(r.scalex,.01),n=Math.max(r.scaley,.01),s=Math.max(r.scalez,.01),t&&(r.scalex=Math.max(t,.01)),r.scaley=Math.max(o||t,.01),r.scalez=Math.max(a||t,.01),_.scale_geo(r,r.scalex/i,r.scaley/n,r.scalez/s),r.edges&&_.set_or_update_geo_edges(r,!0,!0))},this.scale_geo=function(e,t,o,a){e.mesh.geometry.scale(t,o,a)},this.recalc_dims=function(e){var t=e.mesh.geometry;_.maxx=_.maxx?Math.max(_.maxx,t.maxx+e.x):t.maxx+e.x,_.maxy=_.maxy?Math.max(_.maxy,t.maxy+e.y):t.maxy+e.y,_.maxz=_.maxz?Math.max(_.maxz,t.maxz+e.z):t.maxz+e.z,_.minx=_.maxx?Math.min(_.minx,t.minx+e.x):t.minx+e.x,_.miny=_.maxy?Math.min(_.miny,t.miny+e.y):t.miny+e.y,_.minz=_.maxz?Math.min(_.minz,t.minz+e.z):t.minz+e.z},this.update_mesh_color=function(e,t,o){null!=e&&("transparent"!=t?(e.traverse(function(e){e.visible=!0}),e.material.vertexColors=o?THREE.FaceColors:THREE.NoColors,o&&!t&&(t="#FFFFFF"),t&&e.material.color.set(parseInt(t.substr(1),16)),e.material.needsUpdate=!0):e.traverse(function(e){e.visible=!1}))},this.set_color=function(e,t){if(void 0===_.models_ref[e])return _.model_error("set_color - id not found: "+e);var o=_.models[_.models_ref[e]];o&&o.mesh&&(t.length<6||("#"!=t.charAt(0)&&(t="#"+t),o.color=t,_.update_mesh_color(o.mesh,t,!t&&o.colors)))},this.error_in_model=function(e){if(!e.id&&0!=e.id&&-1!=e.id)return _.model_error("missing id");if(!Number.isInteger(e.id))return _.model_error("invalid id");if(e.id<-1)return _.model_error("id must be positive");if(!e.filename&&!e.mesh&&!e.local_file){if(!e.name)return _.model_error("missing filename or mesh");e.filename=e.name}return _.models_ref[e.id]?_.model_error("such model ID already exists: "+e.id):null},this.model_error=function(e,t){return console.log(e),_.status=-1,_.error=e,t&&t(e),e},this.set_bg_color=function(e){"transparent"==e?this.renderer.setClearColor(0,0):this.renderer.setClearColor(e,1),_.bg_color=e},this.set_display=function(e,t){if(void 0===_.models_ref[e])return _.model_error("set_display - id not found: "+e);var o=_.models[_.models_ref[e]];o&&(_.set_material_display(t,o.mesh.material,o.mesh.geometry),o.display=t,o.mesh&&(o.mesh.normalsNeedUpdate=!0))},this.set_opacity=function(e,t){if(void 0===_.models_ref[e])return _.model_error("set_display - id not found: "+e);var o=_.models[_.models_ref[e]];o&&(o.opacity=t,this.set_material_opacity(o.mesh.material,t))},this.set_material_opacity=function(e,t){e&&(t<1?(e.opacity=t,e.transparent=!0):(e.opacity=1,e.transparent=!1))},this.onmousedown=function(e){switch(e.stopPropagation(),e.preventDefault(),e.type){case"touchstart":var t=e.touches[0]||e.changedTouches[0];_.mouse.x=(t.pageX-_.parent_element.offsetLeft)/_.parent_element.clientWidth*2-1,_.mouse.y=2*-((t.pageY-_.parent_element.offsetTop)/_.parent_element.clientHeight)+1;break;default:_.mouse.x=(e.clientX-_.parent_element.offsetLeft)/_.parent_element.clientWidth*2-1,_.mouse.y=2*-((e.clientY-_.parent_element.offsetTop)/_.parent_element.clientHeight)+1}_.raycaster.setFromCamera(_.mouse,_.camera);var o=_.raycaster.intersectObjects(_.scene.children);if(0>=0,o=String(void 0!==o?o:" "),e.length>t?String(e):((t-=e.length)>o.length&&(o+=o.repeat(t/o.length)),String(e)+o.slice(0,t))},this.get_normal=function(e,t,o){var a=t.x-e.x,i=t.y-e.y,n=t.z-e.z,s=o.x-e.x,r=o.y-e.y,l=o.z-e.z,d={x:0,y:0,z:0};d.x=i*l-n*r,d.y=n*s-a*l,d.z=a*r-i*s;var _=Math.sqrt(d.x*d.x+d.y*d.y+d.z*d.z);return 0!=_&&(d.x/=_,d.y/=_,d.z/=_),d},this.get_stl_bin=function(e){if(void 0===_.models_ref[e])return _.model_error("get_stl_bin - id not found: "+e);var s=_.models[_.models_ref[e]];if(s&&s.mesh){var r=s.mesh.geometry;if(r){for(var t=new ArrayBuffer(84+50*r.faces.length),l=new DataView(t),o=(new TextEncoder,_.padend("Binary"+(s.colors?" colored":"")+" STL by viewstl.com",80," ")),a=0;a<80;a++)l.setUint8(a,o.charCodeAt(a),!0);l.setUint32(80,r.faces.length,!0);var d=84;return Object.keys(r.faces).forEach(function(e){var t=r.faces[e],o=r.vertices[t.a],a=r.vertices[t.b],i=r.vertices[t.c],n=_.get_normal(o,a,i);l.setFloat32(d,n.x,!0),d+=4,l.setFloat32(d,n.y,!0),d+=4,l.setFloat32(d,n.z,!0),d+=4,l.setFloat32(d,o.x,!0),d+=4,l.setFloat32(d,o.y,!0),d+=4,l.setFloat32(d,o.z,!0),d+=4,l.setFloat32(d,a.x,!0),d+=4,l.setFloat32(d,a.y,!0),d+=4,l.setFloat32(d,a.z,!0),d+=4,l.setFloat32(d,i.x,!0),d+=4,l.setFloat32(d,i.y,!0),d+=4,l.setFloat32(d,i.z,!0),d+=4,s.colors?l.setUint16(d,Math.ceil(31*t.color.r)|Math.ceil(31*t.color.g)<<5|Math.ceil(31*t.color.b)<<10,!0):l.setUint16(d,0,!0),d+=2}),t}}},this.basename=function(e){return e.substr(e.lastIndexOf("/")+1)},this.json_without_nulls=function(e){return JSON.stringify(e).split(",null").join("")},this.download_vsb=function(n){var o=null;try{o=new JSZip}catch(e){return console.log("download_vsb - JSZip is missing ",e.message),!1}var a=_.get_vsb();o.file("json_data.vsj",_.json_without_nulls(a.vsj)),Object.keys(a.files).forEach(function(e){var t=_.get_model_filename(a.vsj.models[_.models_ref[a.files[e].id]],!0,!0);o.file(t,a.files[e].bin)}),o.generateAsync({type:"blob"}).then(function(e){var t=new Blob([e],{type:"application/zip"}),o=document.createElement("a");o.href=window.URL.createObjectURL(t);var a=n||"1",i=a.toLowerCase().indexOf(".vsb");0<=i&&(a=a.substring(0,i)),a.length<1&&(a="1"),window.navigator.msSaveOrOpenBlob?window.navigator.msSaveBlob(t,a+".vsb"):(o.download=a+".vsb",o.click(),URL.revokeObjectURL(o.href))})},this.load_vsb=function(e){if(_.pre_loaded_ab_files=[],_.pre_loaded_vsj=null,e instanceof File)return _.read_bin_file(e,_.load_vsb_from_blob);JSZipUtils.getBinaryContent(decodeURIComponent(e),function(e,t){return e?_.model_error("load_vsb "+e,_.load_error_callback):void _.load_vsb_from_blob(t)})},this.read_bin_file=function(e,t,o,a){var i=new FileReader;i.onerror=function(e){return console.log("reading file error",e),null},i.onload=function(e){return t(e.target.result)},o&&(i.onprogress=function(e){o({loaded:e.loaded,total:e.total,load_session:-1},-1)}),a?i.readAsText(e):i.readAsArrayBuffer(e)},this.load_vsb_from_blob=function(e){var o=null;try{o=new JSZip}catch(e){return console.log("load vsb - JSZip is missing ",e.message),!1}o.loadAsync(e).then(function(){_.zip_load_count=Object.keys(o.files).length,o.forEach(function(e,t){"json_data.vsj"==t.name?o.files[t.name].async("string").then(function(e){_.pre_loaded_vsj=e,_.zip_load_count--,0==_.zip_load_count&&_.load_vsj(null)}):o.files[t.name].async("blob").then(function(e){_.pre_loaded_ab_files[t.name]=e,_.zip_load_count--,0==_.zip_load_count&&_.load_vsj(null)})})})},this.load_bin_to_ab_file=function(e,t){_.pre_loaded_ab_files||(_.pre_loaded_ab_files=[]),_.pre_loaded_ab_files[e]=t,_.add_model({id:-1,filename:e})},this.download_model=function(e,t){if(void 0===_.models_ref[e])return _.model_error("download_model - id not found: "+e);var o,a,i,n,s=_.models[_.models_ref[e]];s&&s.mesh&&(o=new Blob([_.get_stl_bin(e)],{type:"application/sla"}),(a=document.createElement("a")).href=window.URL.createObjectURL(o),0<=(n=(i=_.get_model_filename(s,!0,!0,!0)).toLowerCase().indexOf(".stl"))&&(i=i.substring(0,n)),i.length<1&&(i="1"),window.navigator.msSaveOrOpenBlob?window.navigator.msSaveBlob(o,i+".stl"):(a.download=i+".stl",a.click(),URL.revokeObjectURL(a.href)))},this.get_model_mesh=function(e){if(void 0===_.models_ref[e])return _.model_error("get_model_mesh - id not found: "+e);var t=_.models[_.models_ref[e]];if(t&&t.mesh){var o=t.mesh.clone();return o.geometry=t.mesh.geometry.clone(),o.material=t.mesh.material.clone(),o}},this.set_auto_rotate=function(e){_.controls.autoRotate=e},this.set_mouse_zoom=function(e){_.controls.noZoom=!e},this.WORLD_X_VECTOR=null,this.WORLD_Y_VECTOR=null,this.WORLD_Z_VECTOR=null,this.maxx=null,this.maxy=null,this.maxz=null,this.minx=null,this.miny=null,this.minz=null,this.edges_material=null,this.raycaster=null,this.mouse=null,this.scene=null,this.is_webgl=null,this.renderer=null,this.camera=null,this.ambientLight=null,this.directionalLight=null,this.pointLight=null,this.controls=null,this.do_resize=function(){var e=_.parent_element.getBoundingClientRect(),t=e.width,o=e.height;_.camera.aspect=t/o,_.camera.updateProjectionMatrix(),_.renderer.setSize(t-5,o-5)},this.animation=new Array,this.animate=function(){Object.keys(_.animation).forEach(function(e){void 0!==_.models_ref[e]&&_.do_model_animation(_.models[_.models_ref[e]])}),requestAnimationFrame(_.animate),_.renderer.render(_.scene,_.camera),_.controls&&_.controls.update()},this.do_model_animation=function(e){if(e.animation){var t=Date.now();if(e.animation.start_time||(e.animation.start_time=t),e.animation.delta){var o=(t-e.animation.start_time)/e.animation.delta.msec,a=e.animation.last_time?(t-e.animation.last_time)/e.animation.delta.msec:o;if(_.animation_next_delta(e,e.animation.delta,a),1<=o){if(!e.animation.delta.loop)return void _.remove_model_animation(e,!0);e.animation.delta.start_time=null}}if(e.animation.exact){a=(t-(e.animation.last_time?e.animation.last_time:e.animation.start_time))/e.animation.exact.msec;if(_.animation_next_exact(e,e.animation.exact,a),t>=e.animation.start_time+e.animation.exact.msec)return void _.remove_model_animation(e,!1,!0)}e.animation.last_time=t}},this.animation_next_delta=function(t,o,a){var i=!1,n=!1,s=!1;Object.keys(o).forEach(function(e){switch(e){case"x":case"y":case"z":i||(i=!0,_.set_position(t.id,t.x+(void 0!==o.x?o.x*a:0),t.y+(void 0!==o.y?o.y*a:0),t.z+(void 0!==o.z?o.z*a:0)));break;case"rotationx":case"rotationy":case"rotationz":n||(n=!0,_.rotate(t.id,void 0!==o.rotationx?o.rotationx*a:0,void 0!==o.rotationy?o.rotationy*a:0,void 0!==o.rotationz?o.rotationz*a:0));break;case"scale":case"scalex":case"scaley":case"scalez":s||(s=!0,o.scalex=o.scalex?o.scalex:o.scale?o.scale:null,o.scaley=o.scaley?o.scaley:o.scale?o.scale:null,o.scalez=o.scalez?o.scalez:o.scale?o.scale:null,_.set_scale(t.id,t.scalex+(void 0!==o.scalex?o.scalex*a:0),t.scaley+(void 0!==o.scaley?o.scaley*a:0),t.scalez+(void 0!==o.scalez?o.scalez*a:0)))}})},this.animation_next_exact=function(o,a,i){var n=!1,s=!1,r=!1;Object.keys(a).forEach(function(e){switch(e){case"x":case"y":case"z":n||(n=!0,void 0===a.xtotal&&(a.xtotal=a.x-o.x),void 0===a.ytotal&&(a.ytotal=a.y-o.y),void 0===a.ztotal&&(a.ztotal=a.z-o.z),_.set_position(o.id,o.x+(void 0!==a.x?a.xtotal*i:0),o.y+(void 0!==a.y?a.ytotal*i:0),o.z+(void 0!==a.z?a.ztotal*i:0)));break;case"rotationx":case"rotationy":case"rotationz":var t;s||(s=!0,t=o.mesh.getWorldRotation(),void 0===a.rotxtotal&&(a.rotxtotal=a.rotationx-t.x),void 0===a.rotytotal&&(a.rotytotal=a.rotationy-t.y),void 0===a.rotztotal&&(a.rotztotal=a.rotationz-t.z),_.rotate(o.id,void 0!==a.rotationx?a.rotxtotal*i:0,void 0!==a.rotationy?a.rotytotal*i:0,void 0!==a.rotationz?a.rotztotal*i:0));break;case"scale":case"scalex":case"scaley":case"scalez":r||(r=!0,a.scalex=a.scalex?a.scalex:a.scale?a.scale:null,a.scaley=a.scaley?a.scaley:a.scale?a.scale:null,a.scalez=a.scalez?a.scalez:a.scale?a.scale:null,void 0===a.scalextotal&&(a.scalextotal=a.scalex-o.scalex),void 0===a.scaleytotal&&(a.scaleytotal=a.scaley-o.scaley),void 0===a.scaleztotal&&(a.scaleztotal=a.scalez-o.scalez),_.set_scale(o.id,o.scalex+(void 0!==a.scalex?a.scalextotal*i:0),o.scaley+(void 0!==a.scaley?a.scaleytotal*i:0),o.scalez+(void 0!==a.scalez?a.scaleztotal*i:0)))}})},this.remove_model_animation=function(e,t,o){t&&(e.animation.delta=null),o&&(e.animation.exact=null),e.animation.delta||e.animation.exact||(e.animation=null,delete _.animation[e.id])},this.animate_model=function(e,t){if(void 0===_.models_ref[e])return _.model_error("animate-model - id not found: "+e);var o=_.models[_.models_ref[e]];if(o){if(!t)return _.remove_model_animation(o,!0,!0);o.animation=JSON.parse(JSON.stringify(t)),o.animation.delta&&(o.animation.delta.msec||(o.animation.delta.msec=300)),o.animation.exact&&(o.animation.exact.msec||(o.animation.exact.msec=300)),_.animation[e]=1}},this.init_done=!1,this.init=function(){if(!_.init_done){switch(_.WORLD_X_VECTOR=new THREE.Vector3(1,0,0),_.WORLD_Y_VECTOR=new THREE.Vector3(0,1,0),_.WORLD_Z_VECTOR=new THREE.Vector3(0,0,1),_.edges_material=new THREE.LineBasicMaterial({color:0}),_.raycaster=new THREE.Raycaster,_.mouse=new THREE.Vector2,_.scene=new THREE.Scene,_.is_webgl=webgl_Detector.webgl,_.renderer=_.is_webgl?new THREE.WebGLRenderer({preserveDrawingBuffer:!0,alpha:!0}):new THREE.CanvasRenderer({alpha:!0}),_.camera=new THREE.PerspectiveCamera(45,1,.1,1e4),_.parent_element.appendChild(_.renderer.domElement),_.scene.add(_.camera),_.ambientLight=new THREE.AmbientLight(2105376),_.camera.add(_.ambientLight),_.directionalLight=new THREE.DirectionalLight(16777215,.75),_.directionalLight.position.x=1,_.directionalLight.position.y=1,_.directionalLight.position.z=2,_.directionalLight.position.normalize(),_.camera.add(_.directionalLight),_.pointLight=new THREE.PointLight(16777215,.3),_.pointLight.position.x=0,_.pointLight.position.y=-25,_.pointLight.position.z=10,_.camera.add(_.pointLight),_.controls_type){case 1:_.controls=new THREE.TrackballControls(_.camera,_.renderer.domElement);break;default:_.controls=new THREE.OrbitControls(_.camera,_.renderer.domElement),_.controls.autoRotate=_.auto_rotate}_.set_on_model_mousedown(_.onmousedown_callback)}_.set_bg_color(_.bg_color),!1===_.mouse_zoom&&_.set_mouse_zoom(_.mouse_zoom),_.camera_state?_.set_camera_state(_.camera_state):_.camera.position.set(_.camerax,_.cameray,_.cameraz),_.do_resize(),_.models_to_add&&_.add_models(_.models_to_add),_.set_auto_resize(_.auto_resize),_.animate(),_.init_done=!0},this.set_auto_resize=function(e){_.do_resize&&(window.removeEventListener("resize",_.do_resize),e&&window.addEventListener("resize",_.do_resize))},this.vf_to_geo=function(e,t,o){if(!e)return null;if(!t)return null;var a=[],n=[],s=e.length;for(i=0;is&&(s=o[d].x),o[d].y>r&&(r=o[d].y),o[d].z>l&&(l=o[d].z);t.minx=a+e.x,t.miny=i+e.y,t.minz=n+e.z,t.maxx=s+e.x,t.maxy=r+e.y,t.maxz=l+e.z}},this.handleDragOver=function(e){e.stopPropagation(),e.preventDefault(),e.dataTransfer.dropEffect="copy"},this.handleFileDrop=function(e){e.stopPropagation(),e.preventDefault(),0=0?o.cameraz=o.zoom:o.cameraz=o.get_opt("cameraz",o.cameraz),o.camera_state=o.get_opt("camera_state",o.camera_state),o.allow_drag_and_drop&&o.set_drag_and_drop(!0)},o.is_ie=!!window.MSStream,this.MSG2WORKER_DATA=0,this.MSG2WORKER_LOAD=1,this.MSG2WORKER_ERROR=2,this.MSGFROMWORKER_STL_LOADED=3,this.MSGFROMWORKER_LOAD_IN_PROGRESS=4,this.load_model=function(e){return o.max_model_id=Math.max(o.max_model_id,e.id),e.filename||e.local_file?o.load_from_stl_file(e,!1):e.mesh?o.add_from_existing_mesh(e):void o.models_count--},this.add_from_existing_mesh=function(e){o.set_model_custom_props(e),e.mesh.model_id=e.id,o.set_geo_minmax(e),o.recalc_dims(e),e.color="#"+e.mesh.material.color.getHexString(),o.scene.add(e.mesh),o.model_loaded(e.id),o.check_loading_status(e,0,0),e.mesh.geometry.boundingBox||e.mesh.geometry.computeBoundingBox(),o.model_loaded_callback&&o.model_loaded_callback(e.id)},this.load_from_stl_file=function(e){var t=new Worker(("string"==typeof o.load_three_files?o.load_three_files:"")+"load_stl.min.js");t.onmessage=function(a){switch(a.data.msg_type){case o.MSGFROMWORKER_STL_LOADED:e.colors=a.data.colors;var i=o.vf_to_geo(a.data.vertices,a.data.faces,!!a.data.colors&&a.data.colors);if(i){var n=new THREE.MeshLambertMaterial({color:9474192,wireframe:!1,vertexColors:e.color?THREE.NoColors:THREE.FaceColors});o.is_ie||(n.side=THREE.DoubleSide),e.display||(e.display="flat"),o.set_material_display(e.display,n,i),e.mesh=new THREE.Mesh(i,n),o.set_model_custom_props(e),o.set_geo_minmax(e),e.mesh.model_id=e.id,o.recalc_dims(e),o.scene.add(e.mesh),o.model_loaded(e.id),o.model_loaded_callback&&o.model_loaded_callback(e.id)}else console.log("Error VF data ");t.terminate(),t=void 0,o.pre_loaded_ab_files&&e.filename&&o.pre_loaded_ab_files[e.filename]&&delete o.pre_loaded_ab_files[e.filename];break;case o.MSGFROMWORKER_LOAD_IN_PROGRESS:o.check_loading_status(e,a.data.loaded,a.data.total);break;case o.MSG2WORKER_ERROR:o.models_count--,o.model_error("ERROR: "+a.data.data,o.load_error_callback),o.pre_loaded_ab_files&&e.filename&&o.pre_loaded_ab_files[e.filename]&&delete o.pre_loaded_ab_files[e.filename]}},e.bytes_loaded=0,e.bytes_total=0;var a=null;o.pre_loaded_ab_files&&e.filename&&o.pre_loaded_ab_files[e.filename]&&(a=o.pre_loaded_ab_files[e.filename]),t.postMessage({msg_type:o.MSG2WORKER_DATA,data:e,load_from_blob_or_ab:a,get_progress:null!=o.loading_progress_callback}),t.postMessage({msg_type:o.MSG2WORKER_LOAD})},this.model_loaded=function(e){o.loaded_models_arr[e]=1,Object.keys(o.loaded_models_arr).length>=o.models_count&&(o.camera_state?o.camera_state=null:o.set_zoom(),o.set_light(),o.set_grid(!!o.grid),o.load_session++,o.all_loaded_callback&&o.all_loaded_callback())},this.set_grid=function(e,t,a){if(o.grid&&o.scene.remove(o.grid),o.grid=null,e){if(t||(t=2.5*Math.max(Math.abs(o.maxx),Math.abs(o.minx))),t<=0){var i=isNaN(window.innerHeight)?window.clientHeight:window.innerHeight,n=isNaN(window.innerWidth)?window.clientWidth:window.innerWidth;t=.8*Math.min(i,n)}a||(a=10),o.grid=new THREE.GridHelper(t,a),o.scene.add(o.grid)}},this.remove_model=function(e){if(void 0===o.models_ref[e])return o.model_error("remove_model - id not found: "+e);var t=o.models[o.models_ref[e]];t&&(delete o.models[o.models_ref[e]],delete o.models_ref[e],delete o.loaded_models_arr[e],o.max_model_id=-1,Object.keys(o.models_ref).forEach(function(e){o.max_model_id=Math.max(o.models[o.models_ref[e]].id,o.max_model_id)}),o.models_count=Object.keys(o.models).length,o.scene.remove(t.mesh))},this.zoom_done=!1,this.set_zoom=function(e,t){if(e&&(o.zoom=e),!o.zoom_done||t){o.zoom_done=!0;var a=Math.max(Math.abs(o.maxx-o.minx),Math.abs(o.maxy-o.miny),Math.abs(o.maxz-o.minz));o.camera.position.set(o.camera.position.x,o.camera.position.y,o.zoom>=0?o.zoom:2*a)}},this.get_camera_state=function(){if(!o.camera)return null;var e=new THREE.Vector3,t=new THREE.Vector3,a=new THREE.Vector3(0,0,0);return e.copy(o.camera.position),t.copy(o.camera.up),o.controls&&a.copy(o.controls.target),{position:e,up:t,target:a}},this.set_camera_state=function(e){if(!o.camera)return null;if(!e)return o.model_error("set_camera_state - no state vector");if(void 0!==e.position){if(void 0===e.position.x)return o.model_error("set_camera_state - invalid position x");if(void 0===e.position.y)return o.model_error("set_camera_state - invalid position y");if(void 0===e.position.z)return o.model_error("set_camera_state - invalid position z");o.camera.position.set(e.position.x,e.position.y,e.position.z)}if(void 0!==e.up){if(void 0===e.up.x)return o.model_error("set_camera_state invalid up x");if(void 0===e.up.y)return o.model_error("set_camera_state invalid up y");if(void 0===e.up.z)return o.model_error("set_camera_state invalid up z");o.camera.up.set(e.up.x,e.up.y,e.up.z)}if(o.controls&&void 0!==e.target){if(void 0===e.target.x)return o.model_error("set_camera_state - invalid target x");if(void 0===e.target.y)return o.model_error("set_camera_state - invalid target y");if(void 0===e.target.z)return o.model_error("set_camera_state - invalid target z");o.controls.target.set(e.target.x,e.target.y,e.target.z)}},this.set_center_models=function(e){o.center_models=e},this.set_light=function(){o.directionalLight.position.x=2*o.maxy,o.directionalLight.position.y=2*o.miny,o.directionalLight.position.z=2*o.maxz,o.pointLight.position.x=(o.miny+o.maxy)/2,o.pointLight.position.y=(o.miny+o.maxy)/2,o.pointLight.position.z=2*o.maxz},this.stop_auto_zoom=function(){o.zoom=o.camera.position.z,o.zoom_done=!0},this.set_camera=function(e,t,a){t&&(o.zoom=t),o.camera.position.set(o.is_empty(e)?o.camera.position.x:e,o.is_empty(t)?o.camera.position.y:t,o.is_empty(a)?o.camera.position.z:a)},this.set_auto_zoom=function(){o.set_zoom(-1)},this.check_loading_status=function(e,t,a){e&&(o.load_status[e.id]={loaded:t,total:a,load_session:o.load_session}),o.loading_progress_callback&&Object.keys(o.load_status).length==o.models_count&&o.loading_progress_callback(o.load_status,o.load_session)},this.set_edges=function(e,t){if(void 0===o.models_ref[e])return o.model_error("set_edges - id not found: "+e);var a=o.models[o.models_ref[e]];a&&o.set_or_update_geo_edges(a,t)},this.set_or_update_geo_edges=function(e,t,a){if(t&&!a||(e.edges&&o.scene.remove(e.edges),e.edges=null,t)){var i=!1;if(a=a||!1,!e.edges||a){var n=e.mesh.geometry;e.edges=new THREE.LineSegments(new THREE.EdgesGeometry(n),o.edges_material),i=!0}(e.x||e.y||e.z)&&e.edges.position.set(e.x?e.x:0,e.y?e.y:0,e.z?e.z:0),e.edges.rotation.setFromRotationMatrix(e.mesh.matrix),i&&o.scene.add(e.edges)}},this.set_model_custom_props=function(e){e.units=e.units?e.units:"mm",o.set_model_units(e.id,e.units,!0),e.x=e.x?e.x:0,e.y=e.y?e.y:0,e.z=e.z?e.z:0,e.mesh.position.set(e.x,e.y,e.z),e.color?o.update_mesh_color(e.mesh,e.color,!1):e.colors&&o.update_mesh_color(e.mesh,"#FFFFFF",!0),e.rotationx=e.rotationx?e.rotationx:0,e.rotationy=e.rotationy?e.rotationy:0,e.rotationz=e.rotationz?e.rotationz:0,(e.rotationx||e.rotationy||e.rotationz)&&o.set_rotation(e.id,e.rotationx,e.rotationy,e.rotationz);var t=void 0!==e.scale?e.scale:1,a=void 0!==e.scalex?e.scalex:t,i=void 0!==e.scaley?e.scaley:t,n=void 0!==e.scalez?e.scalez:t;e.scalex=a,e.scaley=i,e.scalez=n,1==a&&1==i&&1==n||o.scale_geo(e,a,i,n),e.view_edges&&o.set_or_update_geo_edges(e,!0),void 0!==e.opacity&&this.set_material_opacity(e.mesh.material,e.opacity),e.animation&&(o.animation[e.id]=1)},this.set_scale=function(e,t,a,i){if(void 0===o.models_ref[e])return o.model_error("set_scale - id not found: "+e);var n=o.models[o.models_ref[e]];if(n&&n.mesh&&n.mesh.geometry){var s=Math.max(n.scalex,.01),r=Math.max(n.scaley,.01),l=Math.max(n.scalez,.01);t&&(n.scalex=Math.max(t,.01)),n.scaley=Math.max(a||t,.01),n.scalez=Math.max(i||t,.01),o.scale_geo(n,n.scalex/s,n.scaley/r,n.scalez/l),n.edges&&o.set_or_update_geo_edges(n,!0,!0)}},this.scale_geo=function(e,t,o,a){e.mesh.geometry.scale(t,o,a)},this.recalc_dims=function(e){var t=e.mesh.geometry;o.maxx=o.maxx?Math.max(o.maxx,t.maxx+e.x):t.maxx+e.x,o.maxy=o.maxy?Math.max(o.maxy,t.maxy+e.y):t.maxy+e.y,o.maxz=o.maxz?Math.max(o.maxz,t.maxz+e.z):t.maxz+e.z,o.minx=o.maxx?Math.min(o.minx,t.minx+e.x):t.minx+e.x,o.miny=o.maxy?Math.min(o.miny,t.miny+e.y):t.miny+e.y,o.minz=o.maxz?Math.min(o.minz,t.minz+e.z):t.minz+e.z},this.update_mesh_color=function(e,t,o){null!=e&&("transparent"!=t?(e.traverse(function(e){e.visible=!0}),e.material.vertexColors=o?THREE.FaceColors:THREE.NoColors,o&&!t&&(t="#FFFFFF"),t&&e.material.color.set(parseInt(t.substr(1),16)),e.material.needsUpdate=!0):e.traverse(function(e){e.visible=!1}))},this.set_color=function(e,t){if(void 0===o.models_ref[e])return o.model_error("set_color - id not found: "+e);var a=o.models[o.models_ref[e]];a&&a.mesh&&(t.length<6||("#"!=t.charAt(0)&&(t="#"+t),a.color=t,o.update_mesh_color(a.mesh,t,!t&&a.colors)))},this.error_in_model=function(e){if(!e.id&&0!=e.id&&-1!=e.id)return o.model_error("missing id");if(!Number.isInteger(e.id))return o.model_error("invalid id");if(e.id<-1)return o.model_error("id must be positive");if(!e.filename&&!e.mesh&&!e.local_file){if(!e.name)return o.model_error("missing filename or mesh");e.filename=e.name}return o.models_ref[e.id]?o.model_error("such model ID already exists: "+e.id):null},this.model_error=function(e,t){return console.log(e),o.status=-1,o.error=e,t&&t(e),e},this.set_bg_color=function(e){"transparent"==e?this.renderer.setClearColor(0,0):this.renderer.setClearColor(e,1),o.bg_color=e},this.set_display=function(e,t){if(void 0===o.models_ref[e])return o.model_error("set_display - id not found: "+e);var a=o.models[o.models_ref[e]];a&&(o.set_material_display(t,a.mesh.material,a.mesh.geometry),a.display=t,a.mesh&&(a.mesh.normalsNeedUpdate=!0))},this.set_opacity=function(e,t){if(void 0===o.models_ref[e])return o.model_error("set_display - id not found: "+e);var a=o.models[o.models_ref[e]];a&&(a.opacity=t,this.set_material_opacity(a.mesh.material,t))},this.set_material_opacity=function(e,t){e&&(t<1?(e.opacity=t,e.transparent=!0):(e.opacity=1,e.transparent=!1))},this.onmousedown=function(e){e.stopPropagation(),e.preventDefault();var t=e.which;switch(e.type){case"touchstart":t=20;var a=e.touches[0]||e.changedTouches[0];o.mouse.x=(a.pageX-o.parent_element.offsetLeft)/o.parent_element.clientWidth*2-1,o.mouse.y=-(a.pageY-o.parent_element.offsetTop)/o.parent_element.clientHeight*2+1;break;case"dblclick":t=11;default:o.mouse.x=(e.clientX-o.parent_element.offsetLeft)/o.parent_element.clientWidth*2-1,o.mouse.y=-(e.clientY-o.parent_element.offsetTop)/o.parent_element.clientHeight*2+1}o.raycaster.setFromCamera(o.mouse,o.camera);var i=o.raycaster.intersectObjects(o.scene.children);if(i.length>0){if(void 0===i[0].object.model_id)return;o.onmousedown_callback&&o.onmousedown_callback(i[0].object.model_id,e,i[0].distance,t)}else o.send_no_model_click_event&&o.onmousedown_callback(null,e,0,t)},this.is_empty=function(e){return!e&&0!==e},this.set_model_units=function(e,t,a){if(void 0===o.models_ref[e])return o.model_error("set_model_units - id not found: "+e);var i=o.models[o.models_ref[e]];if(i&&i.mesh){var n=1;switch(t){case"mm":a&&"inch"==i.units&&(n=1/25.4),i.units="mm";break;case"inch":a&&"mm"==i.units&&(n=25.4),i.units="inch";break;default:return o.model_error("set_model_units - invalid unit "+t)}1!=n&&o.set_scale(i.id,i.scalex*n,i.scaley*n,i.scalez*n)}},this.set_position=function(e,t,a,i){if(void 0===o.models_ref[e])return o.model_error("set_position - id not found: "+e);var n=o.models[o.models_ref[e]];n&&n.mesh&&(n.x=o.is_empty(t)?n.x:t,n.y=o.is_empty(a)?n.y:a,n.z=o.is_empty(i)?n.z:i,n.mesh.position.set(n.x,n.y,n.z),n.edges&&o.set_or_update_geo_edges(n,!0,!0))},this.set_material_display=function(e,t,o){switch(e.toLowerCase()){case"wireframe":t.wireframe=!0;break;case"smooth":t.wireframe=!1,t.flatShading=!1,o&&(o.mergeVertices(),o.computeVertexNormals());break;case"flat":t.wireframe=!1,t.flatShading=!0,o&&o.computeFlatVertexNormals()}},this.set_rotation=function(e,t,a,i,n){if(void 0===o.models_ref[e])return o.model_error("rotate - id not found: "+e);var s=o.models[o.models_ref[e]];if(s){var r=n?1:0;void 0!==t&&(s.rotationx=t+s.mesh.rotation.x*r,s.mesh.rotation.x=s.rotationx),void 0!==a&&(s.rotationy=a+s.mesh.rotation.y*r,s.mesh.rotation.y=s.rotationy),void 0!==i&&(s.rotationz=i+s.mesh.rotation.z*r,s.mesh.rotation.z=s.rotationz),s.mesh.updateMatrixWorld(),s.edges&&o.set_or_update_geo_edges(s,!0)}},this.rotate=function(e,t,a,i){o.set_rotation(e,t,a,i,!0)},this.basename=function(e){return e.split(/[\\\/]/).pop()},this.get_model_filename=function(e,t,a,i){var n=null;return e.orig_url&&!i?n=decodeURIComponent(e.orig_url):e.orig_filename?n=e.orig_filename:e.temp_filename?n=e.temp_filename:e.local_file?e.local_file.name&&(n=e.local_file.name):e.filename&&(e.filename instanceof File&&(n=File.name),n=e.filename),!n&&t?"model_"+e.id+".stl":n?(a&&(n=o.basename(n)),n):null},this.add_model=function(e,t){if(Array.isArray(e))return o.add_models(e);if(!o.ready)return o.models_to_add.push(e),o.model_error("THREE JS files are not ready");var a=o.get_model_filename(e);if(a)switch(a.split(".").pop()){case"vsj":return o.load_vsj(e.local_file?e.local_file:a);case"vsb":return o.load_vsb(e.local_file?e.local_file:a)}void 0===e.id&&(e.id=-1);var i=o.error_in_model(e);if(i)return i;-1==e.id&&(e.id=++o.max_model_id),o.models.push(e);var n=o.models.indexOf(e);return t||void 0===o.models_ref[e.id]&&o.models_count++,o.models_ref[e.id]=n,o.load_model(e),o.status},this.add_models=function(e){if(!Array.isArray(e))return o.add_model(e);o.status=0;var t=Object.keys(e);return t.forEach(function(a){var i=o.get_model_filename(e[t[a]]);if(i)switch(i.split(".").pop()){case"vsj":case"vsb":break;default:void 0===o.models_ref[e[a].id]&&o.models_count++}else void 0===o.models_ref[e[a].id]&&o.models_count++}),t.forEach(function(t){o.add_model(e[t],!0)}),o.status},this.calc_volume_and_area=function(e,t){var o,a,i,n,s,r,l,d,_,c,m,u,f,h,p=e.faces.length,g=0,v=0;for(c=0;c=0&&(i=i.substring(0,n)),i.length<1&&(i="1"),window.navigator.msSaveOrOpenBlob?window.navigator.msSaveBlob(t,i+".vsj"):(a.download=i+".vsj",a.click(),URL.revokeObjectURL(a.href))},this.load_vsj=function(e){if(!e)return o.pre_loaded_vsj?(stl_viewer.init_by_json(o.pre_loaded_vsj),o.pre_loaded_vsj=null,!0):o.model_error("load_vsj - invalid filename"+e,o.load_error_callback);if(e instanceof File)return o.read_bin_file(e,o.init_by_json,null,!0);var t=new XMLHttpRequest;t.onreadystatechange=function(e){4==t.readyState&&200==t.status&&o.init_by_json(t.response.trim())},t.open("GET",e,!0),t.send(null)},this.padend=function(e,t,o){return t>>=0,o=String(void 0!==o?o:" "),e.length>t?String(e):((t-=e.length)>o.length&&(o+=o.repeat(t/o.length)),String(e)+o.slice(0,t))},this.get_normal=function(e,t,o){var a=t.x-e.x,i=t.y-e.y,n=t.z-e.z,s=o.x-e.x,r=o.y-e.y,l=o.z-e.z,d={x:0,y:0,z:0};d.x=i*l-n*r,d.y=n*s-a*l,d.z=a*r-i*s;var _=Math.sqrt(d.x*d.x+d.y*d.y+d.z*d.z);return 0!=_&&(d.x/=_,d.y/=_,d.z/=_),d},this.get_stl_bin=function(e){if(void 0===o.models_ref[e])return o.model_error("get_stl_bin - id not found: "+e);var t=o.models[o.models_ref[e]];if(t&&t.mesh){var a=t.mesh.geometry;if(a){for(var i=new ArrayBuffer(84+50*a.faces.length),n=new DataView(i),s=(new TextEncoder,o.padend("Binary"+(t.colors?" colored":"")+" STL by viewstl.com",80," ")),r=0;r<80;r++)n.setUint8(r,s.charCodeAt(r),!0);n.setUint32(80,a.faces.length,!0);var l=84;return Object.keys(a.faces).forEach(function(e){var i=a.faces[e],s=a.vertices[i.a],r=a.vertices[i.b],d=a.vertices[i.c],_=o.get_normal(s,r,d);n.setFloat32(l,_.x,!0),l+=4,n.setFloat32(l,_.y,!0),l+=4,n.setFloat32(l,_.z,!0),l+=4,n.setFloat32(l,s.x,!0),l+=4,n.setFloat32(l,s.y,!0),l+=4,n.setFloat32(l,s.z,!0),l+=4,n.setFloat32(l,r.x,!0),l+=4,n.setFloat32(l,r.y,!0),l+=4,n.setFloat32(l,r.z,!0),l+=4,n.setFloat32(l,d.x,!0),l+=4,n.setFloat32(l,d.y,!0),l+=4,n.setFloat32(l,d.z,!0),l+=4,t.colors?n.setUint16(l,Math.ceil(31*i.color.r)|Math.ceil(31*i.color.g)<<5|Math.ceil(31*i.color.b)<<10,!0):n.setUint16(l,0,!0),l+=2}),i}}},this.basename=function(e){return e.substr(e.lastIndexOf("/")+1)},this.json_without_nulls=function(e){return JSON.stringify(e).split(",null").join("")},this.download_vsb=function(e){var t=null;try{t=new JSZip}catch(e){return console.log("download_vsb - JSZip is missing ",e.message),!1}var a=o.get_vsb();t.file("json_data.vsj",o.json_without_nulls(a.vsj)),Object.keys(a.files).forEach(function(e){var i=o.get_model_filename(a.vsj.models[o.models_ref[a.files[e].id]],!0,!0);t.file(i,a.files[e].bin)}),t.generateAsync({type:"blob"}).then(function(t){var o=new Blob([t],{type:"application/zip"}),a=document.createElement("a");a.href=window.URL.createObjectURL(o);var i=e||"1",n=i.toLowerCase().indexOf(".vsb");n>=0&&(i=i.substring(0,n)),i.length<1&&(i="1"),window.navigator.msSaveOrOpenBlob?window.navigator.msSaveBlob(o,i+".vsb"):(a.download=i+".vsb",a.click(),URL.revokeObjectURL(a.href))})},this.load_vsb=function(e){if(o.pre_loaded_ab_files=[],o.pre_loaded_vsj=null,e instanceof File)return o.read_bin_file(e,o.load_vsb_from_blob);JSZipUtils.getBinaryContent(decodeURIComponent(e),function(e,t){if(e)return o.model_error("load_vsb "+e,o.load_error_callback);o.load_vsb_from_blob(t)})},this.read_bin_file=function(e,t,o,a){var i=new FileReader;i.onerror=function(e){return console.log("reading file error",e),null},i.onload=function(e){return t(e.target.result)},o&&(i.onprogress=function(e){o({loaded:e.loaded,total:e.total,load_session:-1},-1)}),a?i.readAsText(e):i.readAsArrayBuffer(e)},this.load_vsb_from_blob=function(e){var t=null;try{t=new JSZip}catch(e){return console.log("load vsb - JSZip is missing ",e.message),!1}t.loadAsync(e).then(function(){o.zip_load_count=Object.keys(t.files).length,t.forEach(function(e,a){"json_data.vsj"==a.name?t.files[a.name].async("string").then(function(e){o.pre_loaded_vsj=e,o.zip_load_count--,0==o.zip_load_count&&o.load_vsj(null)}):t.files[a.name].async("blob").then(function(e){o.pre_loaded_ab_files[a.name]=e,o.zip_load_count--,0==o.zip_load_count&&o.load_vsj(null)})})})},this.load_bin_to_ab_file=function(e,t){o.pre_loaded_ab_files||(o.pre_loaded_ab_files=[]),o.pre_loaded_ab_files[e]=t,o.add_model({id:-1,filename:e})},this.download_model=function(e,t){if(void 0===o.models_ref[e])return o.model_error("download_model - id not found: "+e);var a=o.models[o.models_ref[e]];if(a&&a.mesh){var i=new Blob([o.get_stl_bin(e)],{type:"application/sla"}),n=document.createElement("a");n.href=window.URL.createObjectURL(i);var s=o.get_model_filename(a,!0,!0,!0),r=s.toLowerCase().indexOf(".stl");r>=0&&(s=s.substring(0,r)),s.length<1&&(s="1"),window.navigator.msSaveOrOpenBlob?window.navigator.msSaveBlob(i,s+".stl"):(n.download=s+".stl",n.click(),URL.revokeObjectURL(n.href))}},this.get_model_mesh=function(e){if(void 0===o.models_ref[e])return o.model_error("get_model_mesh - id not found: "+e);var t=o.models[o.models_ref[e]];if(t&&t.mesh){var a=t.mesh.clone();return a.geometry=t.mesh.geometry.clone(),a.material=t.mesh.material.clone(),a}},this.set_auto_rotate=function(e){o.controls.autoRotate=e},this.set_mouse_zoom=function(e){o.controls.noZoom=!e},this.WORLD_X_VECTOR=null,this.WORLD_Y_VECTOR=null,this.WORLD_Z_VECTOR=null,this.maxx=null,this.maxy=null,this.maxz=null,this.minx=null,this.miny=null,this.minz=null,this.edges_material=null,this.raycaster=null,this.mouse=null,this.scene=null,this.is_webgl=null,this.renderer=null,this.camera=null,this.ambientLight=null,this.directionalLight=null,this.pointLight=null,this.controls=null,this.do_resize=function(){var e=o.parent_element.getBoundingClientRect(),t=e.width,a=e.height;o.camera.aspect=t/a,o.camera.updateProjectionMatrix(),o.renderer.setSize(t-5,a-5)},this.animation=new Array,this.animate=function(){Object.keys(o.animation).forEach(function(e){void 0!==o.models_ref[e]&&o.do_model_animation(o.models[o.models_ref[e]])}),requestAnimationFrame(o.animate),o.renderer.render(o.scene,o.camera),o.controls&&o.controls.update()},this.do_model_animation=function(e){if(e.animation){var t=Date.now();if(e.animation.start_time||(e.animation.start_time=t),e.animation.delta){var a=(t-e.animation.start_time)/e.animation.delta.msec,i=e.animation.last_time?(t-e.animation.last_time)/e.animation.delta.msec:a;if(o.animation_next_delta(e,e.animation.delta,i),a>=1){if(!e.animation.delta.loop)return void o.remove_model_animation(e,!0);e.animation.delta.start_time=null}}if(e.animation.exact){i=(t-(e.animation.last_time?e.animation.last_time:e.animation.start_time))/e.animation.exact.msec;if(o.animation_next_exact(e,e.animation.exact,i),t>=e.animation.start_time+e.animation.exact.msec)return void o.remove_model_animation(e,!1,!0)}e.animation.last_time=t}},this.animation_next_delta=function(e,t,a){var i=!1,n=!1,s=!1;Object.keys(t).forEach(function(r){switch(r){case"x":case"y":case"z":i||(i=!0,o.set_position(e.id,e.x+(void 0!==t.x?t.x*a:0),e.y+(void 0!==t.y?t.y*a:0),e.z+(void 0!==t.z?t.z*a:0)));break;case"rotationx":case"rotationy":case"rotationz":n||(n=!0,o.rotate(e.id,void 0!==t.rotationx?t.rotationx*a:0,void 0!==t.rotationy?t.rotationy*a:0,void 0!==t.rotationz?t.rotationz*a:0));break;case"scale":case"scalex":case"scaley":case"scalez":s||(s=!0,t.scalex=t.scalex?t.scalex:t.scale?t.scale:null,t.scaley=t.scaley?t.scaley:t.scale?t.scale:null,t.scalez=t.scalez?t.scalez:t.scale?t.scale:null,o.set_scale(e.id,e.scalex+(void 0!==t.scalex?t.scalex*a:0),e.scaley+(void 0!==t.scaley?t.scaley*a:0),e.scalez+(void 0!==t.scalez?t.scalez*a:0)))}})},this.animation_next_exact=function(e,t,a){var i=!1,n=!1,s=!1;Object.keys(t).forEach(function(r){switch(r){case"x":case"y":case"z":i||(i=!0,void 0===t.xtotal&&(t.xtotal=t.x-e.x),void 0===t.ytotal&&(t.ytotal=t.y-e.y),void 0===t.ztotal&&(t.ztotal=t.z-e.z),o.set_position(e.id,e.x+(void 0!==t.x?t.xtotal*a:0),e.y+(void 0!==t.y?t.ytotal*a:0),e.z+(void 0!==t.z?t.ztotal*a:0)));break;case"rotationx":case"rotationy":case"rotationz":if(!n){n=!0;var l=e.mesh.getWorldRotation();void 0===t.rotxtotal&&(t.rotxtotal=t.rotationx-l.x),void 0===t.rotytotal&&(t.rotytotal=t.rotationy-l.y),void 0===t.rotztotal&&(t.rotztotal=t.rotationz-l.z),o.rotate(e.id,void 0!==t.rotationx?t.rotxtotal*a:0,void 0!==t.rotationy?t.rotytotal*a:0,void 0!==t.rotationz?t.rotztotal*a:0)}break;case"scale":case"scalex":case"scaley":case"scalez":s||(s=!0,t.scalex=t.scalex?t.scalex:t.scale?t.scale:null,t.scaley=t.scaley?t.scaley:t.scale?t.scale:null,t.scalez=t.scalez?t.scalez:t.scale?t.scale:null,void 0===t.scalextotal&&(t.scalextotal=t.scalex-e.scalex),void 0===t.scaleytotal&&(t.scaleytotal=t.scaley-e.scaley),void 0===t.scaleztotal&&(t.scaleztotal=t.scalez-e.scalez),o.set_scale(e.id,e.scalex+(void 0!==t.scalex?t.scalextotal*a:0),e.scaley+(void 0!==t.scaley?t.scaleytotal*a:0),e.scalez+(void 0!==t.scalez?t.scaleztotal*a:0)))}})},this.remove_model_animation=function(e,t,a){t&&(e.animation.delta=null),a&&(e.animation.exact=null),e.animation.delta||e.animation.exact||(e.animation=null,delete o.animation[e.id])},this.animate_model=function(e,t){if(void 0===o.models_ref[e])return o.model_error("animate-model - id not found: "+e);var a=o.models[o.models_ref[e]];if(a){if(!t)return o.remove_model_animation(a,!0,!0);a.animation=JSON.parse(JSON.stringify(t)),a.animation.delta&&(a.animation.delta.msec||(a.animation.delta.msec=300)),a.animation.exact&&(a.animation.exact.msec||(a.animation.exact.msec=300)),o.animation[e]=1}},this.init_done=!1,this.init=function(){if(!o.init_done){switch(o.WORLD_X_VECTOR=new THREE.Vector3(1,0,0),o.WORLD_Y_VECTOR=new THREE.Vector3(0,1,0),o.WORLD_Z_VECTOR=new THREE.Vector3(0,0,1),o.edges_material=new THREE.LineBasicMaterial({color:0}),o.raycaster=new THREE.Raycaster,o.mouse=new THREE.Vector2,o.scene=new THREE.Scene,o.is_webgl=webgl_Detector.webgl,o.renderer=o.is_webgl?new THREE.WebGLRenderer({preserveDrawingBuffer:!0,alpha:!0}):new THREE.CanvasRenderer({alpha:!0}),o.camera=new THREE.PerspectiveCamera(45,1,.1,1e4),o.parent_element.appendChild(o.renderer.domElement),o.scene.add(o.camera),o.ambientLight=new THREE.AmbientLight(2105376),o.camera.add(o.ambientLight),o.directionalLight=new THREE.DirectionalLight(16777215,.75),o.directionalLight.position.x=1,o.directionalLight.position.y=1,o.directionalLight.position.z=2,o.directionalLight.position.normalize(),o.camera.add(o.directionalLight),o.pointLight=new THREE.PointLight(16777215,.3),o.pointLight.position.x=0,o.pointLight.position.y=-25,o.pointLight.position.z=10,o.camera.add(o.pointLight),o.controls_type){case 1:o.controls=new THREE.TrackballControls(o.camera,o.renderer.domElement);break;default:o.controls=new THREE.OrbitControls(o.camera,o.renderer.domElement),o.controls.autoRotate=o.auto_rotate}o.set_on_model_mousedown(o.onmousedown_callback)}o.set_bg_color(o.bg_color),!1===o.mouse_zoom&&o.set_mouse_zoom(o.mouse_zoom),o.camera_state?o.set_camera_state(o.camera_state):o.camera.position.set(o.camerax,o.cameray,o.cameraz),o.do_resize(),o.models_to_add&&o.add_models(o.models_to_add),o.set_auto_resize(o.auto_resize),o.animate(),o.init_done=!0},this.set_auto_resize=function(e){o.do_resize&&(window.removeEventListener("resize",o.do_resize),e&&window.addEventListener("resize",o.do_resize))},this.vf_to_geo=function(e,t,a){if(!e)return null;if(!t)return null;var n=[],s=[],r=e.length;for(i=0;is&&(s=o[d].x),o[d].y>r&&(r=o[d].y),o[d].z>l&&(l=o[d].z);t.minx=a+e.x,t.miny=i+e.y,t.minz=n+e.z,t.maxx=s+e.x,t.maxy=r+e.y,t.maxz=l+e.z}},this.handleDragOver=function(e){e.stopPropagation(),e.preventDefault(),e.dataTransfer.dropEffect="copy"},this.handleFileDrop=function(e){e.stopPropagation(),e.preventDefault(),e.dataTransfer.files.length>0?o.load_local_files(e.dataTransfer.files):"string"==typeof e.dataTransfer.getData("Text")&&(o.add_model({id:-1,filename:e.dataTransfer.getData("Text")}),o.on_model_drop&&o.on_model_drop(e.dataTransfer.getData("Text")))},this.load_local_files=function(e){if(e.length>0){for(var t=new Array,a=e.length,i=0;i0?e.substring(0,t+1):""}}(); \ No newline at end of file