mirror of
https://github.com/Doodle3D/Doodle3D-Slicer.git
synced 2024-11-22 21:47:59 +01:00
1 line
14 KiB
JavaScript
1 line
14 KiB
JavaScript
function sendAPI(t,e,i){"use strict";$.ajax({url:t,type:"POST",data:e,dataType:"json",timeout:1e4,success:function(t){"success"===t.status?void 0!==i&&i(t.data):console.warn(t.msg)}}).fail(function(){console.warn("failed connecting to "+t),sendAPI(t,e,i)})}function getAPI(t,e){"use strict";$.ajax({url:t,dataType:"json",timeout:5e3,success:function(t){"success"===t.status?void 0!==e&&e(t.data):console.warn(t.msg)}}).fail(function(){console.warn("failed connecting to "+t),getAPI(t,e)})}function downloadFile(t,e){"use strict";$(document.createElement("a")).attr({download:t,href:"data:text/plain,"+e})[0].click()}function applyMouseControls(t,e,i){"use strict";function r(){e.position.x=Math.cos(s)*Math.sin(o)*n,e.position.y=Math.sin(s)*n,e.position.z=Math.cos(s)*Math.cos(o)*n,e.lookAt(new THREE.Vector3(0,0,0))}var n=20,o=0,s=0,p=!1;$(t.domElement).on("mousedown",function(t){p=!0}).on("wheel",function(t){var e=t.originalEvent;e.preventDefault(),n=THREE.Math.clamp(n-e.wheelDelta,1,i),r()}),$(window).on("mouseup",function(t){p=!1}).on("mousemove",function(t){var e=t.originalEvent;p===!0&&(o=(o-e.webkitMovementX/100)%(2*Math.PI),s=THREE.Math.clamp(s+e.webkitMovementY/100,-Math.PI/2,Math.PI/2),r())}),r()}var D3D={version:"0.1",website:"http://www.doodle3d.com/",contact:"develop@doodle3d.com"};THREE.Vector2.prototype.normal=function(){"use strict";var t=this.y,e=-this.x;return this.set(t,e)},Array.prototype.clone=function(){"use strict";for(var t=[],e=0;e<this.length;e++)t[e]=this[e];return t};var requestAnimFrame=function(){"use strict";return requestAnimationFrame||webkitRequestAnimationFrame||mozRequestAnimationFrame||function(t){setTimeout(t,1e3/60)}}();D3D.Box=function(t){"use strict";var e=this;this.batchSize=512,this.maxBufferedLines=4096,this.localIp=t,this.api="http://"+t+"/d3dapi/",this.config={},this.printBatches=[],this.currentBatch=0,this.loaded=!1,this.getConfigAll(function(t){e.updateConfig(t),e.printer=new D3D.Printer(t),e.update(),e.loaded=!0,void 0!==e.onload&&e.onload()})},D3D.Box.prototype.updateConfig=function(t){"use strict";for(var e in t)0===e.indexOf("doodle3d")&&(this.config[e]=t[e]);return this},D3D.Box.prototype.update=function(){"use strict";this.printBatches.length>0?this.printBatch():this.updateState()},D3D.Box.prototype.updateState=function(){"use strict";var t=this;this.getInfoStatus(function(e){t.printer.status=e,void 0!==t.onupdate&&t.onupdate(e),t.update()})},D3D.Box.prototype.print=function(t){"use strict";for(this.currentBatch=0,t=t.clone();t.length>0;){var e=t.splice(0,Math.min(this.batchSize,t.length));this.printBatches.push(e)}return this},D3D.Box.prototype.printBatch=function(){"use strict";var t=this,e=this.printBatches.shift();this.setPrinterPrint({start:0===this.currentBatch?!0:!1,first:0===this.currentBatch?!0:!1,gcode:e.join("\n")},function(e){console.log("batch sent: "+t.currentBatch,e),t.printBatches.length>0&&t.currentBatch++,t.updateState()})},D3D.Box.prototype.stopPrint=function(){"use strict";this.printBatches=[],this.currentBatch=0;var t=["M107 ;fan off","G91 ;relative positioning","G1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure","G1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more","G28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way","M84 ;disable axes / steppers","G90 ;absolute positioning","M104 S180",";M140 S70","M117 Done ;display message (20 characters to clear whole screen)"];return this.setPrinterStop({gcode:t.join("\n")},function(t){console.log("Printer stop command sent")}),this},D3D.Box.prototype.getConfig=function(t,e){"use strict";getAPI(this.api+"config/?"+t.join("=&")+"=",e)},D3D.Box.prototype.getConfigAll=function(t){"use strict";getAPI(this.api+"config/all",t)},D3D.Box.prototype.setConfig=function(t,e){"use strict";var i=this;return sendAPI(this.api+"config",t,function(r){for(var n in r.validation)"ok"!==r.validation[n]&&delete t[n];i.updateConfig(t),i.printer.updateConfig(t),void 0!==e&&e(r)}),this},D3D.Box.prototype.getInfo=function(t){"use strict";getAPI(this.api+"info",t)},D3D.Box.prototype.getInfoStatus=function(t){"use strict";return getAPI(this.api+"info/status",t),this},D3D.Box.prototype.downloadInfoLogFiles=function(){"use strict";window.location=this.api+"info/logfiles"},D3D.Box.prototype.getInfoAcces=function(t){"use strict";return getAPI(this.api+"info/access",t),this},D3D.Box.prototype.getNetworkScan=function(t){"use strict";return getAPI(this.api+"network/scan",t),this},D3D.Box.prototype.getNetworkKnown=function(t){"use strict";return getAPI(this.api+"network/known",t),this},D3D.Box.prototype.getNetworkStatus=function(t){"use strict";return getAPI(this.api+"network/status",t),this},D3D.Box.prototype.setNetworkAssosiate=function(t,e){"use strict";return sendAPI(this.api+"network/associate",t,e),this},D3D.Box.prototype.setNetworkDisassosiate=function(t){"use strict";return sendAPI(this.api+"network/disassociate",{},t),this},D3D.Box.prototype.setNetworkOpenAP=function(t){"use strict";return sendAPI(this.api+"network/openap",{},t),this},D3D.Box.prototype.setNetworkRemove=function(t,e){"use strict";return sendAPI(this.api+"network/remove",{ssid:t},e),this},D3D.Box.prototype.getNetworkSignin=function(t){"use strict";return getAPI(this.api+"network/signin",t),this},D3D.Box.prototype.getNetworkAlive=function(t){"use strict";return getAPI(this.api+"network/alive",t),this},D3D.Box.prototype.getPrinterTemperature=function(t){"use strict";return getAPI(this.api+"printer/temperature",t),this},D3D.Box.prototype.getPrinterProgress=function(t){"use strict";return getAPI(this.api+"printer/progress",t),this},D3D.Box.prototype.getPrinterState=function(t){"use strict";return getAPI(this.api+"printer/state",t),this},D3D.Box.prototype.getPrinterListAll=function(t){"use strict";return getAPI(this.api+"printer/listall",t),this},D3D.Box.prototype.setPrinterHeatup=function(t){"use strict";return sendAPI(this.api+"printer/heatup",{},t),this},D3D.Box.prototype.setPrinterPrint=function(t,e){"use strict";return sendAPI(this.api+"printer/print",t,e),this},D3D.Box.prototype.setPrinterStop=function(t,e){"use strict";return sendAPI(this.api+"printer/stop",t,e),this},D3D.Box.prototype.getSketch=function(t,e){"use strict";return getAPI(this.api+"sketch/?id="+t,e),this},D3D.Box.prototype.setSketch=function(t,e){"use strict";return sendAPI(this.api+"sketch",{data:t},e),this},D3D.Box.prototype.getSketchStatus=function(t){"use strict";return getAPI(this.api+"sketch/status",t),this},D3D.Box.prototype.setSketchClear=function(t){"use strict";return sendAPI(this.api+"sketch/clear",t),this},D3D.Box.prototype.getSystemVersions=function(t){"use strict";return getAPI(this.api+"system/fwversions",t),this},D3D.Box.prototype.getUpdateStatus=function(t){"use strict";return getAPI(this.api+"update/status",t),this},D3D.Box.prototype.setUpdateDownload=function(t){"use strict";return sendAPI(this.api+"update/download",{},t),this},D3D.Box.prototype.setUpdateInstall=function(t){"use strict";return sendAPI(this.api+"update/install",{},t),this},D3D.Box.prototype.setUpdateClear=function(t){"use strict";return sendAPI(this.api+"update/clear",{},t),this},D3D.Printer=function(t){"use strict";this.status={},this.config={},this.updateConfig(t)},D3D.Printer.prototype.updateConfig=function(t){"use strict";for(var e in t)0===e.indexOf("printer")&&(this.config[e]=t[e]);return this},D3D.Printer.prototype.getStartCode=function(){"use strict";var t=this.config["printer.startcode"];return t=this.subsituteVariables(t),t.split("\n")},D3D.Printer.prototype.getEndCode=function(){"use strict";var t=this.config["printer.endcode"];return t=this.subsituteVariables(t),t.split("\n")},D3D.Printer.prototype.subsituteVariables=function(t){"use strict";var e=this.config["printer.temperature"],i=this.config["printer.bed.temperature"],r=this.config["printer.heatup.temperature"],n=this.config["printer.heatup.bed.temperature"],o=this.config["printer.type"],s=this.config["printer.heatedbed"];switch(o){case"makerbot_replicator2":o="r2";break;case"makerbot_replicator2x":o="r2x";break;case"makerbot_thingomatic":o="t6";break;case"makerbot_generic":o="r2";break;case"_3Dison_plus":o="r2"}var p=s?"":";";return t=t.replace(/{printingTemp}/gi,e),t=t.replace(/{printingBedTemp}/gi,i),t=t.replace(/{preheatTemp}/gi,r),t=t.replace(/{preheatBedTemp}/gi,n),t=t.replace(/{printerType}/gi,o),t=t.replace(/{if heatedBed}/gi,p)},D3D.Slicer=function(){"use strict";this.lines=[]},D3D.Slicer.prototype.setGeometry=function(t){"use strict";return t instanceof THREE.BufferGeometry&&(t=(new THREE.Geometry).fromBufferGeometry(t)),this.geometry=t.clone(),this.geometry.mergeVertices(),this.createLines(),this},D3D.Slicer.prototype.createLines=function(){"use strict";function t(t,r){var n=e[t+"_"+r]||e[r+"_"+t];return void 0===n&&(n=i.lines.length,e[t+"_"+r]=n,i.lines.push({line:new THREE.Line3(i.geometry.vertices[t],i.geometry.vertices[r]),connects:[],normals:[]})),n}this.lines=[];for(var e={},i=this,r=0;r<this.geometry.faces.length;r++){var n=this.geometry.faces[r],o=(new THREE.Vector2).set(n.normal.x,n.normal.z).normalize(),s=t(n.a,n.b),p=t(n.b,n.c),a=t(n.c,n.a);this.lines[s].connects.push(p,a),this.lines[p].connects.push(a,s),this.lines[a].connects.push(s,p),this.lines[s].normals.push(o),this.lines[p].normals.push(o),this.lines[a].normals.push(o)}},D3D.Slicer.prototype.slice=function(t,e){"use strict";for(var i=[],r=new THREE.Plane,n=0;t>n;n+=e){r.set(new THREE.Vector3(0,-1,0),n);for(var o=[],s=[],p=0;p<this.lines.length;p++){var a=this.lines[p].line,c=r.intersectLine(a);if(void 0!==c){var u=new THREE.Vector2(c.x+100,c.z+100);s.push(u)}else s.push(!1)}for(var h=[],p=0;p<s.length;p++)if(s[p]&&-1===h.indexOf(p)){for(var l=p,f=[];-1!==l;){var c=s[l];f.push({X:c.x,Y:c.y}),h.push(l);for(var d=this.lines[l].connects,g=this.lines[l].normals,D=0;D<d.length;D++)if(l=d[D],s[l]&&-1===h.indexOf(l)){var y=(new THREE.Vector2).set(c.x,c.y),P=s[l],m=y.sub(P).normal().normalize(),v=g[Math.floor(D/2)];if(m.dot(v)>0)break;l=-1}else l=-1}f.length>0&&(f.push({X:f[0].X,Y:f[0].Y}),o.push(f))}if(!(o.length>0))break;i.push(o)}return i},D3D.Slicer.prototype.getInset=function(t,e){"use strict";var i=new ClipperLib.Paths,r=new ClipperLib.ClipperOffset(1,1);return r.AddPaths(t,ClipperLib.JoinType.jtRound,ClipperLib.EndType.etClosedPolygon),r.Execute(i,-e),i},D3D.Slicer.prototype.getFillTemplate=function(t,e,i,r){"use strict";var n=new ClipperLib.Paths;if(i)for(var o=0;t>=o;o+=e)n.push([{X:o,Y:0},{X:o,Y:t}]);if(r)for(var o=0;t>=o;o+=e)n.push([{X:0,Y:o},{X:t,Y:o}]);return n},D3D.Slicer.prototype.slicesToData=function(t,e){"use strict";for(var i=100,r=e.config["printer.layerHeight"]*i,n=e.config["printer.dimensions.z"]*i,o=e.config["printer.wallThickness"]*i,s=e.config["printer.shellThickness"]*i,p=e.config["printer.fillSize"]*i,a=(e.config["printer.brimOffset"]*i,[]),c=this.getFillTemplate(n,p,!0,!0),u=0;u<t.length;u++){var h=t[u],l=h.clone();ClipperLib.JS.ScaleUpPaths(l,i);for(var f=[],d=o;s>d;d+=o){var g=this.getInset(l,d);f=f.concat(g)}for(var D=g||l,y=!1,d=1;s/r>d;d++){var P=ClipperLib.JS.Clone(t[u+d]);if(ClipperLib.JS.ScaleUpPaths(P,i),0===P.length||y&&0===y.length){y=[];break}if(y===!1)y=P;else{var m=new ClipperLib.Clipper,v=new ClipperLib.Paths;m.AddPaths(P,ClipperLib.PolyType.ptSubject,!0),m.AddPaths(y,ClipperLib.PolyType.ptClip,!0),m.Execute(ClipperLib.ClipType.ctIntersection,v),y=v}}var b=new ClipperLib.Clipper,w=new ClipperLib.Paths;b.AddPaths(D,ClipperLib.PolyType.ptSubject,!0),b.AddPaths(y,ClipperLib.PolyType.ptClip,!0),b.Execute(ClipperLib.ClipType.ctDifference,w);var b=new ClipperLib.Clipper,x=new ClipperLib.Paths;b.AddPaths(D,ClipperLib.PolyType.ptSubject,!0),b.AddPaths(w,ClipperLib.PolyType.ptClip,!0),b.Execute(ClipperLib.ClipType.ctDifference,x);var C=[],b=new ClipperLib.Clipper,B=new ClipperLib.Paths;b.AddPaths(c,ClipperLib.PolyType.ptSubject,!1),b.AddPaths(x,ClipperLib.PolyType.ptClip,!0),b.Execute(ClipperLib.ClipType.ctIntersection,B),C=C.concat(B);var A=this.getFillTemplate(n,o,u%2===0,u%2===1),b=new ClipperLib.Clipper,S=new ClipperLib.Paths;b.AddPaths(A,ClipperLib.PolyType.ptSubject,!1),b.AddPaths(w,ClipperLib.PolyType.ptClip,!0),b.Execute(ClipperLib.ClipType.ctIntersection,S),C=C.concat(S),ClipperLib.JS.ScaleDownPaths(l,i),ClipperLib.JS.ScaleDownPaths(f,i),ClipperLib.JS.ScaleDownPaths(C,i),a.push({outerLayer:l,innerLayer:f,fill:C})}return a},D3D.Slicer.prototype.dataToGcode=function(t,e){"use strict";function i(t){for(var e=[],i=0;i<t.length;i++)for(var n,o=t[i],s=0;s<o.length;s++){var p=o[s];if(0===s)D>f&&h&&e.push(["G0","E"+(D-d).toFixed(3),"F"+(60*l).toFixed(3)].join(" ")),e.push(["G0","X"+p.X.toFixed(3)+" Y"+p.Y.toFixed(3)+" Z"+w,"F"+60*a].join(" ")),D>f&&h&&e.push(["G0","E"+D.toFixed(3),"F"+(60*l).toFixed(3)].join(" "));else{var c=(new THREE.Vector2).set(p.X,p.Y),g=(new THREE.Vector2).set(n.X,n.Y),v=c.distanceTo(g);D+=v*u*r/P*m,e.push(["G1","X"+p.X.toFixed(3)+" Y"+p.Y.toFixed(3)+" Z"+w,"F"+y,"E"+D.toFixed(3)].join(" "))}n=p}return e}for(var r=e.config["printer.layerHeight"],n=e.config["printer.speed"],o=e.config["printer.bottomLayerSpeed"],s=e.config["printer.firstLayerSlow"],p=e.config["printer.bottomFlowRate"],a=e.config["printer.travelSpeed"],c=e.config["printer.filamentThickness"],u=e.config["printer.wallThickness"],h=(e.config["printer.enableTraveling"],e.config["printer.retraction.enabled"]),l=e.config["printer.retraction.speed"],f=e.config["printer.retraction.minDistance"],d=e.config["printer.retraction.amount"],g=e.getStartCode(),D=0,y=s?(60*o).toFixed(3):(60*n).toFixed(3),P=Math.pow(c/2,2)*Math.PI,m=p,v=0;v<t.length;v++){var b=t[v];2===v&&(g.push("M106"),y=(60*n).toFixed(3),m=1);var w=((v+1)*r).toFixed(3);g=g.concat(i(b.outerLayer)),g=g.concat(i(b.innerLayer)),g=g.concat(i(b.fill))}return g=g.concat(e.getEndCode())},D3D.Slicer.prototype.drawPaths=function(t,e,i){"use strict";function r(t,e){c.fillStyle=e,c.strokeStyle=e,c.beginPath();for(var i=0;i<t.length;i++){var r=t[i];c.moveTo(2*r[0].X,2*r[0].Y);for(var n=0;n<r.length;n++){var o=r[n];c.lineTo(2*o.X,2*o.Y)}}c.stroke()}var n=t.config["printer.layerHeight"],o=t.config["printer.dimensions.z"],s=this.slice(o,n);s.shift();var p=this.slicesToData(s,t),a=document.createElement("canvas");a.width=400,a.height=400;for(var c=a.getContext("2d"),u=e;i>u;u++){var h=p[u%p.length];r(h.outerLayer,"red"),r(h.innerLayer,"green"),r(h.fill,"blue")}return a},D3D.Slicer.prototype.getGcode=function(t){"use strict";var e=t.config["printer.layerHeight"],i=t.config["printer.dimensions.z"],r=this.slice(i,e);r.shift();var n=this.slicesToData(r,t),o=this.dataToGcode(n,t);return o}; |