/** * @author Sergey Burkov, http://www.wp3dprinting.com * @copyright 2015 */ p3dlite.bar_progress=0; p3dlite.xhr=''; p3dlite.schedule_quote=0; p3dlite.filereader_supported=true; p3dlite.file_selected=0; p3dlite.cookie_expire = parseInt(p3dlite.cookie_expire); p3dlite.aabb = new Array(); p3dlite.resize_scale = 1; window.onload = function() { if (!document.getElementById('p3dlite-cv')) return; window.p3dlite_canvas = document.getElementById('p3dlite-cv'); p3dliteCanvasDetails(); var logoTimerID = 0; window.p3dlite_viewer = new JSC3D.Viewer(window.p3dlite_canvas); p3dlite_viewer.setParameter('InitRotationX', p3dlite.angle_x); p3dlite_viewer.setParameter('InitRotationY', p3dlite.angle_y); p3dlite_viewer.setParameter('InitRotationZ', p3dlite.angle_z); p3dlite_viewer.setParameter('BackgroundColor1', p3dlite.background1); p3dlite_viewer.setParameter('BackgroundColor2', p3dlite.background2); p3dlite_viewer.setParameter('RenderMode', 'textureflat'); p3dlite_viewer.setParameter('ProgressBar', 'off'); p3dlite_viewer.setParameter('Renderer', 'webgl'); window.wp.hooks.doAction( '3dprint-lite.p3dlite_viewerConfig'); p3dlite_viewer.onloadingstarted = function() { p3dliteDisplayUserDefinedProgressBar(true); }; p3dlite_viewer.onloadingcomplete = p3dlite_viewer.onloadingaborted = p3dlite_viewer.onloadingerror = function() { p3dliteDisplayUserDefinedProgressBar(false); if(logoTimerID > 0) return; // show statistics of current model when loading is completed var scene = p3dlite_viewer.getScene(); if(scene && scene.getChildren().length > 0) { var objects = scene.getChildren(); var totalFaceCount = 0; var totalVertexCount = 0 for(var i=0; i' + totalFaceCount.toString() + ' faces'; document.getElementById('p3dlite-statistics').innerHTML = stats; if (typeof(jQuery('input[name=product_coating]:checked').closest('li').data('color'))!=='undefined' && jQuery('input[name=product_coating]:checked').closest('li').data('color').length>0 ) { p3dliteChangeModelColor(jQuery('input[name=product_coating]:checked').closest('li').data('color')); } else { p3dliteChangeModelColor(jQuery('input[name=product_filament]:checked').closest('li').data('color')); } printer_id=jQuery('input[name=product_printer]:checked').data('id') p3dliteMakeGroundPlane(); p3dliteDrawPrinterBox(scene, printer_id, jQuery('input[name=p3dlite_unit]:checked').val()); // ask the p3dlite_viewer to apply this change immediately p3dlite_viewer.resetScene(); p3dlite_viewer.zoomFactor=parseInt(p3dlite.zoom); p3dlite_viewer.update(); p3dliteGetStats(); p3dliteInitScaleSlider(); var p3dliteRangeSlider = document.getElementById('p3dlite-scale'); if (typeof(p3dliteRangeSlider.noUiSlider)!=='undefined') { p3dliteRangeSlider.noUiSlider.set(100) } } else { document.getElementById('p3dlite-statistics').innerHTML = ''; } window.wp.hooks.doAction( '3dprint-lite.modelLoaded'); }; if (jQuery('input[name=get_printer_id]').val()) { printer=jQuery('input[name=get_printer_id]').val() jQuery.cookie('p3dlite_printer', printer, { expires: p3dlite.cookie_expire }); } else if (jQuery.cookie('p3dlite_printer')!=='undefined' && jQuery('#p3dlite_printer_'+jQuery.cookie('p3dlite_printer')).length>0) { printer=jQuery.cookie('p3dlite_printer'); } else { printer=jQuery('input[name=product_printer]').data('id'); } if (jQuery('input[name=get_material_id]').val()) { material=jQuery('input[name=get_material_id]').val() jQuery.cookie('p3dlite_material', material, { expires: p3dlite.cookie_expire }); } else if (jQuery.cookie('p3dlite_material')!=='undefined' && jQuery('#p3dlite_material_'+jQuery.cookie('p3dlite_material')).length>0) { material=jQuery.cookie('p3dlite_material'); } else { material=jQuery('input[name=product_filament]').data('id'); } if (jQuery('input[name=get_coating_id]').val()) { coating=jQuery('input[name=get_coating_id]').val() jQuery.cookie('p3dlite_coating', coating, { expires: p3dlite.cookie_expire }); } else if (jQuery.cookie('p3dlite_coating')!='undefined' && jQuery('#p3dlite_coating_'+jQuery.cookie('p3dlite_coating')).length>0) { coating=jQuery.cookie('p3dlite_coating'); } else { coating=jQuery('input[name=product_coating]').data('id'); } if (jQuery('input[name=get_product_model]').val()) { product_file=jQuery('input[name=get_product_model]').val(); jQuery.cookie('p3dlite_file', product_file, { expires: p3dlite.cookie_expire }); } else { product_file=jQuery.cookie('p3dlite_file'); } if (jQuery('input[name=get_product_unit]').val()) { product_unit=jQuery('input[name=get_product_unit]').val(); jQuery.cookie('p3dlite_unit', product_unit, { expires: p3dlite.cookie_expire }); } else if (jQuery.cookie('p3dlite_unit')!=='undefined') { product_unit=jQuery.cookie('p3dlite_unit'); } else { product_unit='mm'; } material_volume=jQuery.cookie('p3dlite-stats-material-volume', { expires: p3dlite.cookie_expire }); jQuery('#stats-material-volume').html(jQuery.cookie('p3dlite-stats-material-volume')); jQuery('#stats-box-volume').html(jQuery.cookie('p3dlite-stats-box-volume')); jQuery('#stats-width').html(jQuery.cookie('p3dlite-stats-width')); jQuery('#stats-length').html(jQuery.cookie('p3dlite-stats-length')); jQuery('#stats-height').html(jQuery.cookie('p3dlite-stats-height')); jQuery('#stats-weight').html(jQuery.cookie('p3dlite-stats-weight')); //if (jQuery.cookie('p3dlite-stats-material-volume')) jQuery('.p3dlite-stats').show(); if (typeof(printer)!=='undefined') { jQuery('#p3dlite_printer_'+printer).attr('checked', 'checked'); p3dliteSelectPrinter(jQuery('#p3dlite_printer_'+printer).closest('li')); } else { jQuery('#p3dlite_printer_0').attr('checked', 'checked'); p3dliteSelectPrinter(jQuery('#p3dlite_printer_0').closest('li')); } if (typeof(material)!=='undefined') { jQuery('#p3dlite_material_'+material).attr('checked', 'checked'); p3dliteSelectFilament(jQuery('#p3dlite_material_'+material).closest('li')); } else { jQuery('#p3dlite_material_0').attr('checked', 'checked'); p3dliteSelectFilament(jQuery('#p3dlite_material_0').closest('li')); } if (typeof(coating)!='undefined') { jQuery('#p3dlite_coating_'+coating).attr('checked', 'checked'); p3dliteSelectCoating(jQuery('#p3dlite_coating_'+coating).closest('li')); } else if (jQuery('#p3dlite_coating_0').length>0) { jQuery('#p3dlite_coating_0').attr('checked', 'checked'); p3dliteSelectCoating(jQuery('#p3dlite_coating_0').closest('li')); } if (typeof(product_file)!=='undefined') { jQuery('#pa_p3dlite_model').val(product_file); p3dlite_viewer.setParameter('SceneUrl', p3dlite.upload_url+product_file); } if (typeof(product_unit)!=='undefined') { jQuery("input[name=p3dlite_unit][value=" + product_unit + "]").attr('checked', 'checked'); p3dliteSelectUnit(jQuery("input[name=p3dlite_unit][value=" + product_unit + "]")); } else { p3dliteSelectUnit(jQuery("input[name=p3dlite_unit][value=mm]")); } if (typeof(printer)!=='undefined' && typeof(material)!=='undefined' && typeof(product_file)!=='undefined') { p3dliteGetStats(); } else { jQuery('#p3dlite-file-loading').hide(); jQuery('#p3dlite-quote-loading').css('visibility', 'hidden'); } p3dlite_viewer.init(); p3dlite_viewer.update(); } jQuery(document).ready(function(){ if (!document.getElementById('p3dlite-container')) return; window.addEventListener( 'resize', p3dliteCanvasDetails, false ); jQuery("#p3dlite-model-message-upload").click(function() { jQuery('div.moxie-shim input[type=file]').trigger('click'); }); window.p3dlite_uploader = new plupload.Uploader({ runtimes : 'html5,flash,silverlight,browserplus,gears,html4', browse_button : 'p3dlite-pickfiles', // you can pass an id... multi_selection : false, multiple_queues : false, dragdrop: true, drop_element : 'p3dlite-cv', max_file_count : 1, max_file_size: p3dlite.file_max_size+"mb", container: document.getElementById('p3dlite-container'), url : p3dlite.url, chunk_size : '2mb', flash_swf_url : p3dlite.plugin_url+'includes/ext/plupload/Moxie.swf', silverlight_xap_url : p3dlite.plugin_url+'includes/ext/plupload/Moxie.xap', filters : { mime_types: [ { title : p3dlite.file_extensions+" files", extensions : p3dlite.file_extensions } ] }, init: { QueueChanged: function(p3dlite_uploader) { if(p3dlite_uploader.files.length > 1) { jQuery('#p3dlite-filelist').html(''); p3dlite_uploader.files.splice(0, 1); } }, PostInit: function() { document.getElementById('p3dlite-filelist').innerHTML = ''; document.getElementById('p3dlite-console').innerHTML = ''; }, Browse: function() { }, FilesAdded: function(up, files) { p3dlite.bar_progress=0; jQuery('.p3dlite-mail-success').hide(); jQuery('.p3dlite-mail-error').hide(); if (p3dlite.show_upload_button=='on') { jQuery('#p3dlite-model-message-upload').hide(); } window.wp.hooks.doAction( '3dprint-lite.filesAdded'); if (p3dlite.filereader_supported) { var file = files[0].getNative(); var file_ext = file.name.split('.').pop().toLowerCase(); if (file_ext != 'zip') { p3dlite.filereader_supported = true; var reader = new FileReader(); reader.onload = function(event) { var chars = new Uint8Array(event.target.result); var CHUNK_SIZE = 0x8000; var index = 0; var length = chars.length; var result = ''; var slice; while (index < length) { slice = chars.subarray(index, Math.min(index + CHUNK_SIZE, length)); result += String.fromCharCode.apply(null, slice); index += CHUNK_SIZE; } theScene = new JSC3D.Scene if (file_ext=='stl') { stl_loader = new JSC3D.StlLoader() stl_loader.parseStl(theScene, result) } else if (file_ext=='obj') { obj_loader = new JSC3D.ObjLoader() obj_loader.parseObj(theScene, result) } else alert('Unsupported format'); jQuery('#p3dlite-file-loading').hide(); p3dlite_viewer.replaceSceneFromUrl("");//hack to empty the sceneUrl p3dlite_viewer.init() p3dlite_viewer.replaceScene(theScene) if (typeof(jQuery('input[name=product_coating]:checked').closest('li').data('color'))!=='undefined' && jQuery('input[name=product_coating]:checked').closest('li').data('color').length>0 ) { p3dliteChangeModelColor(jQuery('input[name=product_coating]:checked').closest('li').data('color')); } else { p3dliteChangeModelColor(jQuery('input[name=product_filament]:checked').closest('li').data('color')); } p3dliteMakeGroundPlane(); p3dliteDrawPrinterBox(p3dlite_viewer.getScene(), jQuery('input[name=product_printer]:checked').data('id'), jQuery('input[name=p3dlite_unit]:checked').val()); p3dlite_viewer.resetScene(); p3dlite_viewer.zoomFactor=parseInt(p3dlite.zoom); p3dlite_viewer.update() p3dliteGetStats(); var scene = p3dlite_viewer.getScene(); var objects = scene.getChildren(); var totalFaceCount = 0; var totalVertexCount = 0 for(var i=0; i' + totalFaceCount.toString() + ' faces'; document.getElementById('p3dlite-statistics').innerHTML = stats; p3dliteInitScaleSlider(); var p3dliteRangeSlider = document.getElementById('p3dlite-scale'); if (typeof(p3dliteRangeSlider.noUiSlider)!=='undefined') { p3dliteRangeSlider.noUiSlider.set(100) } } reader.readAsArrayBuffer(file); } //!zip else p3dlite.filereader_supported = false; //zip file } plupload.each(files, function(file) { document.getElementById('p3dlite-filelist').innerHTML += '
' + file.name + ' (' + plupload.formatSize(file.size) + ')
'; }); p3dlite_uploader.disableBrowse(true); if (p3dlite.filereader_supported && p3dlite_viewer.getScene() !== null) { p3dliteInitScaleSlider(); var p3dliteRangeSlider = document.getElementById('p3dlite-scale'); if (typeof(p3dliteRangeSlider.noUiSlider)!=='undefined') { p3dliteRangeSlider.noUiSlider.set(100) } } // jQuery('.p3dlite-stats').hide(); jQuery('#price-container').css('visibility','hidden'); jQuery('#add-cart-container').css('visibility','hidden'); jQuery('#p3dlite-console').hide(); jQuery('#p3dlite-file-loading').show(); jQuery('#p3dlite-quote-loading').css('visibility', 'visible'); up.start(); jQuery('#p3dlite-pickfiles').click(); }, UploadProgress: function(up, file) { p3dlite.bar_progress=parseFloat(file.percent/100); document.getElementById(file.id).getElementsByTagName('b')[0].innerHTML = '' + file.percent + "%"; }, UploadComplete: function(up, file, response) { p3dlite_uploader.disableBrowse(false); }, Error: function(up, err) { p3dlite_uploader.disableBrowse(false); document.getElementById('p3dlite-console').appendChild(document.createTextNode("\nError #" + err.code + ": " + err.message)); window.p3dliteProgressButton._stop(); jQuery('#p3dlite-console').show(); } } }); p3dlite_uploader.bind('BeforeUpload', function (up, file) { up.settings.multipart_params = { "action" : 'p3dlite_handle_upload', "product_id" : jQuery('#p3dlite_product_id').val(), "printer_id" : jQuery('input[name=product_printer]:checked').data('id'), "material_id" : jQuery('input[name=product_filament]:checked').data('id'), "coating_id" : jQuery('input[name=product_coating]:checked').data('id'), "unit" : jQuery('input[name=p3dlite_unit]:checked').val() } window.wp.hooks.doAction( '3dprint-lite.beforeUpload'); }); p3dlite_uploader.init(); p3dlite_uploader.bind('FileUploaded', function(p3dlite_uploader,file,response) { var data = jQuery.parseJSON( response.response ); if (data.error) { //fatal error jQuery('#p3dlite-console').html(data.error.message).show(); jQuery('#p3dlite-file-loading').hide() jQuery('#p3dlite-quote-loading').css('visibility', 'hidden'); return false; } jQuery('#p3dlite-quote-loading').css('visibility', 'hidden'); jQuery('.p3dlite-mail-success').remove(); jQuery('.p3dlite-mail-error').remove(); jQuery('#add-cart-container').css('visibility','visible'); jQuery.cookie('p3dlite_file',data.filename, { expires: p3dlite.cookie_expire }); if (!p3dlite.filereader_supported) p3dlite_viewer.replaceSceneFromUrl(p3dlite.upload_url+data.filename); jQuery.cookie('p3dlite_file',data.filename, { expires: p3dlite.cookie_expire }); product_file=data.filename; jQuery('#pa_p3dlite_model').val(product_file); jQuery('.p3dlite-stats').show(); p3dlite_viewer.update(); p3dliteCheckPrintability(); p3dliteGetStats(); if (p3dlite_viewer.getScene() !== null) p3dliteInitScaleSlider(); var p3dliteRangeSlider = document.getElementById('p3dlite-scale'); if (typeof(p3dliteRangeSlider.noUiSlider)!=='undefined') { p3dliteRangeSlider.noUiSlider.set(100) } window.wp.hooks.doAction( '3dprint-lite.fileUploaded'); }); }); function p3dliteCanvasDetails() { jQuery("#p3dlite-file-loading").css({ top: jQuery("#p3dlite-cv").position().top+jQuery("#p3dlite-cv").height()/2-jQuery("#p3dlite-file-loading").height()/2, left: jQuery("#p3dlite-cv").position().left + jQuery("#p3dlite-cv").width()/2-jQuery("#p3dlite-file-loading").width()/2 }) ; jQuery("#canvas-stats").css({ top: jQuery("#p3dlite-cv").position().top , left: jQuery("#p3dlite-cv").position().left }) ; /* jQuery("#p3dlite-model-message").css({ width: jQuery("#p3dlite-cv").width()+'px' }) ; jQuery("#p3dlite-model-message").css({ top: jQuery("#p3dlite-cv").position().top+jQuery("#p3dlite-cv").height()-jQuery("#p3dlite-model-message").height() , left: jQuery("#p3dlite-cv").position().left, }) ;*/ } function p3dliteBoxFitsBox (dim_x1, dim_y1, dim_z1, dim_x2, dim_y2, dim_z2) { var fits=true; var min_dim1=Math.min(dim_x1, dim_y1, dim_z1); var min_dim2=Math.min(dim_x2, dim_y2, dim_z2); var max_dim1=Math.max(dim_x1, dim_y1, dim_z1); var max_dim2=Math.max(dim_x2, dim_y2, dim_z2); var diag1=Math.sqrt(dim_x1 + dim_y1 + dim_z1); var diag2=Math.sqrt(dim_x2 + dim_y2 + dim_z2); if (min_dim10 ) p3dliteChangeModelColor(jQuery('input[name=product_coating]:checked').closest('li').data('color')); else p3dliteChangeModelColor(jQuery(obj).attr('data-color')); jQuery.cookie('p3dlite_material', jQuery(obj).find('input').attr('data-id'), { expires: p3dlite.cookie_expire }); //check compatible printers var compatible_printers = new Array(); jQuery('input[name=product_printer]').each(function() { var materials = jQuery(this).data('materials')+''; var materials_array = materials.split(','); // console.log(materials_array, material_id) if (materials.length>0 && jQuery.inArray(material_id+'', materials_array)==-1) { jQuery(this).prop('disabled', true); jQuery(this).prop('checked', false); jQuery(this).css('visibility', 'hidden'); jQuery(this).parent().find('.p3dlite-dropdown-item').addClass('p3dlite-inactive-dropdown-item'); } else { jQuery(this).prop('disabled', false); jQuery(this).css('visibility', 'visible'); jQuery(this).parent().find('.p3dlite-dropdown-item').removeClass('p3dlite-inactive-dropdown-item'); compatible_printers.push(this); } }); //check if a compatible printer is already selected var selected = false; for (i=0;i0 && jQuery.inArray(material_id+'', materials_array)==-1) { jQuery(this).prop('disabled', true); jQuery(this).prop('checked', false); jQuery(this).css('visibility', 'hidden'); } else { jQuery(this).prop('disabled', false); jQuery(this).css('visibility', 'visible'); compatible_coatings.push(this); } }); //check if a compatible coating is already selected var selected = false; for (i=0;i0) { jQuery(compatible_coatings[0]).prop('checked', true); p3dliteSelectCoating(jQuery(compatible_coatings[0]).parent()); } var material_name=jQuery(obj).find('input').data('name'); var material_color=jQuery(obj).find('input').data('color'); if (typeof(document.getElementById('p3dlite-material-name'))!=='undefined') { jQuery('#p3dlite-material-name').html(p3dlite.text_material+' :
'+material_name); } if (jQuery(obj).hasClass('p3dlite-color-item')) { jQuery(obj).closest('.p3dlite-fieldset').find('.p3dlite-color-item').removeClass('p3dlite-active'); jQuery(obj).addClass('p3dlite-active'); } if (p3dliteCheckPrintability()) p3dliteGetStats(); window.wp.hooks.doAction( '3dprint-lite.selectFilament'); } function p3dliteSelectCoating(obj) { if (jQuery(obj).find('input[type=radio]').prop('disabled')) return false; jQuery(obj).find('input[type=radio]').attr('checked','true'); jQuery('#pa_p3dlite_coating').val(jQuery(obj).find('input').data('id')); coating_id=jQuery(obj).find('input').data('id'); if (typeof(jQuery(obj).attr('data-color'))!=='undefined' && jQuery(obj).attr('data-color').length>0) { p3dliteChangeModelColor(jQuery(obj).attr('data-color')); } else { p3dliteChangeModelColor(jQuery('input[name=product_filament]:checked').closest('li').data('color')); } jQuery.cookie('p3dlite_coating', jQuery(obj).find('input').attr('data-id'), { expires: p3dlite.cookie_expire }); var coating_name=jQuery(obj).find('input').data('name'); var material_color=jQuery(obj).find('input').data('color'); if (typeof(document.getElementById('p3dlite-coating-name'))!=='undefined') { jQuery('#p3dlite-coating-name').html(p3dlite.text_coating+' :
'+coating_name); } if (jQuery(obj).hasClass('p3dlite-color-item')) { jQuery(obj).closest('.p3dlite-fieldset').find('.p3dlite-color-item').removeClass('p3dlite-active'); jQuery(obj).addClass('p3dlite-active'); } p3dliteGetStats(); window.wp.hooks.doAction( '3dprint.selectCoating'); } function p3dliteSelectUnit(obj) { jQuery(obj).attr('checked','true'); jQuery('#p3dlite_unit').val(jQuery(obj).val()); jQuery('#pa_p3dlite_unit').val(jQuery(obj).val()); product_unit=jQuery(obj).val(); jQuery.cookie('p3dlite_unit', jQuery(obj).val(), { expires: p3dlite.cookie_expire }); printer_id=jQuery('input:radio[name=product_printer]:checked').data('id'); p3dliteChangePrinter(printer_id); p3dliteGetStats(); if (p3dlite_viewer.getScene() !== null) p3dliteInitScaleSlider(); var p3dliteRangeSlider = document.getElementById('p3dlite-scale'); if (typeof(p3dliteRangeSlider.noUiSlider)!=='undefined') { p3dliteRangeSlider.noUiSlider.set(100) } window.wp.hooks.doAction( '3dprint-lite.selectUnit'); } function p3dliteChangePrinter(printer_id) { if (p3dlite_viewer.getScene()==null) return false; var scene = p3dlite_viewer.getScene(); var objects = scene.getChildren(); for(var i=0; i-1 ) { var material_volume_pricing_array = material.data('price').split(';'); for (var i = 0; i < material_volume_pricing_array.length; i++) { var discount_rule = material_volume_pricing_array[i].split(':'); if (discount_rule.length == 2) { var amount = discount_rule[0]; var price = discount_rule[1]; if ( material.data('price_type')=='cm3' ) { if (printing_volume >= amount ) material_cost = printing_volume * price; } else if ( material.data('price_type')=='gram' ) { if (product_info['model']['weight'] >= amount) material_cost = product_info['model']['weight'] * price; } else if ( material.data('price_type')=='fixed' ) { if (printing_volume >= amount ) material_cost = price; } } } } if ( !isNaN ( printer.data('price') ) ) { if ( printer.data('price_type')=="material_volume" ) { printing_cost=printing_volume*printer.data('price'); } else if ( printer.data('price_type')=="box_volume" ) { printing_cost=product_info['model']['box_volume']*printer.data('price'); } else if ( printer.data('price_type')=="gram" ) { printing_cost=product_info['model']['weight']*printer.data('price'); } } else if ( printer.data('price').indexOf(':')>-1 ) { var printer_volume_pricing_array = printer.data('price').split(';'); for (var i = 0; i < printer_volume_pricing_array.length; i++) { var discount_rule = printer_volume_pricing_array[i].split(':'); if (discount_rule.length == 2) { var amount = discount_rule[0]; var price = discount_rule[1]; if ( printer.data('price_type')=='material_volume' ) { if (printing_volume >= amount) printing_cost = printing_volume * price; } else if ( printer.data('price_type')=='box_volume' ) { if (product_info['model']['box_volume'] >= amount) printing_cost = product_info['model']['box_volume'] * price; } else if ( printer.data('price_type')=='gram' ) { if (product_info['model']['weight'] >= amount) printing_cost = product_info['model']['weight'] * price; } else if ( printer.data('price_type')=='fixed' ) { if (printing_volume >= amount) printing_cost = price; } } } } if (typeof(coating.data('price'))!=='undefined') { if ( !isNaN ( coating.data('price') ) ) { if ( coating.data('price_type')=='cm2' ) { coating_cost = product_info['model']['surface_area'] * coating.data('price'); } else if ( coating.data('price_type')=='fixed' ) { coating_cost = coating.data('price'); } } else if ( coating.data('price').indexOf(':')>-1 ) { var surface_area_pricing_array = coating.data('price').split(';'); for (var i = 0; i < surface_area_pricing_array.length; i++) { var discount_rule = surface_area_pricing_array[i].split(':'); if (discount_rule.length == 2) { var amount = discount_rule[0]; var price = discount_rule[1]; if ( coating.data('price_type')=='cm2' ) { if (product_info['model']['surface_area'] >= amount) coating_cost = product_info['model']['surface_area'] * price; } else if ( coating.data('price_type')=='fixed' ) { if (product_info['model']['surface_area'] >= amount) coating_cost = price; } } } } } var total=printing_cost+material_cost+coating_cost; if (p3dlite.minimum_price_type=='starting_price') { total = total + parseFloat(p3dlite.min_price); } else if (p3dlite.minimum_price_type=='minimum_price') { if (total < p3dlite.min_price) total = p3dlite.min_price; } if (total < parseFloat(p3dlite.min_price)) total = parseFloat(p3dlite.min_price); total=window.wp.hooks.applyFilters('3dprint-lite.calculatePrintingCost', total, product_info); return total; } //an example hook window.wp.hooks.addFilter( '3dprint-lite.calculatePrintingCost', function (total, product_info) { //do something with total return total; }) function p3dliteGetStatsClientSide() { var scene=window.p3dlite_viewer.getScene(); scene.calcAABB(); var aabb=p3dlite.aabb; var filament_volume = (window.model_total_volume/1000)*Math.pow(p3dlite.resize_scale,3); //cm3 var surface_area = (window.model_surface_area/100)*Math.pow(p3dlite.resize_scale,2); //cm2 var model_x = (Math.abs(aabb.maxX-aabb.minX)/10)*p3dlite.resize_scale var model_y = (Math.abs(aabb.maxY-aabb.minY)/10)*p3dlite.resize_scale var model_z = (Math.abs(aabb.maxZ-aabb.minZ)/10)*p3dlite.resize_scale var box_volume = model_x*model_y*model_z; if (product_unit=='inch') { model_x = model_x*2.54; model_y = model_y*2.54; model_z = model_z*2.54; surface_area=surface_area*6.4516; box_volume = model_x*model_y*model_z; filament_volume = filament_volume*16.387064; } var product_info = new Array(); product_info['model'] = new Array(); product_info['model']['x_dim'] = parseFloat(model_x.toFixed(2)); product_info['model']['y_dim'] = parseFloat(model_y.toFixed(2)); product_info['model']['z_dim'] = parseFloat(model_z.toFixed(2)); product_info['model']['material_volume'] = parseFloat(filament_volume.toFixed(2)); product_info['model']['box_volume'] = parseFloat(box_volume.toFixed(2)); product_info['model']['surface_area'] = parseFloat(surface_area.toFixed(2)); product_info['model']['weight'] = parseFloat(filament_volume * parseFloat(jQuery('input[name=product_filament]:checked').data('density'))); product_info=window.wp.hooks.applyFilters('3dprint-lite.getStatsClientSide', product_info); return product_info; } function p3dliteGetStats() { // jQuery('.p3dlite-stats').hide(); jQuery('#price-container').css('visibility','hidden'); jQuery('#p3dlite-console').html('').hide(); var printer_id=jQuery('input:radio[name=product_printer]:checked').attr('data-id'); var material_id=jQuery('input:radio[name=product_filament]:checked').attr('data-id'); if (typeof(jQuery('input:radio[name=product_coating]:checked').attr('data-id'))!=='undefined') var coating_id=jQuery('input:radio[name=product_coating]:checked').attr('data-id'); else var coating_id=''; var product_id=jQuery('#p3dlite_product_id').val(); var model=jQuery('#pa_p3dlite_model').val(); var model_unit=jQuery("input[name=p3dlite_unit]:checked").val(); //it's safe to calculate price on the client when checkout is not allowed if (typeof(window.p3dlite_viewer)!=='undefined' && window.p3dlite_viewer.isLoaded) { var product_info=p3dliteGetStatsClientSide(); var product_price=parseFloat(p3dliteCalculatePrintingCost(product_info)); var response = new Array(); response.model = new Array(); response.model = product_info['model']; response.price = product_price.toFixed(2); if (p3dlite.currency_position=='left') accounting.settings.currency.format = "%s%v"; else if (p3dlite.currency_position=='left_space') accounting.settings.currency.format = "%s %v"; else if (p3dlite.currency_position=='right') accounting.settings.currency.format = "%v%s"; else if (p3dlite.currency_position=='right_space') accounting.settings.currency.format = "%v %s"; response.html_price = accounting.formatMoney(response.price, p3dlite.currency_symbol, p3dlite.price_num_decimals, p3dlite.thousand_sep, p3dlite.decimal_sep); jQuery('#p3dlite_estimated_price').val(response.price); p3dliteShowResponse(response); } window.wp.hooks.doAction( '3dprint-lite.getStats'); } function p3dliteShowResponse(response) { if (response.error) { //fatal error jQuery('#p3dlite-quote-loading').css('visibility', 'hidden'); p3dliteShowError(response.error); return; } if (window.p3dlite_uploader.state==1) jQuery('#p3dlite-quote-loading').css('visibility','hidden'); if (response.model) { if (response.model.error) p3dliteShowError(response.model.error); //soft error jQuery('#stats-material-volume').html(response.model.material_volume.toFixed(2)); jQuery('#stats-box-volume').html(response.model.box_volume.toFixed(2)); jQuery('#stats-surface-area').html(response.model.surface_area.toFixed(2)); jQuery('#stats-width').html(response.model.x_dim.toFixed(2)); jQuery('#stats-length').html(response.model.y_dim.toFixed(2)); jQuery('#stats-height').html(response.model.z_dim.toFixed(2)); jQuery('#stats-weight').html(response.model.weight.toFixed(2)); jQuery('#scale_x').val(response.model.x_dim.toFixed(2)); jQuery('#scale_y').val(response.model.y_dim.toFixed(2)); jQuery('#scale_z').val(response.model.z_dim.toFixed(2)); jQuery('.p3dlite-stats').show(); } if (p3dliteCheckPrintability()) { if (p3dlite.pricing!='request') { jQuery('#price-container').css('visibility','visible'); } if (window.p3dlite_uploader.state==1 || !p3dlite.filereader_supported) jQuery('#add-cart-container').css('visibility','visible'); jQuery('#price-container span.amount').html(response.html_price); } window.wp.hooks.doAction( '3dprint-lite.showResponse'); } function p3dliteCalculateWeight(material_volume) { var density = parseFloat(jQuery('input[name=product_filament]:checked').attr('data-density')); var weight = material_volume*density; return weight.toFixed(2); } function p3dliteDisplayUserDefinedProgressBar(show) { if(show) { jQuery('#p3dlite-file-loading').show(); } else { jQuery('#p3dlite-file-loading').hide(); } } function p3dliteDetectIE() { var ua = window.navigator.userAgent; var msie = ua.indexOf('MSIE '); if (msie > 0) { // IE 10 or older => return version number return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10); } var trident = ua.indexOf('Trident/'); if (trident > 0) { // IE 11 => return version number var rv = ua.indexOf('rv:'); return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10); } var edge = ua.indexOf('Edge/'); if (edge > 0) { // IE 12 => return version number return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10); } // other browser return false; } function p3dliteDrawPrinterBox(scene, printer_id, product_unit) { var printer_dim=new Array(); printer_dim.x=jQuery('#p3dlite_printer_'+printer_id).data('length') printer_dim.y=jQuery('#p3dlite_printer_'+printer_id).data('width') printer_dim.z=jQuery('#p3dlite_printer_'+printer_id).data('height') var scene=window.p3dlite_viewer.getScene(); scene.calcAABB(); var sceneBox=p3dlite.aabb; var planeCenter = scene.aabb.center(); var model_xdim=sceneBox.maxX - sceneBox.minX; var model_ydim=sceneBox.maxY - sceneBox.minY; var model_zdim=sceneBox.maxZ - sceneBox.minZ; //xy rotation if (model_xdim>printer_dim.x && model_ydimprinter_dim.x && model_zdimprinter_dim.y && model_xdimprinter_dim.y && model_zdim0) jQuery('#p3dlite-container input[type=file]').parent().css('z-index', '999') p3dlite.file_selected++; } function p3dliteInitScaleSlider() { window.wp.hooks.doAction( '3dprint-lite.p3dliteInitScaleSlider_start'); if (p3dlite_viewer.getScene()==null) return false; var p3dliteRangeSlider = document.getElementById('p3dlite-scale'); var printer_dim=new Array(); var product_unit = jQuery('input[name=p3dlite_unit]:checked').val(); printer_dim.x=jQuery('input[name=product_printer]:checked').data('length'); printer_dim.y=jQuery('input[name=product_printer]:checked').data('width'); printer_dim.z=jQuery('input[name=product_printer]:checked').data('height'); if (product_unit=='inch') { printer_dim.x=printer_dim.x/2.54; printer_dim.y=printer_dim.y/2.54; printer_dim.z=printer_dim.z/2.54; } var scene = p3dlite_viewer.getScene(); var sceneBox=p3dlite.aabb; var model_dim=new Array(); model_dim.x=sceneBox.maxX-sceneBox.minX model_dim.y=sceneBox.maxY-sceneBox.minY model_dim.z=sceneBox.maxZ-sceneBox.minZ var max_printer_side = Math.max(printer_dim.x, printer_dim.y); var min_printer_side = Math.min(printer_dim.x, printer_dim.y); var max_model_side = Math.max(model_dim.x, model_dim.y); var min_model_side = Math.min(model_dim.x, model_dim.y); var height_diff = printer_dim.z/model_dim.z; var max_side_diff = max_printer_side/max_model_side; var min_side_diff = min_printer_side/min_model_side; var side_diff = Math.min(max_side_diff, min_side_diff, height_diff); var max_scale = side_diff*100; if (isNaN(max_scale)) return false; if (max_scale < 100) jQuery('#p3dlite-model-message-scale').show(); else jQuery('#p3dlite-model-message-scale').hide(); if (typeof(p3dliteRangeSlider.noUiSlider)=='undefined') { //if (max_scale < 100) p3dlite.resize_scale = max_scale; noUiSlider.create(p3dliteRangeSlider, { start: [ 100 ], range: { 'min': [ 1 ], 'max': [ max_scale ] } }); var p3dliteRangeSliderValueElement = document.getElementById('p3dlite-slider-range-value'); p3dliteRangeSlider.noUiSlider.on('update', function( values, handle ) { p3dliteRangeSliderValueElement.value = values[handle]; p3dlite.resize_scale = values[handle]/100; jQuery('#p3dlite-resize-scale').val(p3dlite.resize_scale); printer_id=jQuery('input:radio[name=product_printer]:checked').data('id'); p3dliteChangePrinter(printer_id); p3dliteGetStats(); if (p3dlite.resize_scale<1) p3dlite_viewer.zoomFactor=p3dlite.zoom; else p3dlite_viewer.zoomFactor=parseInt(p3dlite.resize_scale*p3dlite.zoom); p3dlite_viewer.update() jQuery('#p3dlite-scale-x').val(jQuery('#scale_x').val()); jQuery('#p3dlite-scale-y').val(jQuery('#scale_y').val()); jQuery('#p3dlite-scale-z').val(jQuery('#scale_z').val()); }); } else { p3dliteRangeSlider.noUiSlider.updateOptions({ start: [ 100 ], range: { 'min': 1, 'max': max_scale } }); } p3dliteGetStats(); window.wp.hooks.doAction( '3dprint-lite.p3dliteInitScaleSlider_end'); } function p3dliteUpdateScale (value) { if (jQuery('.noUi-active').length==0) { clearInterval(p3dlite.refresh_interval1); if (value=='') { var p3dliteRangeSlider = document.getElementById('p3dlite-scale'); value = p3dliteRangeSlider.noUiSlider.get(); } p3dlite.refresh_interval1_running = false; p3dlite.resize_scale = value/100; jQuery('#p3dlite-resize-scale').val(p3dlite.resize_scale); printer_id=jQuery('input:radio[name=product_printer]:checked').data('id'); p3dliteChangePrinter(printer_id); p3dliteGetStats(); if (p3dlite.resize_scale<1) p3dlite_viewer.zoomFactor=p3dlite.zoom; else p3dlite_viewer.zoomFactor=parseInt(p3dlite.resize_scale*p3dlite.zoom); p3dlite_viewer.update() } } function p3dliteUpdateDimensions (obj) { window.wp.hooks.doAction( '3dprint-lite.p3dliteUpdateDimensions_start'); var cur_value=jQuery(obj).val(); if (isNaN(cur_value)) return; var scene = p3dlite_viewer.getScene(); var sceneBox=p3dlite.aabb; var model_dim=new Array(); model_dim.x=sceneBox.maxX-sceneBox.minX model_dim.y=sceneBox.maxY-sceneBox.minY model_dim.z=sceneBox.maxZ-sceneBox.minZ if (jQuery(obj).attr('id')=='scale_x') prev_value = model_dim.x; if (jQuery(obj).attr('id')=='scale_y') prev_value = model_dim.y; if (jQuery(obj).attr('id')=='scale_z') prev_value = model_dim.z; jQuery('#p3dlite-scale-x').val(jQuery('#scale_x').val()); jQuery('#p3dlite-scale-y').val(jQuery('#scale_y').val()); jQuery('#p3dlite-scale-z').val(jQuery('#scale_z').val()); var scale = (cur_value*10)/prev_value; var p3dliteRangeSlider = document.getElementById('p3dlite-scale'); if (typeof(p3dliteRangeSlider.noUiSlider)!=='undefined') { p3dliteRangeSlider.noUiSlider.set(scale*100) p3dlite.resize_scale = scale; } } function p3dliteUpdateSliderValue (value) { if (isNaN(value)) return false; var p3dliteRangeSlider = document.getElementById('p3dlite-scale'); if (typeof(p3dliteRangeSlider.noUiSlider)!=='undefined') { p3dliteRangeSlider.noUiSlider.set(value); } } if (window.FileReader && window.FileReader.prototype.readAsArrayBuffer) { p3dlite.filereader_supported=true; } else { p3dlite.filereader_supported=false; }