fork(8) download
  1. /**
  2.  * User: hudbrog (hudbrog@gmail.com)
  3.  * Date: 10/21/12
  4.  * Time: 7:31 AM
  5.  */
  6.  
  7. GCODE.gCodeReader = (function(){
  8. // ***** PRIVATE ******
  9. var gcode, lines;
  10. var z_heights = {};
  11. var model = [];
  12. var max = {x: undefined, y: undefined, z: undefined};
  13. var min = {x: undefined, y: undefined, z: undefined};
  14. var modelSize = {x: undefined, y: undefined, z: undefined};
  15. var filamentByLayer = {};
  16. var printTimeByLayer;
  17. var totalFilament=0;
  18. var printTime=0;
  19. var totalWeight = 0;
  20. var layerHeight = 0;
  21. var layerCnt = 0;
  22. var layerTotal = 0;
  23. var speeds = {};
  24. var slicer = 'unknown';
  25. var speedsByLayer = {};
  26. var volSpeeds = {};
  27. var volSpeedsByLayer = {};
  28. var extrusionSpeeds = {};
  29. var extrusionSpeedsByLayer = {};
  30. var gCodeOptions = {
  31. sortLayers: false,
  32. purgeEmptyLayers: true,
  33. analyzeModel: false,
  34. filamentType: "ABS",
  35. filamentDia: 1.75,
  36. nozzleDia: 0.4
  37. };
  38.  
  39. var prepareGCode = function(){
  40. if(!lines)return;
  41. gcode = [];
  42. var i;
  43. for(i=0;i<lines.length;i++){
  44. if(lines[i].match(/^(G0|G1|G90|G91|G92|M82|M83|G28)/i))gcode.push(lines[i]);
  45. }
  46. lines = [];
  47. // console.log("GCode prepared");
  48. };
  49.  
  50. var sortLayers = function(){
  51. var sortedZ = [];
  52. var tmpModel = [];
  53. // var cnt = 0;
  54. // console.log(z_heights);
  55. for(var layer in z_heights){
  56. sortedZ[z_heights[layer]] = layer;
  57. // cnt++;
  58. }
  59. // console.log("cnt is " + cnt);
  60. sortedZ.sort(function(a,b){
  61. return a-b;
  62. });
  63. // console.log(sortedZ);
  64. // console.log(model.length);
  65. for(var i=0;i<sortedZ.length;i++){
  66. // console.log("i is " + i +" and sortedZ[i] is " + sortedZ[i] + "and z_heights[] is " + z_heights[sortedZ[i]] );
  67. if(typeof(z_heights[sortedZ[i]]) === 'undefined')continue;
  68. tmpModel[i] = model[z_heights[sortedZ[i]]];
  69. }
  70. model = tmpModel;
  71. // console.log(model.length);
  72. delete tmpModel;
  73. };
  74.  
  75. var purgeLayers = function(){
  76. var purge=true;
  77. if(!model){
  78. console.log("Something terribly wring just happened.");
  79. return;
  80. }
  81. for(var i=0;i<model.length;i++){
  82. purge=true;
  83. if(typeof(model[i])==='undefined')purge=true;
  84. else {
  85. for(var j=0;j<model[i].length;j++){
  86. if(model[i][j].extrude)purge=false;
  87. }
  88. }
  89. if(purge){
  90. model.splice(i,1);
  91. i--;
  92. }
  93. }
  94. };
  95.  
  96. var getParamsFromKISSlicer = function(gcode){
  97. var nozzle = gcode.match(/extrusion_width_mm\s*=\s*(\d*\.\d+)/m);
  98. if(nozzle){
  99. gCodeOptions['nozzleDia'] = nozzle[1];
  100. }
  101. var filament = gcode.match(/fiber_dia_mm\s*=\s*(\d*\.\d+)/m);
  102. if(filament){
  103. gCodeOptions['filamentDia'] = filament[1];
  104. }
  105. }
  106.  
  107. var getParamsFromSlic3r = function(gcode){
  108. var nozzle = gcode.match(/nozzle_diameter\s*=\s*(\d*\.\d+)/m);
  109. if(nozzle){
  110. gCodeOptions['nozzleDia'] = nozzle[1];
  111. }
  112. var filament = gcode.match(/filament_diameter\s*=\s*(\d*\.\d+)/m);
  113. if(filament){
  114. gCodeOptions['filamentDia'] = filament[1];
  115. }
  116. }
  117.  
  118. var getParamsFromSkeinforge =function(gcode){
  119.  
  120. var nozzle = gcode.match(/nozzle_diameter\s*=\s*(\d*\.\d+)/m);
  121. if(nozzle){
  122. gCodeOptions['nozzleDia'] = nozzle[1];
  123. }
  124. var filament = gcode.match(/Filament_Diameter_(mm)\s*:\s*(\d*\.\d+)/m);
  125. if(filament){
  126. gCodeOptions['filamentDia'] = filament[1];
  127. }
  128. }
  129.  
  130. var getParamsFromMiracleGrue = function(gcode){
  131.  
  132. }
  133.  
  134. var getParamsFromCura = function(gcode){
  135. // console.log("cura");
  136. var profileString = gcode.match(/CURA_PROFILE_STRING:((?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4}))/m);
  137. if(profileString){
  138. var raw = window.atob(profileString[1]);
  139. var array = new Uint8Array(new ArrayBuffer(raw.length));
  140.  
  141. for(i = 0; i < raw.length; i++) {
  142. array[i] = raw.charCodeAt(i);
  143. }
  144. var data = new Zlib.inflate(array.subarray(2, array.byteLength-4));
  145. var msg;
  146. for(i=0; i < data.length; i+=1) {
  147. msg+=String.fromCharCode(data[i]);
  148. }
  149. var nozzle = msg.match(/nozzle_size\s*=\s*(\d*\.\d+)/m);
  150. if(nozzle){
  151. gCodeOptions['nozzleDia'] = nozzle[1];
  152. }
  153. var filament = msg.match(/filament_diameter\s*=\s*(\d*\.\d+)/m);
  154. if(filament){
  155. gCodeOptions['filamentDia'] = filament[1];
  156. }
  157.  
  158. }
  159. }
  160.  
  161. var detectSlicer = function(gcode){
  162.  
  163. if(gcode.match(/Slic3r/)){
  164. slicer = 'Slic3r';
  165. getParamsFromSlic3r(gcode);
  166. }else if(gcode.match(/KISSlicer/)){
  167. slicer = 'KISSlicer';
  168. getParamsFromKISSlicer(gcode);
  169. }else if(gcode.match(/skeinforge/)){
  170. slicer = 'skeinforge';
  171. getParamsFromSkeinforge(gcode);
  172. }else if(gcode.match(/CURA_PROFILE_STRING/)){
  173. slicer = 'cura';
  174. getParamsFromCura(gcode);
  175. }else if(gcode.match(/Miracle/)){
  176. slicer = 'makerbot';
  177. getParamsFromMiracleGrue(gcode);
  178. }
  179.  
  180. }
  181.  
  182.  
  183.  
  184. // ***** PUBLIC *******
  185. return {
  186.  
  187. loadUrl: function(url){
  188. $.ajax({
  189. type: "GET",
  190. url: url
  191. }).done(function(gcodeResponse){
  192. model = [];
  193. z_heights = [];
  194. detectSlicer(gcodeResponse);
  195. lines = gcodeResponse.split(/\n/);
  196. gcodeResponse = null;
  197. GCODE.ui.worker.postMessage({
  198. "cmd":"parseGCode",
  199. "msg":{
  200. gcode: lines,
  201. options: {
  202. firstReport: 5
  203. }
  204. }
  205. }
  206. );
  207. delete lines;
  208. });
  209. },
  210. loadFile: function(reader){
  211. //console.log("loadFile");
  212. model = [];
  213. z_heights = [];
  214. detectSlicer(reader.target.result);
  215. //console.log(reader.target.result);
  216. lines = reader.target.result.split(/\n/);
  217. reader.target.result = null;
  218. // prepareGCode();
  219.  
  220. GCODE.ui.worker.postMessage({
  221. "cmd":"parseGCode",
  222. "msg":{
  223. gcode: lines,
  224. options: {
  225. firstReport: 5
  226. }
  227. }
  228. }
  229. );
  230. delete lines;
  231.  
  232.  
  233.  
  234. },
  235. setOption: function(options){
  236. for(var opt in options){
  237. gCodeOptions[opt] = options[opt];
  238. }
  239. },
  240. passDataToRenderer: function(){
  241. // console.log(model);
  242. if(gCodeOptions["sortLayers"])sortLayers();
  243. // console.log(model);
  244. if(gCodeOptions["purgeEmptyLayers"])purgeLayers();
  245. // console.log(model);
  246. GCODE.renderer.doRender(model, 0);
  247. GCODE.renderer3d.setModel(model);
  248.  
  249. },
  250. processLayerFromWorker: function(msg){
  251. // var cmds = msg.cmds;
  252. // var layerNum = msg.layerNum;
  253. // var zHeightObject = msg.zHeightObject;
  254. // var isEmpty = msg.isEmpty;
  255. // console.log(zHeightObject);
  256. model[msg.layerNum] = msg.cmds;
  257. z_heights[msg.zHeightObject.zValue] = msg.zHeightObject.layer;
  258. // GCODE.renderer.doRender(model, msg.layerNum);
  259. },
  260. processMultiLayerFromWorker: function(msg){
  261. for(var i=0;i<msg.layerNum.length;i++){
  262. model[msg.layerNum[i]] = msg.model[msg.layerNum[i]];
  263. z_heights[msg.zHeightObject.zValue[i]] = msg.layerNum[i];
  264. }
  265. // console.log(model);
  266. },
  267. processAnalyzeModelDone: function(msg){
  268. min = msg.min;
  269. max = msg.max;
  270. modelSize = msg.modelSize;
  271. totalFilament = msg.totalFilament;
  272. filamentByLayer = msg.filamentByLayer;
  273. speeds = msg.speeds;
  274. speedsByLayer = msg.speedsByLayer;
  275. printTime = msg.printTime;
  276. printTimeByLayer = msg.printTimeByLayer;
  277. layerHeight = msg.layerHeight;
  278. layerCnt = msg.layerCnt;
  279. layerTotal = msg.layerTotal;
  280. volSpeeds = msg.volSpeeds;
  281. volSpeedsByLayer = msg.volSpeedsByLayer;
  282. extrusionSpeeds = msg.extrusionSpeeds;
  283. extrusionSpeedsByLayer = msg.extrusionSpeedsByLayer;
  284.  
  285. var density = 1;
  286. if(gCodeOptions['filamentType'] === 'ABS') {
  287. density = 1.04;
  288. }else if(gCodeOptions['filamentType'] === 'PLA') {
  289. density = 1.24;
  290. }
  291. totalWeight = density*3.141*gCodeOptions['filamentDia']/10*gCodeOptions['filamentDia']/10/4*totalFilament/10;
  292.  
  293. gCodeOptions['wh'] = parseFloat(gCodeOptions['nozzleDia'])/parseFloat(layerHeight);
  294. if(slicer === 'Slic3r' || slicer === 'cura'){
  295. // slic3r stores actual nozzle diameter, but extrusion is usually slightly thicker, here we compensate for that
  296. // kissslicer stores actual extrusion width - so no need for that.
  297. gCodeOptions['wh'] = gCodeOptions['wh']*1.1;
  298. }
  299. },
  300. getLayerFilament: function(z){
  301. return filamentByLayer[z];
  302. },
  303. getLayerSpeeds: function(z){
  304. return speedsByLayer[z]?speedsByLayer[z]:{};
  305. },
  306. getModelInfo: function(){
  307. return {
  308. min: min,
  309. max: max,
  310. modelSize: modelSize,
  311. totalFilament: totalFilament,
  312. speeds: speeds,
  313. speedsByLayer: speedsByLayer,
  314. printTime: printTime,
  315. printTimeByLayer: printTimeByLayer,
  316. totalWeight: totalWeight,
  317. layerHeight: layerHeight,
  318. layerCnt: layerCnt,
  319. layerTotal: layerTotal,
  320. volSpeeds: volSpeeds,
  321. volSpeedsByLayer: volSpeedsByLayer,
  322. extrusionSpeeds: extrusionSpeeds,
  323. extrusionSpeedsByLayer: extrusionSpeedsByLayer
  324. };
  325. },
  326. getGCodeLines: function(layer, fromSegments, toSegments){
  327. var i=0;
  328. var result = {first: model[layer][fromSegments].gcodeLine, last: model[layer][toSegments].gcodeLine};
  329. return result;
  330. },
  331. getOptions: function(){
  332. return gCodeOptions;
  333. }
  334. }
  335. }());
  336.  
Runtime error #stdin #stdout #stderr 0.49s 382976KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
js: uncaught JavaScript runtime exception: ReferenceError: "GCODE" is not defined.