From 7f4965400c5b036fa9bf81425c578c6d47a0008e Mon Sep 17 00:00:00 2001 From: Rick Companje Date: Mon, 27 Apr 2015 23:38:01 +0200 Subject: [PATCH] progress on printmanager --- js/api/API.js | 22 +- js/api/ConfigAPI.js | 8 +- js/api/PrinterAPI.js | 9 +- www/index.html | 4 +- www/printmanager/css/style.css | 49 +++- www/printmanager/index.html | 50 ++-- www/printmanager/js/Doodle.js | 28 ++- www/printmanager/js/Doodle2gcode.js | 79 +++--- www/printmanager/js/PrintPreview.js | 374 ++++++++++++++++++++++++++++ www/printmanager/js/Viewer.js | 170 +------------ www/printmanager/js/ViewerItem.js | 136 ++++++++++ www/printmanager/js/main.js | 97 ++++---- 12 files changed, 736 insertions(+), 290 deletions(-) create mode 100755 www/printmanager/js/PrintPreview.js create mode 100644 www/printmanager/js/ViewerItem.js diff --git a/js/api/API.js b/js/api/API.js index fcaff8e..6026512 100644 --- a/js/api/API.js +++ b/js/api/API.js @@ -11,8 +11,15 @@ var API = function() { var _wifiboxURL = 'http://192.168.5.1/d3dapi/'; var _wifiboxCGIBinURL = 'http://192.168.5.1/cgi-bin/d3dapi/'; var _timeoutTime = 10000; + var _isBusy = false; + + function setURL(url,cgiUrl) { + _wifiboxURL = url; + _wifiboxCGIBinURL = cgiUrl || url; + } function post(cmd,data,success,fail) { + _isBusy = true; $.ajax({ url: _wifiboxURL + cmd, type: "POST", @@ -20,6 +27,7 @@ var API = function() { dataType: 'json', timeout: _timeoutTime, success: function(response){ + _isBusy = false; if(response.status == "error" || response.status == "fail") { console.log('API.post fail',cmd) if (fail) fail(response); @@ -29,18 +37,21 @@ var API = function() { } } }).fail(function(jqXHR, textStatus) { + _isBusy = false; console.log('API.post fail',cmd,jqXHR,textStatus); if (fail) fail(jqXHR,textStatus); }); } function get(cmd,success,fail) { + _isBusy = true; $.ajax({ url: _wifiboxURL + cmd, type: "GET", dataType: 'json', timeout: _timeoutTime, - success: function(response){ + success: function(response) { + _isBusy = false; if (response.status == "error" || response.status == "fail") { console.log('API.get fail',cmd,response); if (fail) fail(response); @@ -50,14 +61,21 @@ var API = function() { } } }).fail(function() { + _isBusy = false; console.log('API.get fail',cmd); if (fail) fail(); }); } + function getBusy() { + return _isBusy; + } + return { get: get, - post: post + post: post, + getBusy: getBusy, + setURL: setURL, } }(); diff --git a/js/api/ConfigAPI.js b/js/api/ConfigAPI.js index c40ec70..84550de 100644 --- a/js/api/ConfigAPI.js +++ b/js/api/ConfigAPI.js @@ -7,7 +7,12 @@ */ function ConfigAPI() { - + var className = 'ConfigAPI'; + + function init() { + console.log(className,'init is deprecated'); + } + function loadAll(success,fail) { API.get('config/all',success,fail); }; @@ -73,6 +78,7 @@ function ConfigAPI() { } return { + init: init, loadAll: loadAll, load: load, save: save, diff --git a/js/api/PrinterAPI.js b/js/api/PrinterAPI.js index 58ebc49..12eea81 100644 --- a/js/api/PrinterAPI.js +++ b/js/api/PrinterAPI.js @@ -7,10 +7,15 @@ */ function PrinterAPI() { + var className = 'PrinterAPI'; this.remainingLines = []; this.totalLinesAtStart = 0; + this.init = function() { + console.log(className,'init is deprecated'); + } + this.state = function(success,fail) { API.get('printer/state',success,fail); }; @@ -57,8 +62,8 @@ function PrinterAPI() { var data = {gcode: chunk.join("\n"), first: first, start: start}; _printPartPost(lines,data,function() { - console.log('_printPartPost cb'); - cb(); //??? needed + // console.log('_printPartPost cb'); + // cb(); //??? needed }); } else { diff --git a/www/index.html b/www/index.html index 3a98691..947ee87 100644 --- a/www/index.html +++ b/www/index.html @@ -182,8 +182,8 @@ - - + + diff --git a/www/printmanager/css/style.css b/www/printmanager/css/style.css index 7618d39..7c72e0f 100644 --- a/www/printmanager/css/style.css +++ b/www/printmanager/css/style.css @@ -1,6 +1,7 @@ body { - font-family: Helvetica, Abel, Arial; + font-family: Abel, 'sans-serif-thin', Sans-serif, Helvetica, Arial; font-size: 1em; + margin: 0 0 0 0; -webkit-user-select: none; /* webkit (safari, chrome) browsers */ -moz-user-select: none; /* mozilla browsers */ @@ -12,13 +13,47 @@ button { font-size: 1em; } +#toolbar { + padding-top: 10px; + padding-left: 10px; + float: left; + width: 300px; + height: 100%; +} + +#btnPrint { + font-size: 30px; + /*width: 100px;*/ + /*height: 100px;*/ +} + +#toolbar h1 { + margin-top: 5px; + font-size: 1.5em; +} + +#rightToolbar { + margin-top: 5px; + margin-right: 5px; + float: right; +} + +#toolbar button { + display: block; + margin-top: 10px; + margin-right: 10px; +} + #svgContainer { - width: 540px; - height: 540px; + /*margin-top: 10px;*/ + background-color: #fff; + width: 640px; + height: 640px; border: 1px solid black; margin: 0 auto; position: relative; overflow: hidden; + top: 10px; display: inline-block; } #svgContainer svg { @@ -27,8 +62,8 @@ button { } #printPreview { - width: 540px; - height: 540px; + width: 640px; + height: 640px; border: 1px solid black; margin: 0 auto; position: relative; @@ -70,6 +105,7 @@ button { img#logo { cursor: pointer; margin-right: 10px; + width: 200px; } #buttonsPanel { @@ -79,7 +115,8 @@ img#logo { span.statusvar { background-color: #7cf; margin: 2px 2px 2px 2px; - padding: 5px 5px 2px 5px; + /*padding: 5px 5px 2px 5px;*/ + display: block; } #preview { diff --git a/www/printmanager/index.html b/www/printmanager/index.html index 078c336..a5de145 100644 --- a/www/printmanager/index.html +++ b/www/printmanager/index.html @@ -3,45 +3,47 @@ Doodle3D - - - - - - - + - PrintManager - - - - - - - - - - - - -
+
+ +

Management App

+
+ + + + + + + + + + + +
+
-
+
+ +
+ + + - + + diff --git a/www/printmanager/js/Doodle.js b/www/printmanager/js/Doodle.js index 6d00064..36b53f1 100644 --- a/www/printmanager/js/Doodle.js +++ b/www/printmanager/js/Doodle.js @@ -1,32 +1,40 @@ var Doodle = function(svgData,settings) { var path = new Path(); - var height = 50; //in mm + var height = 10; //in mm var offset = new Point(0,0); var scale = 1; var rotation = 0; - var twist = 0; + var twist = .1; - if (svgData!==undefined) { + if (settings!=undefined) { + if (settings.height!=undefined) height = settings.height; + if (settings.twist!=undefined) twist = settings.twist; + if (settings.scale!=undefined) scale = settings.scale; + if (settings.offset!=undefined) offset = settings.offset; + } + + if (svgData!=undefined) { setFromSvgPathDescription(svgData); removeShortPaths(); //move this to main.js? - //TODO: determine current offset from boundingbox and store in 'offset' variable + // offset.x += path.getBoundingBox().getX(); + // offset.y += path.getBoundingBox().getY(); + path.alignCorner(); //set left-top corner of path boundingbox to 0,0 + + // scale = 1; + + // console.log(path.getBoundingBox().getX(),offset); } - if (settings!==undefined) { - if (settings.height!==undefined) height = settings.height; - if (settings.twist!==undefined) twist = settings.twist; - } function setFromSvgPathDescription(svgData) { // if (!svgData) svgData = ""; // else if (typeof(svgData)!='string') svgData = ""; // // else if (svgData.indexOf("CDATA")==-1) svgData = ""; // else svgData = svgData.split('d="')[1].split('"')[0]; - - console.log('svgData',svgData); + // console.log('svgData',svgData); svgData+=' '; //add a trailing space diff --git a/www/printmanager/js/Doodle2gcode.js b/www/printmanager/js/Doodle2gcode.js index 21196a1..7f10d8c 100644 --- a/www/printmanager/js/Doodle2gcode.js +++ b/www/printmanager/js/Doodle2gcode.js @@ -1,17 +1,23 @@ var Doodle2gcode = function() { var className = "Doodle2gcode"; - var speed = 50; + var speed = 100 * 60; //mm/min + var travelSpeed = 150 * 60 //mm/min + var retractionSpeed = 45 * 60 //mm/min + var retractionAmount = 4.5; var layerHeight = .2; var filamentDiameter = 2.89; var nozzleDiameter = .4; var dimensions = {x:200,y:200,z:200}; var px2mm = .3; + var flow = 1; + var filamentArea = Math.PI * (filamentDiameter/2)*(filamentDiameter/2); + var extrusionPerMM = layerHeight / filamentArea * flow; - var nozzleFilamentRatio = nozzleDiameter / filamentDiameter; - var layerNozzleRatio = layerHeight / nozzleDiameter; - var extrudeFactor = nozzleFilamentRatio * layerNozzleRatio; - var flowRatio = 1; + // var nozzleFilamentRatio = nozzleDiameter / filamentDiameter; + // var layerNozzleRatio = layerHeight / nozzleDiameter; + // var extrudeFactor = nozzleFilamentRatio * layerNozzleRatio; + // var flowRatio = 1; var extruder = 0; @@ -19,16 +25,13 @@ var Doodle2gcode = function() { var gcode = ""; extruder = 0; for (var z=0,layer=0; z0) { - var dist = points[j-1].distance(points[j]) * px2mm; - extruder += dist * extrudeFactor * flowRatio; - gcode += 'E' + extruder.toFixed(4); + //extrude + if (j>0) { + var dist = points[j-1].distance(points[j]) * px2mm; + extruder += dist * extrusionPerMM; + gcode += 'E' + extruder.toFixed(4); + } + + gcode += '\n'; } - gcode += '\n'; } } return gcode; diff --git a/www/printmanager/js/PrintPreview.js b/www/printmanager/js/PrintPreview.js new file mode 100755 index 0000000..09e5380 --- /dev/null +++ b/www/printmanager/js/PrintPreview.js @@ -0,0 +1,374 @@ +var PrintPreview = function(jqCanvas) { + var canvas = jqCanvas[0]; + + // === basic wheel reinvention stuff === + + // function $(id) { return document.getElementById(id) } + + // comparison function using a key, to pass to .sort() + function keycomp(key) { + return function(a, b) { + var ka = key(a) + var kb = key(b) + if (ka < kb) return -1 + if (ka > kb) return 1 + return 0 + } + } + + // return a list transformed by a function + function map(f, list) { + var rv = [] + for (var ii = 0; ii < list.length; ii++) rv.push(f(list[ii])) + return rv + } + + // === 3d transforms === + + // We represent transforms as a 3x4 list of lists (ahem, array of arrays): + // [[x_from_x, x_from_y, x_from_z, x_off], + // [y_from_x, y_from_y, y_from_z, y_off], + // [z_from_x, z_from_y, z_from_z, z_off]] + // And we only actually multiply points through them in xform. + function translate(x, y, z) { + return [[1, 0, 0, x], [0, 1, 0, y], [0, 0, 1, z]] + } + function identity() { return translate(0, 0, 0) } + // rotation around the Z-axis + function rotate(theta) { + var s = Math.sin(theta) + var c = Math.cos(theta) + return [[c, -s, 0, 0], [s, c, 0, 0], [0, 0, 1, 0]] + } + // exchange two of the X, Y, Z axes --- useful for making rotate() go around + // another axis :) +function transpose_axes(a, b) { + var rv = identity() + var tmp = rv[a] + rv[a] = rv[b] + rv[b] = tmp + return rv +} + // you'd think we'd have a scale() function too, but I haven't needed it yet. + // concatenate two transforms --- the magic that makes it all possible + function concat(x1, x2) { + var rv = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] + for (var ii = 0; ii < 3; ii++) { + rv[ii][3] = x2[ii][3] + for (var jj = 0; jj < 3; jj++) { + rv[ii][3] += x1[jj][3] * x2[ii][jj] + for (var kk = 0; kk < 3; kk++) { + rv[ii][jj] += x1[kk][jj] * x2[ii][kk] + } + } + } + return rv + } + // concatenate N transforms. I'd insert a special case for 0 transforms, + // but amusingly this function isn't all that performance-critical. + function concat_n(xforms) { + var rv = identity() + for (var ii = 0; ii < xforms.length; ii++) rv = concat(rv, xforms[ii]) + return rv + } + // transform a point. + function xform(xform, p) { + var result_vec = [] + for (var ii = 0; ii < 3; ii++) { + var rv = xform[ii][3] + for (var jj = 0; jj < 3; jj++) rv += xform[ii][jj] * p[jj] + result_vec.push(rv) + } + return result_vec + } + // transform multiple points. + function xform_points(xf, points) { + var xp = [] + for (var ii = 0; ii < points.length; ii++) { + xp.push(xform(xf, points[ii])) + } + return xp + } + // perspective-transform a point --- into 2d. + function persp(p) { return [p[0] / p[2], p[1] / p[2]] } + // perspective-transform multiple points + function persp_points(points) { + return map(persp, points) + } + + // return the normal of a triangle defined by three points. + function normal(p1, p2, p3) { + var v1 = [p1[0]-p2[0], p1[1]-p2[1], p1[2]-p2[2]] + var v2 = [p2[0]-p3[0], p2[1]-p3[1], p2[2]-p3[2]] + var n = [v1[1]*v2[2]-v1[2]*v2[1], + v1[2]*v2[0]-v1[0]*v2[2], + v1[0]*v2[1]-v1[1]*v2[0]] + var mag = Math.sqrt(n[0]*n[0] + n[1]*n[1] + n[2]*n[2]) + return [n[0]/mag, n[1]/mag, n[2]/mag] + } + + // === 3d shapes === + // We represent these as an array of three arrays + // [points, lines, polies] where each line is two indices into the points array + // and each poly is three indices into the points array + + function dup(array) { + var newarray = new Array(array.length) + for (var ii = 0; ii < array.length; ii++) newarray[ii] = array[ii] + return newarray + } + + // transform a shape, returning a new shape + function xform_shape(xf, shape) { + // de-alias new lines and polies + return [xform_points(xf, shape[0]), dup(shape[1]), dup(shape[2])] + } + + // add a new shape onto an old shape, mutating the old one + function augment(shape1, shape2) { + var s1p = shape1[0] + var off = s1p.length + for (var ii = 0; ii < shape2[0].length; ii++) s1p.push(shape2[0][ii]) + var s2ll = shape2[1].length // in case of aliasing + for (var ii = 0; ii < s2ll; ii++) + shape1[1].push([shape2[1][ii][0] + off, shape2[1][ii][1] + off]) + var s2pl = shape2[2].length + for (var ii = 0; ii < s2pl; ii++) { + var tri = shape2[2][ii] + shape1[2].push([tri[0]+off, tri[1]+off, tri[2]+off]) + } +} + + // given a shape, make a more complicated shape by copying it through transform + // xf n times, and connecting the corresponding points. This is more powerful + // than the usual kind of extrusion, and can be used to create fairly + // interesting shapes --- a snail shell from a circle, for instance. + function extrude_shape(xf, shape, n) { + if (n == null) n = 1 + var new_part = shape + var old_line_base = 0 // where the lines to attach the triangles start + for (var ii = 0; ii < n; ii++) { + var new_part = xform_shape(xf, new_part) + var shape_length = shape[0].length + var new_line_base = shape[1].length // for triangles later + augment(shape, new_part) + var new_part_length = new_part[0].length + // connect corresponding points + for (var jj = 0; jj < new_part_length; jj++) { + shape[1].push([shape_length + jj - new_part_length, shape_length + jj]) + } + // make triangles + var nlines = new_part[1].length + // var old_line_base = new_line_base - nlines + for (var jj = 0; jj < nlines; jj++) { + var old_line = shape[1][old_line_base + jj] + var new_line = shape[1][new_line_base + jj] + shape[2].push([old_line[0], old_line[1], new_line[0]]) + shape[2].push([new_line[1], new_line[0], old_line[1]]) + } + old_line_base = new_line_base + } + } + // a shape consisting of a single point + function point_shape(x, y, z) { return [[[x, y, z]], [], []] } + // approximate a circle in the x-y plane around the origin; radius r and n points + function circle(r, n) { + var shape = point_shape(r, 0, 0) + extrude_shape(rotate(Math.atan(1)*8/n), shape, n) + return shape + } + // approximate a torus with major radius r2 and minor radius r1, + // with correspondingly n2 and n1 points around each axis + function make_torus(r1, r2, n1, n2) { + var c = xform_shape(translate(r2, 0, 0), circle(r1, n1)) + extrude_shape(concat_n([transpose_axes(1, 2), + rotate(Math.atan(1)*8/n2), + transpose_axes(1, 2)]), + c, n2) + return c + } + + // === drawing code === + + // draw a 3d shape on a canvas + // 95% of the run time is in this function and its kids + function draw_shape(canvas, xf, shape, alpha) { + var ctx = canvas.getContext('2d') + var w = canvas.width + var h = canvas.height + + // set up coordinate system so canvas is (-1, -1) to (1, 1) + ctx.save() + ctx.translate(w/2, h/2) + ctx.scale(w/2, h/2) + + // 1/3 of the time is in these two lines (when not doing polies) + var points3d = xform_points(xf, shape[0]) + var points = persp_points(points3d) + var lines = shape[1] + // 2/3 of the time is in this loop (when we're not doing polies) + if (alpha == null) { + ctx.strokeStyle = 'grey' + ctx.lineWidth = 1/(w/2) + ctx.beginPath() + var p1, p2 + for (var ii = 0; ii < lines.length; ii++) { + p1 = points[lines[ii][0]] + p2 = points[lines[ii][1]] + ctx.moveTo(p1[0], p1[1]) + ctx.lineTo(p2[0], p2[1]) + } + ctx.stroke() + } + + // when we're doing polies, 90% of our time is spent doing polies + if (alpha != null) { + // Sort polygons by depth so we draw the farthest-away stuff first + // ("painter's algorithm") + var minusdepth = function(p) { + return [-(points3d[p[0]][2] + points3d[p[1]][2] + points3d[p[2]][2]), p] + } + var polies = map(minusdepth, shape[2]) + polies.sort(keycomp(function(p) { return p[0] })) + + // draw all the polygons + var tri, p1, p2, p3, n, bright + for (var ii = 0; ii < polies.length; ii++) { + tri = polies[ii][1] + if (alpha == '1') { + // light surface + n = normal(points3d[tri[0]], points3d[tri[1]], points3d[tri[2]]) + // I'm not sure how to make backface removal work with perspective: + // if (n[2] > 0 && alpha == '1') continue // backface removal + + // lighting from (1, -1, -1) direction + bright = parseInt(((n[0]-n[1]-n[2]) / Math.sqrt(3) * 255)) + if (bright < 20) bright = 20 + } else { + // lighting doesn't make sense if the object is transparent, + // so we color by depth to have some variation in color... + var maxd = polies[polies.length-1][0] + var mind = polies[0][0] + var d = polies[ii][0] + bright = parseInt((d-mind)/(maxd-mind) * 255) + } + ctx.fillStyle = 'rgba(' + bright + ',' + bright + ',' + bright + ',' + alpha + ')'; + ctx.beginPath() + p1 = points[tri[0]] + p2 = points[tri[1]] + p3 = points[tri[2]] + ctx.moveTo(p1[0], p1[1]) + ctx.lineTo(p2[0], p2[1]) + ctx.lineTo(p3[0], p3[1]) + // ctx.closePath() seems to be unnecessary + ctx.fill() + } + } + + ctx.restore() + } + // clear a canvas + function cls(canvas) { + var ctx = canvas.getContext('2d') + ctx.fillStyle = 'black' + ctx.fillRect(0, 0, canvas.width, canvas.height) + } + + // // === drawing of particular shapes. also DOM. === + // angle = 0 + // function unit_cube() { + // var shape = point_shape(0, 0, 0) + // extrude_shape(translate(0,0,1), shape) + // extrude_shape(translate(0,1,0), shape) + // extrude_shape(translate(1,0,0), shape) + // return shape + // } + + // // this was where I tested stuff as I wrote this + // function make_some_junk() { + // // make a unit cube centered on the origin + // var shape = xform_shape(translate(-0.5, -0.5, -0.5), unit_cube()) + + // // add some circles + // augment(shape, circle(0.707, 16)) + // augment(shape, xform_shape(transpose_axes(0, 2), circle(0.707, 16))) + // augment(shape, xform_shape(transpose_axes(1, 2), circle(0.707, 16))) + // augment(shape, circle(1, 15)) + + // // add a disc + // var big_disc = circle(2, 20) + // extrude_shape(translate(0, 0, 0.5), big_disc, 2) + // augment(shape, big_disc) + // return shape + // } + // var some_junk = make_some_junk() + + // function draw_some_junk(canvas) { + // var xf = concat_n([transpose_axes(1, 2), + // rotate(angle), + // transpose_axes(1, 2), + // rotate(angle*1.618), + // translate(0, 0, 2.5)]) + + // draw_shape(canvas, xf, some_junk) + // } + + var torus = make_torus(1, 3, 12, 12) + + console.log('torus',torus); + + function draw() { + // var start = new Date() + // var alpha = null + // if ($('fill').checked) { + // alpha = ($('translucent').checked ? '0.5' : 1) + // } + // if ($('trails').checked) { + // $('canvas').getContext('2d').globalAlpha = 0.33 + // } else { + // $('canvas').getContext('2d').globalAlpha = 1 + // } + + var angle = 0; + var alpha = 1; + + draw_shape(canvas, + concat_n([ + rotate(0), + transpose_axes(1, 2), + rotate(0), // to reduce periodicity + transpose_axes(1, 2), + translate(0, 0, 6), + // transpose_axes(1, 2), + // rotate(1), + ]), + torus, alpha); + + // var end = new Date() + // var ms = $('ms') + // if (ms) { + // var msvalue = ms.value + ' ' + (end.getTime() - start.getTime()) + // if (msvalue.length > 25) msvalue = msvalue.substr(msvalue.length - 25) + // ms.value = msvalue + // } + } + + // function update() { + // if (!$('go').checked) return + // angle += 3.14159 / 30 + // cls($('canvas')) + // draw_torus($('canvas')) + // } + // function init(ev) { + // setInterval(update, 100) + // // this doesn't work: $('fill').addEventListener('change', update, true) + // // how do you do what I want to do there? + // cls($('canvas')) + // draw_torus($('canvas')) + // } + // window.addEventListener('load', init, true) + + return { + draw: draw, + } +} \ No newline at end of file diff --git a/www/printmanager/js/Viewer.js b/www/printmanager/js/Viewer.js index afc076b..7667366 100644 --- a/www/printmanager/js/Viewer.js +++ b/www/printmanager/js/Viewer.js @@ -1,176 +1,14 @@ var Viewer = function(viewer) { var className = "Viewer"; - var doodles = []; - - //Object houd data bij van svg transformaties - //(alle svg's worden automatisch hier in gezet, positie is relatief aan zijn html parent) - // x -> x positie - // y -> y positie - // scale -> scale - // svg -> svg object - var svgsData = []; - - console.log(className,viewer); + var items = []; function setDoodles(_doodles) { doodles = _doodles; - console.log(className,'items',doodles); - for (var i=0; i'); + var item = new ViewerItem(doodles[i]); + items.push(item); + var svg = item.getSvg(); viewer.append(svg); - - var box = path.getBoundingBox(); - var viewbox = box.getX() + " " + box.getY() + " " + box.getWidth() + " " + box.getHeight(); - svg[0].setAttribute("viewBox", viewbox); //changig the viewBox with jQuery doesn't work (may be because of capital B) - svg.attr('width',box.getWidth()+2); - svg.attr('height',box.getHeight()+2); - - initTouch(svg,doodle) - } - } - - function initTouch(svg,doodle) { - // $("svg").each(function () { - // var svg = $(this); - // var data = { - // x: 0, - // y: 0, - // scale: 1, - // }; - // svgsData.push(data); - - var startX; - var startY; - var touchX; - var touchY; - var offsetX = 0; - var offsetY = 0; - var handleGesture = false; - - var offsetZoom = 1; - var zoom = 1; - - var mouseDown = false; - - svg.on("mousedown", function (e) { - var event = e.originalEvent; - mouseDown = true; - - touchX = startX = event.pageX; - touchY = startY = event.pageY; - }); - - $(document).on("mousemove", function (e) { - if (mouseDown) { - var event = e.originalEvent; - - touchX = event.pageX; - touchY = event.pageY; - - var dX = touchX - startX; - var dY = touchY - startY; - - svg.css({ - left: offsetX + dX, - top: offsetY + dY - }); - } - }); - - svg.on("mouseup", function (e) { - var event = e.originalEvent; - mouseDown = false; - - offsetX = offsetX + touchX - startX; - offsetY = offsetY + touchY - startY; - - setData(); - }); - - svg.on("touchstart", function (e) { - var event = e.originalEvent; - event.preventDefault(); - - if (event.touches.length === 1) { - var touch = event.touches[0]; - - touchX = startX = touch.pageX; - touchY = startY = touch.pageY; - } - else { - handleGesture = true; - } - }); - - svg.on("touchmove", function (e) { - var event = e.originalEvent; - event.preventDefault(); - - if (event.touches.length === 1 && !handleGesture) { - var touch = event.touches[0]; - touchX = touch.pageX; - touchY = touch.pageY; - - var dX = touchX - startX; - var dY = touchY - startY; - - svg.css({ - left: offsetX + dX, - top: offsetY + dY - }); - } - }); - - svg.on("touchend", function (e) { - var event = e.originalEvent; - - if (event.touches.length === 0) { - if (handleGesture) { - handleGesture = false; - } - else { - offsetX = offsetX + touchX - startX; - offsetY = offsetY + touchY - startY; - - setData(); - } - } - }); - - svg.swipe({ - pinchStatus: function (event, phase, direction, distance , duration , fingerCount, pinchZoom) { - if (phase === "cancel" || phase === "end") { - offsetZoom = offsetZoom*zoom; - - setData(); - } - else { - zoom = pinchZoom; - - svg.css({transform: "scale(" + offsetZoom*zoom + ")"}); - } - }, - fingers: 2, - pinchThreshold: 0 - }); - - function setData () { - var offset = { - x: offsetX - svg.width()*offsetZoom/2 + svg.width()/2, - y: offsetY - svg.height()*offsetZoom/2 + svg.height()/2 - } - doodle.setScale(offsetZoom); - doodle.setOffset(offset); - // data.scale = offsetZoom; - // data.x = offsetX - svg.width()*offsetZoom/2 + svg.width()/2; - // data.y = offsetY - svg.height()*offsetZoom/2 + svg.height()/2; - // console.log(data); } } diff --git a/www/printmanager/js/ViewerItem.js b/www/printmanager/js/ViewerItem.js new file mode 100644 index 0000000..8ce7c49 --- /dev/null +++ b/www/printmanager/js/ViewerItem.js @@ -0,0 +1,136 @@ +var ViewerItem = function(doodle) { + + var path = doodle.getPath(); + var svgData = doodle.getSvgPathDescription(); + var box = path.getBoundingBox(); + var svg = $(''); + var viewbox = box.getX() + " " + box.getY() + " " + box.getWidth() + " " + box.getHeight(); + var xDown = 0, yDown = 0; + var xCur = 0, yCur = 0; + var dragging = false; + var prevDist = 0; + + svg[0].setAttribute("viewBox", viewbox); //changig the viewBox with jQuery doesn't work (may be because of capital B) + svg.attr('width',box.getWidth()+2); + svg.attr('height',box.getHeight()+2); + + updateView(); + + function updateView() { + var box = path.getBoundingBox(); + var scaledCenterX = box.getCenter().x * (1-doodle.getScale()); + var scaledCenterY = box.getCenter().y * (1-doodle.getScale()); + svg[0].setAttribute("stroke-width", 1/doodle.getScale()); + svg.css({ + transform: "scale(" + doodle.getScale() + ")", + left: doodle.getOffset().x - scaledCenterX + xCur - xDown, + top: doodle.getOffset().y - scaledCenterY + yCur - yDown + }); + } + + function getDoodle() { + return doodle; + } + + function getSvg() { + return svg; + } + + function startDrag(x,y) { + if (!dragging) { + dragging = true; + xDown = x; + yDown = y; + updateDrag(x,y); + } + } + + function updateDrag(x,y) { + xCur = x; + yCur = y; + updateView(); + } + + function stopDrag() { + if (dragging) { + dragging = false; + doodle.getOffset().x += xCur - xDown; + doodle.getOffset().y += yCur - yDown; + xCur = 0; + yCur = 0; + xDown = 0; + yDown = 0; + } + } + + function distance(x1,y1,x2,y2) { + return Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); + } + + function zoomBy(f) { + var newScale = doodle.getScale()+f; + var box = path.getBoundingBox(); + var anchorpoint = box.getCenter(); + if (newScale*box.getWidth()<100) return; + if (newScale*box.getHeight()<100) return; + doodle.setScale(newScale); + doodle.getOffset().x -= f*anchorpoint.x; + doodle.getOffset().y -= f*anchorpoint.y; + updateView(); + } + + svg.on("mousedown", function (e) { + startDrag(e.originalEvent.pageX,e.originalEvent.pageY); + }); + + $(document).on("mousemove", function (e) { + if (dragging) { + updateDrag(e.originalEvent.pageX,e.originalEvent.pageY); + } + }); + + svg.on("mouseup", function (e) { + stopDrag(); + }); + + $(document).on("mouseup", function (e) { + stopDrag(); + }); + + svg.on("touchstart", function (e) { + var event = e.originalEvent; + event.preventDefault(); + var touch = event.touches[0]; + startDrag(touch.pageX,touch.pageY); //drag + if (event.touches.length === 2) { //zoom + var touch2 = event.touches[1]; + prevDist = distance(touch.pageX,touch.pageY,touch2.pageX,touch2.pageY); + } + }); + + svg.on("touchmove", function (e) { + var event = e.originalEvent; + event.preventDefault(); + if (dragging) { + var touch = event.touches[0]; + updateDrag(touch.pageX,touch.pageY); + if (event.touches.length === 2) { + var touch2 = event.touches[1]; + var dist = distance(touch.pageX,touch.pageY,touch2.pageX,touch2.pageY); + var scaler = (dist-prevDist) / 100; //100 is an arbitrary scaler + zoomBy(scaler); + prevDist = dist; + } + } + }); + + svg.on("touchend", function (e) { + var event = e.originalEvent; + stopDrag(); + }); + + return { + getDoodle: getDoodle, + getSvg: getSvg, + } +} \ No newline at end of file diff --git a/www/printmanager/js/main.js b/www/printmanager/js/main.js index 1cdf06a..016c86a 100644 --- a/www/printmanager/js/main.js +++ b/www/printmanager/js/main.js @@ -18,8 +18,11 @@ var app = function() { var sketchAPI = new SketchAPI(); var d2g = new Doodle2gcode(); var viewer = new Viewer($("#svgContainer")); + //var printPreview = new PrintPreview($("#printPreview")); var doodles = []; + API.setURL('http://10.0.0.212/d3dapi/'); + init(); function init() { @@ -27,7 +30,8 @@ var app = function() { $("#btnRefresh").click(refresh); $("#btnPrint").click(onBtnPrint); $("#btnStop").click(onBtnStop); - $("#btnPrepare").click(onBtnPrepare); + $("#btnDownload").click(onBtnDownload); + $("#btnExtrude").click(onBtnExtrude); if (getURLParameter("ids") != "null") { ids = getURLParameter("ids").split(","); @@ -35,30 +39,26 @@ var app = function() { updateStatus(); - // var statusInterval = setInterval(updateStatus,1000); - - // if (ids) { - // loadSketch(ids, function() { - // console.log('done'); - // updateStatusMessage(''); - // updateButtonStates(); - // // makeItemsDraggable(); - // // onBtnPrepare(); //tmp - // }); - // } else { - - doodles.push(new Doodle('M337.59375,418.125 l-5,8 -6,1 -5,-2 -6,-5 -6,-4 -7,-3 -3,-5 -4,-5 -4,-4 -4,-4 -4,-4 -6,-7 -4,-5 -3,-5 -4,-5 -4,-5 -5,-6 -4,-6 -6,-7 -3,-5 -4,-5 -3,-6 -4,-7 -4,-6 -4,-6 -3,-9 -4,-7 -1,-7 -3,-8 -1,-7 -1,-5 0,-9 -1,-7 0,-8 0,-6 1,-8 1,-6 2,-6 3,-6 5,-3 4,-4 4,-4 7,-3 6,-5 5,-2 7,-2 5,-1 6,0 9,0 5,2 6,2 5,3 5,3 5,3 6,4 5,5 4,5 5,6 4,8 4,5 3,5 3,5 4,5 4,4 -1,-7 -3,-5 0,-6 -1,-5 0,-7 -1,-5 0,-8 0,-7 2,-7 3,-5 4,-6 4,-5 4,-5 4,-4 5,-2 5,-3 5,-2 5,-2 5,-1 6,0 7,0 6,0 7,2 5,3 6,5 5,5 4,5 3,5 3,5 2,7 0,6 0,9 0,11 -1,11 0,12 -1,6 -3,9 -1,6 -1,5 -3,9 -2,7 -4,8 -2,6 -4,9 -3,6 -2,5 -3,9 -5,8 -2,5 -4,8 -5,7 -2,5 -5,7 -2,5 -5,7 -4,6 -5,4 -4,5 -5,6 -4,4 -3,5 -3,5 -5,2 -5,2 -5,1 -5,3 -5,2 m11,-9 l-1,-6 0,-7 -2,-7 -3,-6 -2,-6 -2,-6 -2,-7 -5,-3 -5,-4 -5,-4 -5,-7 -4,-4 -4,-5 -5,-6 -4,-5 -3,-5 -3,-6 -4,-5 -3,-5 -4,-7 -3,-6 -2,-6 -2,-6 -2,-6 -2,-5 -2,-6 -1,-5 -1,-6 0,-6 1,-5 4,-5 5,-3 6,-1 6,0 7,0 5,1 6,4 5,4 6,3 5,4 4,4 5,5 4,4 4,5 4,4 5,4 5,5 6,4 6,0 4,-4 3,-6 3,-5 2,-6 2,-5 2,-6 2,-5 2,-6 1,-6 2,-5 3,-6 3,-5 3,-5 4,-5 4,-4 5,-2 5,-1 6,0 3,6 2,5 0,6 -1,6 -2,6 -2,7 -2,5 -2,5 -3,6 -3,7 -2,5 -4,7 -3,8 -3,6 -2,6 -2,7 -3,5 -2,6 -1,5 -3,5 -1,7 -3,6 -2,5 -3,5 -2,6 -2,5 -3,5 -1,5 -3,6 -1,6 -3,6 -1,5 -2,5 -3,5 m0,7 1,-11 l0,5 0,7 0,6 m-62,-142 l2,6 0,6 4,4 5,6 3,5 4,6 4,4 5,6 5,5 5,4 4,4 3,5 5,5 5,4 6,2 6,-1 3,-5 3,-6 3,-5 3,-6 2,-6 3,-6 2,-7 3,-5 3,-5 4,-7 3,-5 m-35,58 l0,2 0,7 0,8 0,7 0,9 -1,6 -1,5 0,8 0,6 0,6 2,5 m38,-129 l3,-1 1,-5 2,-6 1,-6 0,-6 1,-5 0,-6 m-53,-11 l-5,-7 -1,-7 -3,-6 -3,-5 -3,-5 -3,-5 -4,-4 -6,-3 -5,-3 -6,-3 -6,-1 -5,-1 -7,-1 -6,-2 -5,-2 -5,-4 -5,-4 -2,-5 -1,-6 -1,-5 0,-8 1,-7 3,-7 5,-6 4,-4 4,-4 5,-3 6,-3 5,-2 5,-2 5,-2 6,-1 6,0 4,4 3,5 3,5 4,-6 2,-7 2,-5 2,-5 4,-5 5,-2 5,-1 7,0 6,1 4,4 1,7 0,7 0,6 -3,7 -3,6 -5,6 -2,5 -3,5 -3,6 -2,5 -2,5 -2,6 -1,7 -1,5 -1,6 0,6 -1,6 -1,5 0,6 m92,56 l4,-1 2,-5 3,-5 2,-5 4,-5 5,-3 4,-4 5,-4 6,-3 5,-4 6,-4 6,-3 5,-2 6,-1 5,-1 7,0 7,1 6,3 4,4 4,5 2,6 2,6 0,7 0,7 -1,5 -3,5 -4,4 -6,5 -7,3 -6,4 -7,3 -7,2 -8,3 -7,3 -7,3 -7,2 -5,3 -6,1 -6,1 -7,3 -5,2 -6,2 -5,3 m-208,-37 l-5,-4 -2,-5 -3,-5 -5,-5 -5,-3 -5,-3 -5,-3 -6,-2 -5,-2 -5,-1 -6,0 -7,0 -8,0 -6,3 -5,4 -4,6 -3,6 -2,6 -1,7 0,7 0,7 3,6 3,6 5,5 4,4 4,5 6,4 6,4 8,3 8,4 5,1 8,1 8,1 5,1 7,0 7,1 7,0 7,0 6,-1 5,-1 1,-7 0,-6 m-28,-50 l3,2 6,0 m216,2 l3,-3 6,-5 6,-4 6,-2 5,-3 6,-2 7,-3 6,-1 6,0 4,5 -4,4 -4,4 -6,5 -6,4 -5,4 -5,2 -8,3 -6,4 -8,1 m-6,4 l2,1 5,-1 m-4,-1 l7,-4 6,-4 m-227,16 l-3,-5 -6,-1 -5,-3 -6,-6 -6,-7 -3,-5 -4,-4 -5,-4 -5,-2 -5,-1 -7,0 -6,0 -5,2 -6,3 -5,4 -3,5 0,7 2,5 3,5 5,5 5,3 7,5 6,2 7,2 7,0 7,1 6,0 7,1 6,1 8,0 5,2 5,1 m256,207 l-1,-1 m-261,-203 -43,-32 l1,-1 0,-6 m286,-15 -5,-1 l2,0 -5,1',{height:10,twist:.2})); - // doodles.push(new Doodle('M205,246 l0,-5 -5,2 -7,0 -5,1 -5,3 -5,4 -5,1 -6,4 -3,6 -1,5 -4,7 -3,5 -4,5 -1,5 0,7 -1,5 0,6 0,7 1,6 3,5 3,5 4,5 4,5 4,4 4,5 4,5 6,4 5,4 5,3 5,3 5,1 5,3 6,3 7,2 5,1 6,1 7,0 6,0 6,-1 6,-1 5,-3 5,-2 5,-4 5,-4 6,-5 4,-5 4,-5 4,-6 3,-5 5,-5 3,-5 4,-4 0,-6 1,-6 0,-7 0,-6 0,-6 -1,-6 -3,-5 -2,-5 -5,-4 -5,-3 -5,-3 -5,-3 -5,-3 -4,-4 -5,-4 -5,-5 -5,-5 -5,-2 -5,-3 -5,-1 -6,-2 -6,-2 -6,-1 -5,-1 -5,-1 -6,0 -7,0 -5,2 -6,2 -7,6 -5,4 m49,-24 l-5,6 0,-6 0,-8 1,-5 1,-6 3,-7 2,-6 1,-7 1,-6 2,-5 4,-6 3,-6 5,-3 6,-1 5,2 1,6 0,6 2,-5 6,-4 5,-1 5,5 0,6 -2,5 -5,2 5,2 5,1 2,5 0,6 -4,5 -5,3 -5,1 -7,0 -6,3 -2,5 -2,5 -2,5 0,6 -2,5 -1,5 -1,5 m-27,-15 l2,2 5,1 5,2 6,4 7,1 m-24,-5 l9,-1 5,1 7,0 6,0 m-21,-3 l3,1 7,3 6,3 m-19,-22 l6,3 5,1 7,3 8,2 m-23,-8 l4,3 5,3 6,2 8,2 m-20,-4 l2,1 6,0 8,3 5,2 m-24,-29 l3,2 7,1 5,2 5,1 6,2 m-21,-4 l4,1 5,3 5,3 5,3 m-26,-7 l7,2 5,2 6,2 m-14,-6 l3,2 6,0 8,2 5,1 m-20,-8 l10,3 m39,64 l-1,-2 0,-9 1,-7 2,-7 2,-5 3,-7 3,-7 3,-7 2,-5 0,-6 0,-7 -1,-6 0,-6 0,-7 0,-6 0,-6 0,-6 0,-6 0,-6 -4,-5 -3,-7 -3,-5 -1,-5 -2,-5 -3,-6 -2,-6 -2,-7 -1,-5 -2,-5 0,-7 -1,-5 -1,-6 0,-6 0,-6 3,-6 4,-5 3,-5 4,-4 5,-2 7,0 6,1 6,3 3,5 3,5 2,5 4,6 2,6 1,5 1,5 0,7 1,5 0,6 0,6 0,6 1,6 0,6 0,6 0,6 0,6 0,8 -1,6 0,7 0,7 -1,5 -1,6 -2,5 0,6 -1,5 -1,6 -1,5 -1,5 0,6 0,7 -2,6 0,6 -2,5 -2,6 -1,7 -2,5 -2,6 -5,3 -4,4 m-21,-28 l3,2 6,4 5,2 6,1 7,1 m-17,-12 l8,7 6,3 m-16,-5 l4,7 8,6 6,4 6,1 m-21,-11 l12,5 m-15,-31 l3,4 5,2 6,3 8,2 m-14,-5 l4,3 8,5 7,4 m-17,-8 l6,3 7,1 6,0 m-26,-10 l8,3 6,2 7,3 8,2 m-30,-9 l3,4 10,5 6,0 m-22,9 l6,1 7,5 8,3 7,3 m-24,-16 l9,8 10,2 5,2 m-24,-18 8,-17 l1,0 8,0 7,0 m-22,-6 l1,0 6,0 9,0 6,-1 6,-1 m-20,-2 l4,1 8,0 6,0 9,0 6,0 m-36,-2 l4,4 8,1 5,1 7,1 7,0 m-34,5 l11,-2 10,0 7,0 m-23,-6 l2,0 6,0 7,0 m-12,3 l3,-2 6,0 6,0 m-13,3 13,-35 l-3,3 -5,1 5,1 7,0 m-21,8 l2,0 6,0 7,0 5,-1 m-15,1 -1,-5 l4,-2 6,0 9,0 9,0 m-33,-1 l4,3 6,0 7,0 7,1 m-24,1 l7,0 8,0 7,0 m-17,6 l3,-1 7,0 m-12,-5 l3,2 9,0 m-16,-8 l3,0 9,0 m-6,-21 l3,0 7,0 m-9,2 l3,1 6,0 m-12,2 -5,5 l3,-2 6,0 5,-2 m23,-8 -6,8 l-2,-2 1,-6 1,7 -1,5 m-15,-8 l2,3 6,0 m-23,-3 l2,2 9,0 10,0 7,-2 m-31,4 l3,0 7,0 9,0 m-16,4 l2,0 9,0 6,-1 9,-2 m-19,-7 l2,0 8,0 m-5,0 l11,-1 7,0 m-20,6 l2,-3 9,0 m-10,0 l1,-1 10,0 m-20,-20 l4,0 6,0 6,0 m-16,3 l3,3 8,0 9,0 6,-2 m-26,11 l2,-3 5,-2 6,0 9,-2 m-20,-4 l8,-1 8,0 8,0 7,0 m-31,-3 l4,0 7,0 8,0 8,0 m-26,1 l5,1 11,0 m-22,8 l7,-1 6,0 5,-1 8,-1 m-15,-1 l20,-2 m-32,-18 l4,0 8,0 6,-1 7,0 m-28,-1 l14,-3 11,-1 7,-2 6,-2 m-29,2 l4,-2 8,0 10,0 8,0 m-36,7 l7,1 7,0 5,-1 5,-1 5,-1 6,0 m-30,2 l9,0 9,0 9,0 m-15,1 -32,-4 l4,1 10,0 10,0 5,-1 5,-1 m-16,-1 l7,-2 7,0 6,0 m-27,6 l5,-1 9,0 6,0 m-17,-3 l3,-2 7,-1 5,-1 7,-2 m-20,2 l1,2 7,0 6,0 11,0 m-32,-1 l4,1 7,0 9,0 m-16,1 l4,1 7,1 5,1 7,0 m-10,-12 l1,3 7,0 9,0 m-14,7 l2,2 7,0 m-37,-22 l5,2 10,-1 6,-1 6,-2 5,-3 5,-2 m-35,5 l3,1 11,0 6,0 6,0 9,0 m-33,8 l4,-2 11,0 7,0 7,0 m-25,3 l5,-2 6,0 6,-1 7,0 13,0 7,-1 m-30,0 l12,-4 m-21,-10 l2,5 8,1 9,0 6,2 m-5,0 l11,-1 m-15,6 l2,0 7,-1 5,-2 m-15,-1 -27,-1 l2,5 11,0 9,0 7,0 m-22,1 l5,-1 8,0 8,-3 m-29,-14 l3,2 5,3 5,1 4,-5 5,4 5,2 3,-5 1,-5 5,1 5,5 4,-5 2,-5 m-54,2 l3,1 7,1 m-23,68 2,-10 6,7 -4,5 l-2,-4 m1,-7 l3,0 5,-3 -2,6 0,7 m15,3 l-6,1 5,-3 m-19,-7 l0,1 m0,1 l2,-6 m18,7 -1,9 l0,-1 5,-5 m-7,0 l2,-4 m-6,-2 4,0 l7,4 m0,24 0,1 l-3,-1 m5,8 l-1,-4 5,-1 5,-1 m-16,12 l3,-2 6,-3 m-6,8 l1,-3 6,-3 4,-4 m11,155 l0,1 5,1 5,3 4,5 5,4 5,2 6,2 5,2 6,1 m-1,10 l3,-5 0,-6 0,-8 1,-5 3,-6 1,-5 2,-5 1,-5 0,-6 -1,-6 -6,-3 -6,1 -4,7 -1,5 -1,5 m-1,-2 l-5,-5 -7,-1 -7,-2 -7,-3 -5,-1 -5,-2 m-5,27 l2,0 8,2 6,3 m-50,27 l-2,2 0,6 0,6 1,5 1,5 4,6 4,6 4,4 -1,6 -1,5 0,7 5,3 6,-2 2,-8 1,-5 0,-6 0,-6 0,-6 m8,-3 l-4,-2 -7,-1 -6,-5 -5,-5 -2,-5 -3,-5 0,-6 m26,21 l-3,5 0,10 0,6 -1,7 m-17,-48 l-3,0 -6,0 -1,-5 -5,-4 -5,-2 -5,-3 -3,-5 0,-6 0,-7 1,-5 5,-5 5,-3 5,-1 6,0 6,2 5,3 5,3 6,3 m-11,-8 l2,3 6,6 6,5 m-121,10 l3,0 -5,4 5,-4 5,-2 4,-4 5,-3 5,-3 5,-3 m-13,6 l4,-1 5,-2 6,-4 5,-3 4,-5 5,-3 5,-4 5,-3 4,-5 4,-5 5,-4 5,-4 5,-4 3,-6 1,-6 2,-5 4,-5 m-7,13 l3,4 5,1 5,2 4,4 5,4 m-36,1 l-1,0 m312,268 l1,0 m2,0 -317,-260 6,-5 l2,-4 6,0 6,0 5,2 m287,265 l-1,0 m3,-1 -303,-252 -3,-9 l3,-3 6,0 6,0 6,1 5,2 5,1 m-4,-7 l4,13 m-75,14 l4,2 1,5 4,4 5,5 4,4 m-9,-20 l4,4 3,6 6,7 m-10,5 l2,-2 5,1 7,1 m-8,-12 l3,3 m-19,-117 l2,4 0,7 -1,5 -1,5 -2,5 -3,5 -3,5 -2,5 -4,4 -2,5 -2,5 -3,5 -2,5 -3,5 -4,5 -4,4 -7,3 -6,1 m28,-18 6,-39 3,12 l7,-5 6,-2 6,-1 5,1 5,1 0,6 -2,6 -5,4 -5,2 -6,2 -7,0 -4,-4 -2,-6 m-7,12 l3,-4 5,1 5,4 m-4,2 l8,-6 5,-1 6,0 -7,1 -6,-1 5,-4 -5,-1 6,0 -5,-3 m-19,12 l3,-2 9,0 8,0 6,1 m-17,2 l-3,-3 9,-2 10,-1 m10,14 l-5,-5 -5,-3 -4,-5 -5,-2 -6,-3 -7,0 m6,5 l4,-2 3,-5 5,-1 0,6 m-20,-1 l4,3 6,0 m-3,-3 l8,-1 5,1 m-11,0 l2,-2 6,0 m5,5 -40,29 l-1,1 0,6 0,6 2,5 5,2 5,2 5,2 6,0 5,-3 5,-6 4,-6 1,-5 -1,-6 -5,-5 -5,-3 -5,-4 -5,-1 m13,12 l-4,3 0,7 -4,-5 m7,-1 l0,2 6,-1 2,-5 -7,-2 -5,2 -2,6 5,3 6,1 2,-7 -1,-5 -5,-4 -5,5 0,6 2,5 4,-6 m-7,4 l0,2 6,0 5,-4 -3,-5 -4,4 m-2,-17 l-3,2 -3,8 -2,6 0,6 1,8 7,2 6,3 m-3,-59 l5,-3 6,0 6,0 5,2 2,7 1,5 m-28,14 l0,2 -2,6 -3,7 0,8 0,8 m3,-36 l-3,7 0,8 5,7 5,3 5,2 m-19,-14 l-3,4 2,7 4,5 5,5 6,2 m-19,-29 l1,7 4,6 4,4 m7,-22 l-4,3 -1,5 -1,9 -1,8 0,6 3,8 m10,-72 l1,1 5,1 7,2 5,5 2,7 m-22,-5 l3,1 6,0 9,0 8,0 2,7 m-21,-15 l0,1 8,0 4,6 1,5 m-11,-12 l2,0 9,3 m-61,19 l3,-4 7,-4 6,-5 5,-6 1,-5 0,-7 -6,2 -5,4 -5,6 -3,7 -1,7 1,5 8,-5 6,-9 4,-5 5,-7 2,-5 -4,7 -3,5 -4,5 -4,4 -5,5 5,-2 4,-6 4,-6 4,-5 1,-5 4,-5 -7,7 -5,6 -5,6 -6,6 4,-5 7,-8 5,-5 7,-6 5,-5 -8,3 -8,6 -4,4 -4,4 7,-4 7,-9 -5,3 -8,7 -6,5 -5,5 8,-2 6,-4 5,-4 5,-5 7,-4 -3,7 -5,5 -5,6 -7,5 3,-10 m7,-6 l-1,-3 7,-6 m110,18 l-3,3 0,7 0,7 m-3,6 l0,2 5,-3 5,-4 5,-3 3,-5 m-18,5 l-1,-3 6,-5 7,0 -2,6 1,-5 -3,5 m293,292 l0,-1 m-280,-289 l0,-2 -5,4 -3,5 -3,5 m6,-26 -11,16 -4,3 l1,-5 -4,6 0,-6 5,-4 m-3,-4 l8,3 -1,7 -5,5 3,-5 5,-5 5,-3 -5,3 m19,17 l-4,-1 -7,0 -6,1 -5,2 3,-7 4,-5 2,-5 m3,3 l4,5 -5,4 -7,1 m4,-9 l1,-1 7,-3 5,-2 -5,1 m4,26 l-3,-2 -7,1 -6,1 -5,1 5,2 6,1 m-2,3 l10,3 5,-4 6,-3 m-16,-7 l1,-3 -7,0 m-2,10 l8,-1 7,-1 m-24,18 l4,0 8,0 5,-4 3,-5 -5,-1 3,-7 4,-4 m-13,4 l6,-1 4,-4 m-7,0 -92,80 l2,-4 3,-6 1,-5 3,-6 m9,24 l0,-5 -1,-6 -5,-5 -5,-4 m2,12 l3,0 4,4 -3,-5 -4,-5 4,4 2,-5 0,9 m11,9 l-3,-3 1,-5 4,-6 2,-5 m9,17 l0,-4 -5,-6 -4,-5 -1,-6 m-2,17 l2,-1 1,-5 m13,11 l-4,-6 0,-6 0,-6 m18,16 l-3,-4 -5,-5 -5,-4 -5,-5 m3,9 l-1,0 3,5 2,-5 m-6,-11 l0,2 m1,8 l3,2 6,1 m-70,-212 l-6,5 -3,5 0,6 0,6 0,6 0,7 1,8 1,5 1,6 1,7 5,7 m-7,-63 l2,-4 8,0 6,2 2,5 3,5 1,5 2,6 1,6 1,6 0,8 1,6 1,6 3,5 2,6 m-38,-2 l3,2 4,5 5,5 m-19,-49 l7,-2 7,0 7,-1 6,-4 4,-4 m-10,-6 l-2,3 4,-6 4,-6 3,-5 -6,7 -6,8 -4,6 3,-8 2,-5 5,-3 -1,10 -4,8 7,-5 6,-7 -2,5 -3,5 -3,6 m-10,-9 l2,2 5,5 m2,-1 2,-4 l-1,11 0,8 2,8 1,5 3,7 4,4 m-49,72 l-2,-4 -4,-6 -5,-1 -5,-1 -8,0 -5,1 -5,1 -5,5 -5,3 -4,5 -3,5 -1,5 0,6 3,5 5,1 6,0 6,-2 6,-3 6,-1 6,-2 8,-3 6,0 7,1 m-41,-22 l-2,0 -3,6 4,8 1,8 -2,5 -6,-6 -2,-7 -1,-5 0,9 1,5 1,8 0,-8 -3,-6 2,7 6,8 7,5 m323,246 l-1,-1 m-337,-251 -13,-8 5,3 l2,-1 6,1 3,-5 -5,-2 -5,7 -1,6 m-9,-11 15,0 3,-1 l-1,3 5,-1 -7,-2 m6,6 l1,-2 -3,6 3,-5 -5,1 m-23,0 l9,0 5,-2 14,-6 10,-4 m-14,2 l0,2 6,0 5,-4 5,-2 5,-1 6,0 7,-1 m-9,7 l4,-5 6,0 6,0 7,0 m2,35 l0,2 0,6 -1,5 -4,5 -1,5 0,6 -2,6 -2,5 0,6 0,6 0,7 0,8 0,6 2,5 1,6 1,5 2,6 5,3 5,3 5,-2 2,-8 1,-9 1,-6 m-3,0 l2,5 0,6 1,6 3,5 4,4 5,-3 1,-5 0,-7 0,-6 1,-5 2,5 2,6 5,4 6,1 5,-4 0,-7 -5,-3 -4,-4 -5,-4 -1,-5 -5,-6 -2,-7 -2,-5 -1,-5 -2,-5 -2,-6 0,-6 0,-6 m-33,-5 l8,-1 8,1 7,0 m-17,4 l3,-1 6,0 7,0 6,0 7,-2 m-19,0 l4,-4 7,-1 6,-2 m-15,3 l6,-1 7,0 7,-1 m-29,21 l5,0 9,-1 9,-2 6,-4 m-36,10 l6,-1 6,0 7,0 8,-5 m-16,5 l5,-4 7,-1 8,-2 m-20,1 l9,-3 6,0 m-22,24 l2,0 9,0 7,-2 9,-3 4,-4 m-34,9 l10,-7 5,-1 8,-1 5,-1 8,0 6,-2 m-41,20 l4,-4 9,0 8,0 8,-1 m-28,-3 l3,-1 5,-2 10,-4 6,-3 5,-1 m-19,11 l5,-4 8,-2 6,-3 5,-1 m-21,5 -10,59 l10,4 m5,-14 l-1,4 0,6 0,6 m-14,-15 l4,4 2,5 5,2 m17,-6 l-8,4 5,2 4,4 m5,-19 l-4,10 0,7 4,5 m15,-14 l1,0 4,5 m-10,-11 l7,4 5,1 3,-5 0,-7 -2,-5 m-8,-1 l5,9 2,5 m60,-285')); - // doodles.push(new Doodle('M262.59375,97.125 l0,1 -2,6 -2,5 -4,5 -2,5 -2,5 -2,5 0,6 0,6 0,6 0,6 0,6 0,6 3,5 3,5 2,5 4,4 5,3 5,2 5,2 m-17,-89 -1,0 l0,0 5,-1 5,-1 5,-1 5,-1 5,-1 m3,-2 l2,-1 m-25,0 l1,0 m2,-2 3,-2 l0,0 m0,-1 l5,-1 m8,101 l-4,0 -6,0 -5,1 -4,5 -2,5 -2,5 m-1,3 l-1,2 0,6 0,6 0,6 1,5 4,4 5,2 5,1 5,1 m241,-16 -231,-137 l1,3 0,6 0,6 0,6 -1,5 0,6 -2,6 0,8 0,6 -1,5 0,7 0,6 0,6 -1,5 -1,5 -1,5 -1,5 -1,6 m7,-1 l1,5 0,6 -1,5 -2,5 -2,5 0,6 -1,5 -2,5 -1,5 m8,-13 l-2,3 -1,5 -1,5 -1,5 -2,5 -1,5 m9,-156 l3,-2 5,1 5,1 6,0 6,0 4,4 0,6 0,6 -2,5 -2,5 0,6 -1,5 0,6 0,6 0,6 0,6 0,6 0,6 0,6 0,6 0,6 -1,6 0,6 0,6 -2,5 -1,5 -1,6 -1,5 -2,5 -1,5 -1,6 -1,5 m17,-150 l0,-1 4,-4 5,-1 6,0 6,0 6,0 6,-1 5,-1 4,4 0,6 0,6 0,6 0,6 -1,5 -5,1 -6,0 -6,0 -6,0 -6,0 -6,4 -6,0 m20,-11 l-4,0 -2,6 -5,-2 m33,1 l-7,5 -5,1 -6,0 -6,0 -7,0 -5,1 -5,2 -6,0 m35,-27 l-1,0 -6,0 -5,1 -6,0 m-1,0 l-4,1 m25,2 l-4,1 -6,0 -6,0 m-1,0 l-5,0 -6,0 5,-1 6,0 6,0 6,0 6,0 6,0 5,1 m67,363 -262,-340 l-3,1 -6,0 -4,4 -4,4 -6,0 -3,6 -1,5 0,6 0,6 0,6 1,5 1,5 0,6 0,6 2,5 4,4 4,4 3,5 m1,-14 l1,6 0,6 0,6 m-3,-20 l0,1 -2,5 0,6 1,5 -1,5 -5,4 -2,5 -1,5 0,6 0,6 0,6 3,5 5,4 m229,-25 -211,-99 l-1,3 0,6 0,6 -1,6 0,6 -2,5 -1,5 0,6 -1,5 0,6 0,6 0,6 0,6 -1,6 -3,5 -3,6 -1,5 -1,5 -2,5 -1,5 0,6 0,6 0,6 -1,5 m26,-137 l3,4 5,1 5,3 m-15,-8 l1,2 5,2 5,1 m4,-1 l1,2 -1,8 0,6 -1,7 -2,5 -1,5 -1,6 -1,5 -2,6 0,6 0,7 -1,6 0,6 0,6 0,6 0,6 0,6 0,6 0,6 0,6 2,5 1,5 -1,5 -6,0 -5,1 -5,1 m-77,4 -17,5 l3,3 6,0 6,-1 5,-2 6,0 6,0 7,1 5,2 6,0 6,0 6,0 6,0 6,0 4,-4 6,0 5,-1 5,-1 6,0 6,0 6,0 6,-1 6,0 5,-2 7,0 5,-2 5,-1 5,-1 6,0 5,-1 6,0 6,0 5,-2 5,-1 6,0 5,-2 5,-1 6,0 6,0 6,0 6,0 6,0 6,0 6,0 6,0 5,1 6,0 6,0 6,0 6,0 5,1 6,0 6,0 6,0 5,1 7,0 6,0 6,0 6,0 6,0 6,0 6,0 7,0 6,0 6,0 7,0 5,-1 6,0 7,0 6,0 5,-1 6,0 6,0 6,0 8,0 6,0 5,-3 7,0 5,-2 6,-3 5,-1 7,-1 5,-1 6,-1 5,-2 6,0 m-34,48 l1,0 m-104,-139 l-2,3 -2,5 -4,5 -4,4 -4,5 -4,5 -5,3 -5,4 -4,4 -4,4 -4,4 -2,5 -4,4 -4,4 -4,4 -4,5 -4,5 -3,5 -5,4 -4,6 -3,5 -4,5 m83,-100 l2,3 2,5 0,6 0,6 0,6 -1,6 -1,6 0,6 -1,5 0,6 -2,5 -2,5 -1,5 -1,5 -1,5 -1,5 0,6 -1,5 m46,-63 l1,3 -1,5 -1,6 0,6 0,6 -1,5 -1,5 4,4 6,0 6,0 5,-1 5,-2 5,-2 3,-5 0,-7 0,-6 -1,-5 -1,-5 -5,-3 -5,-1 -6,0 m12,-8 l-1,2 -5,1 -6,0 -5,1 m8,3 l1,0 0,6 0,6 0,6 0,6 -1,5 m-9,-18 l-2,3 5,2 5,2 6,0 6,0 6,0 6,-1 m-277,-18 1,0 l0,0 m1,5 l0,0 m4,0 l1,-1 m0,-5 l-1,0 -5,-3 -1,-5 -4,-4 -5,2 -4,4 -2,5 -5,2 -5,1 0,6 5,3 6,0 5,2 6,0 6,0 m4,-10 l2,-1 6,-1 6,0 -2,5 -5,3 -6,0 m199,68 l-1,0 m-215,-69 l-5,2 -3,5 0,6 5,3 6,0 5,-3 3,-5 m0,-1 l0,-5 -4,-4 m11,-5 l-4,0 m-1,0 l-5,0 -5,3 m-7,25 l4,2 -5,3 -1,5 0,6 4,5 6,-1 3,-5 4,-5 0,-6 m235,46 -278,-43 l4,4 6,0 5,-1 6,0 6,0 m21,-10 l2,1 6,1 6,-2 5,-2 m-14,-26 0,0 -3,34 l-2,0 -5,3 -2,7 -2,5 5,2 5,4 4,4 3,5 4,4 m-31,-12 l0,3 -2,5 -5,4 -4,4 1,-6 2,-5 4,-4 4,-5 5,-4 m224,-119 l1,3 -3,5 -4,4 -4,4 -1,5 0,7 0,6 0,6 m5,-29 l0,-3 5,1 6,0 5,-1 2,5 0,6 0,6 -1,5 -1,6 m14,-33 0,0 l0,0 m-1,-1 l-4,0 -3,5 -2,5 5,2 6,0 3,-5 m229,82 -229,-85 l0,2 1,5 5,4 m1,-21 l1,2 5,3 7,0 m115,99 1,1 -131,-105 l-3,0 6,-2 m-3,21 l5,-2 m275,316 -290,-317 l1,5 2,5 -1,6 m-5,-31 l-1,1 -4,-4 -4,-4 m32,1 l-2,3 -4,4 -5,3 m4,-6 l-1,1 -4,4 -5,1 m-22,35 l-3,1 m-13,6 l2,2 5,1 6,0 6,0 6,0 6,0 5,1 6,0 6,0 5,2 5,2 5,1 5,1 5,1 5,1 5,1 5,1 6,0 6,0 6,0 5,-1 0,-7 0,-6 0,-6 m4,5 l-2,-4 0,-6 -3,-5 -4,-4 -6,0 -6,0 0,-6 -1,-5 -6,0 -5,1 -5,3 -5,2 -5,3 -5,1 -2,6 -1,6 0,6 0,6 m53,11 l-2,0 1,5 0,6 0,6 0,6 0,6 0,6 0,6 2,6 0,6 0,7 0,6 -1,5 -5,2 m-50,-84 l-3,3 0,6 0,6 m7,-15 l0,-4 1,5 0,6 0,7 -1,6 -3,-5 -1,-5 m53,64 3,-5 l1,1 -1,7 0,7 m8,9 l0,2 -1,6 -1,5 -2,6 -2,5 -3,5 -4,5 -2,6 -3,5 -3,5 -1,6 -1,7 -1,6 -2,5 -2,5 -4,6 -2,5 -3,6 -2,5 -3,6 -3,5 -5,5 -3,5 -4,5 -2,5 -4,4 -3,5 -3,5 -3,5 -5,3 -5,3 -6,2 -5,1 -6,0 -6,0 -5,1 -7,0 -6,0 -6,1 -5,2 -5,2 -5,1 -5,1 -5,1 -6,1 -6,0 -7,0 -6,0 -6,1 -6,0 -7,0 -6,0 -6,0 -7,0 -6,0 -7,0 -7,0 -6,0 m-7,0 l0,0 -7,0 -7,0 -8,-1 -6,-1 -5,-2 -5,-2 -6,-3 -6,-2 -5,-3 -5,-4 m-2,-1 l-4,-2 -4,-4 -4,-4 -5,-3 -5,-5 -5,-4 -5,-7 -6,-6 -3,-5 -3,-5 -3,-5 -4,-6 -3,-5 -3,-6 -4,-4 -3,-5 -1,-5 -4,-6 -4,-6 -2,-5 -2,-5 -2,-5 -2,-5 -3,-5 -2,-5 -4,-4 m-5,-19 0,0 0,-1 l0,0 5,-5 1,5 1,5 0,6 m20,-11 l0,5 m11,-10 l-1,1 -4,5 -1,5 -1,5 -1,5 -4,4 m125,-40 l-2,-1 2,5 m3,2 3,-5 l0,4 0,6 0,6 m46,-11 l-1,3 -2,5 m81,-16 l0,3 0,6 0,7 0,6 m-18,-19 l3,0 7,0 5,1 0,6 -1,5 -1,6 -1,5 m-70,-24 l1,1 2,5 0,6 -5,4 -3,5')); - doodles.push(new Doodle('M317,155.5 l-69.28203230275511,119.99999999999994 138.56406460551017,1.1368683772161603e-13 -69.28203230275506,-120.00000000000006',{height:100,twist:5})); - doodles.push(new Doodle('M317,155.5 l-47.02282018339781,15.278640450004218 -29.06170112021448,39.99999999999997 0,49.44271909999159 29.061701120214423,40 47.02282018339787,15.278640450004218 47.02282018339781,-15.278640450004218 29.06170112021448,-39.99999999999994 0,-49.44271909999162 -29.061701120214423,-40 -47.02282018339787,-15.278640450004218',{height:50,twist:5})); + // doodles.push(new Doodle('M337.59375,418.125 l-5,8 -6,1 -5,-2 -6,-5 -6,-4 -7,-3 -3,-5 -4,-5 -4,-4 -4,-4 -4,-4 -6,-7 -4,-5 -3,-5 -4,-5 -4,-5 -5,-6 -4,-6 -6,-7 -3,-5 -4,-5 -3,-6 -4,-7 -4,-6 -4,-6 -3,-9 -4,-7 -1,-7 -3,-8 -1,-7 -1,-5 0,-9 -1,-7 0,-8 0,-6 1,-8 1,-6 2,-6 3,-6 5,-3 4,-4 4,-4 7,-3 6,-5 5,-2 7,-2 5,-1 6,0 9,0 5,2 6,2 5,3 5,3 5,3 6,4 5,5 4,5 5,6 4,8 4,5 3,5 3,5 4,5 4,4 -1,-7 -3,-5 0,-6 -1,-5 0,-7 -1,-5 0,-8 0,-7 2,-7 3,-5 4,-6 4,-5 4,-5 4,-4 5,-2 5,-3 5,-2 5,-2 5,-1 6,0 7,0 6,0 7,2 5,3 6,5 5,5 4,5 3,5 3,5 2,7 0,6 0,9 0,11 -1,11 0,12 -1,6 -3,9 -1,6 -1,5 -3,9 -2,7 -4,8 -2,6 -4,9 -3,6 -2,5 -3,9 -5,8 -2,5 -4,8 -5,7 -2,5 -5,7 -2,5 -5,7 -4,6 -5,4 -4,5 -5,6 -4,4 -3,5 -3,5 -5,2 -5,2 -5,1 -5,3 -5,2 m11,-9 l-1,-6 0,-7 -2,-7 -3,-6 -2,-6 -2,-6 -2,-7 -5,-3 -5,-4 -5,-4 -5,-7 -4,-4 -4,-5 -5,-6 -4,-5 -3,-5 -3,-6 -4,-5 -3,-5 -4,-7 -3,-6 -2,-6 -2,-6 -2,-6 -2,-5 -2,-6 -1,-5 -1,-6 0,-6 1,-5 4,-5 5,-3 6,-1 6,0 7,0 5,1 6,4 5,4 6,3 5,4 4,4 5,5 4,4 4,5 4,4 5,4 5,5 6,4 6,0 4,-4 3,-6 3,-5 2,-6 2,-5 2,-6 2,-5 2,-6 1,-6 2,-5 3,-6 3,-5 3,-5 4,-5 4,-4 5,-2 5,-1 6,0 3,6 2,5 0,6 -1,6 -2,6 -2,7 -2,5 -2,5 -3,6 -3,7 -2,5 -4,7 -3,8 -3,6 -2,6 -2,7 -3,5 -2,6 -1,5 -3,5 -1,7 -3,6 -2,5 -3,5 -2,6 -2,5 -3,5 -1,5 -3,6 -1,6 -3,6 -1,5 -2,5 -3,5 m0,7 1,-11 l0,5 0,7 0,6 m-62,-142 l2,6 0,6 4,4 5,6 3,5 4,6 4,4 5,6 5,5 5,4 4,4 3,5 5,5 5,4 6,2 6,-1 3,-5 3,-6 3,-5 3,-6 2,-6 3,-6 2,-7 3,-5 3,-5 4,-7 3,-5 m-35,58 l0,2 0,7 0,8 0,7 0,9 -1,6 -1,5 0,8 0,6 0,6 2,5 m38,-129 l3,-1 1,-5 2,-6 1,-6 0,-6 1,-5 0,-6 m-53,-11 l-5,-7 -1,-7 -3,-6 -3,-5 -3,-5 -3,-5 -4,-4 -6,-3 -5,-3 -6,-3 -6,-1 -5,-1 -7,-1 -6,-2 -5,-2 -5,-4 -5,-4 -2,-5 -1,-6 -1,-5 0,-8 1,-7 3,-7 5,-6 4,-4 4,-4 5,-3 6,-3 5,-2 5,-2 5,-2 6,-1 6,0 4,4 3,5 3,5 4,-6 2,-7 2,-5 2,-5 4,-5 5,-2 5,-1 7,0 6,1 4,4 1,7 0,7 0,6 -3,7 -3,6 -5,6 -2,5 -3,5 -3,6 -2,5 -2,5 -2,6 -1,7 -1,5 -1,6 0,6 -1,6 -1,5 0,6 m92,56 l4,-1 2,-5 3,-5 2,-5 4,-5 5,-3 4,-4 5,-4 6,-3 5,-4 6,-4 6,-3 5,-2 6,-1 5,-1 7,0 7,1 6,3 4,4 4,5 2,6 2,6 0,7 0,7 -1,5 -3,5 -4,4 -6,5 -7,3 -6,4 -7,3 -7,2 -8,3 -7,3 -7,3 -7,2 -5,3 -6,1 -6,1 -7,3 -5,2 -6,2 -5,3 m-208,-37 l-5,-4 -2,-5 -3,-5 -5,-5 -5,-3 -5,-3 -5,-3 -6,-2 -5,-2 -5,-1 -6,0 -7,0 -8,0 -6,3 -5,4 -4,6 -3,6 -2,6 -1,7 0,7 0,7 3,6 3,6 5,5 4,4 4,5 6,4 6,4 8,3 8,4 5,1 8,1 8,1 5,1 7,0 7,1 7,0 7,0 6,-1 5,-1 1,-7 0,-6 m-28,-50 l3,2 6,0 m216,2 l3,-3 6,-5 6,-4 6,-2 5,-3 6,-2 7,-3 6,-1 6,0 4,5 -4,4 -4,4 -6,5 -6,4 -5,4 -5,2 -8,3 -6,4 -8,1 m-6,4 l2,1 5,-1 m-4,-1 l7,-4 6,-4 m-227,16 l-3,-5 -6,-1 -5,-3 -6,-6 -6,-7 -3,-5 -4,-4 -5,-4 -5,-2 -5,-1 -7,0 -6,0 -5,2 -6,3 -5,4 -3,5 0,7 2,5 3,5 5,5 5,3 7,5 6,2 7,2 7,0 7,1 6,0 7,1 6,1 8,0 5,2 5,1 m256,207 l-1,-1 m-261,-203 -43,-32 l1,-1 0,-6 m286,-15 -5,-1 l2,0 -5,1',{height:30,twist:.2,scale:1})); + // doodles.push(new Doodle('M337.59375,418.125 l-5,8 -6,1 -5,-2 -6,-5 -6,-4 -7,-3 -3,-5 -4,-5 -4,-4 -4,-4 -4,-4 -6,-7 -4,-5 -3,-5 -4,-5 -4,-5 -5,-6 -4,-6 -6,-7 -3,-5 -4,-5 -3,-6 -4,-7 -4,-6 -4,-6 -3,-9 -4,-7 -1,-7 -3,-8 -1,-7 -1,-5 0,-9 -1,-7 0,-8 0,-6 1,-8 1,-6 2,-6 3,-6 5,-3 4,-4 4,-4 7,-3 6,-5 5,-2 7,-2 5,-1 6,0 9,0 5,2 6,2 5,3 5,3 5,3 6,4 5,5 4,5 5,6 4,8 4,5 3,5 3,5 4,5 4,4 -1,-7 -3,-5 0,-6 -1,-5 0,-7 -1,-5 0,-8 0,-7 2,-7 3,-5 4,-6 4,-5 4,-5 4,-4 5,-2 5,-3 5,-2 5,-2 5,-1 6,0 7,0 6,0 7,2 5,3 6,5 5,5 4,5 3,5 3,5 2,7 0,6 0,9 0,11 -1,11 0,12 -1,6 -3,9 -1,6 -1,5 -3,9 -2,7 -4,8 -2,6 -4,9 -3,6 -2,5 -3,9 -5,8 -2,5 -4,8 -5,7 -2,5 -5,7 -2,5 -5,7 -4,6 -5,4 -4,5 -5,6 -4,4 -3,5 -3,5 -5,2 -5,2 -5,1 -5,3 -5,2 m11,-9 l-1,-6 0,-7 -2,-7 -3,-6 -2,-6 -2,-6 -2,-7 -5,-3 -5,-4 -5,-4 -5,-7 -4,-4 -4,-5 -5,-6 -4,-5 -3,-5 -3,-6 -4,-5 -3,-5 -4,-7 -3,-6 -2,-6 -2,-6 -2,-6 -2,-5 -2,-6 -1,-5 -1,-6 0,-6 1,-5 4,-5 5,-3 6,-1 6,0 7,0 5,1 6,4 5,4 6,3 5,4 4,4 5,5 4,4 4,5 4,4 5,4 5,5 6,4 6,0 4,-4 3,-6 3,-5 2,-6 2,-5 2,-6 2,-5 2,-6 1,-6 2,-5 3,-6 3,-5 3,-5 4,-5 4,-4 5,-2 5,-1 6,0 3,6 2,5 0,6 -1,6 -2,6 -2,7 -2,5 -2,5 -3,6 -3,7 -2,5 -4,7 -3,8 -3,6 -2,6 -2,7 -3,5 -2,6 -1,5 -3,5 -1,7 -3,6 -2,5 -3,5 -2,6 -2,5 -3,5 -1,5 -3,6 -1,6 -3,6 -1,5 -2,5 -3,5 m0,7 1,-11 l0,5 0,7 0,6 m-62,-142 l2,6 0,6 4,4 5,6 3,5 4,6 4,4 5,6 5,5 5,4 4,4 3,5 5,5 5,4 6,2 6,-1 3,-5 3,-6 3,-5 3,-6 2,-6 3,-6 2,-7 3,-5 3,-5 4,-7 3,-5 m-35,58 l0,2 0,7 0,8 0,7 0,9 -1,6 -1,5 0,8 0,6 0,6 2,5 m38,-129 l3,-1 1,-5 2,-6 1,-6 0,-6 1,-5 0,-6 m-53,-11 l-5,-7 -1,-7 -3,-6 -3,-5 -3,-5 -3,-5 -4,-4 -6,-3 -5,-3 -6,-3 -6,-1 -5,-1 -7,-1 -6,-2 -5,-2 -5,-4 -5,-4 -2,-5 -1,-6 -1,-5 0,-8 1,-7 3,-7 5,-6 4,-4 4,-4 5,-3 6,-3 5,-2 5,-2 5,-2 6,-1 6,0 4,4 3,5 3,5 4,-6 2,-7 2,-5 2,-5 4,-5 5,-2 5,-1 7,0 6,1 4,4 1,7 0,7 0,6 -3,7 -3,6 -5,6 -2,5 -3,5 -3,6 -2,5 -2,5 -2,6 -1,7 -1,5 -1,6 0,6 -1,6 -1,5 0,6 m92,56 l4,-1 2,-5 3,-5 2,-5 4,-5 5,-3 4,-4 5,-4 6,-3 5,-4 6,-4 6,-3 5,-2 6,-1 5,-1 7,0 7,1 6,3 4,4 4,5 2,6 2,6 0,7 0,7 -1,5 -3,5 -4,4 -6,5 -7,3 -6,4 -7,3 -7,2 -8,3 -7,3 -7,3 -7,2 -5,3 -6,1 -6,1 -7,3 -5,2 -6,2 -5,3 m-208,-37 l-5,-4 -2,-5 -3,-5 -5,-5 -5,-3 -5,-3 -5,-3 -6,-2 -5,-2 -5,-1 -6,0 -7,0 -8,0 -6,3 -5,4 -4,6 -3,6 -2,6 -1,7 0,7 0,7 3,6 3,6 5,5 4,4 4,5 6,4 6,4 8,3 8,4 5,1 8,1 8,1 5,1 7,0 7,1 7,0 7,0 6,-1 5,-1 1,-7 0,-6 m-28,-50 l3,2 6,0 m216,2 l3,-3 6,-5 6,-4 6,-2 5,-3 6,-2 7,-3 6,-1 6,0 4,5 -4,4 -4,4 -6,5 -6,4 -5,4 -5,2 -8,3 -6,4 -8,1 m-6,4 l2,1 5,-1 m-4,-1 l7,-4 6,-4 m-227,16 l-3,-5 -6,-1 -5,-3 -6,-6 -6,-7 -3,-5 -4,-4 -5,-4 -5,-2 -5,-1 -7,0 -6,0 -5,2 -6,3 -5,4 -3,5 0,7 2,5 3,5 5,5 5,3 7,5 6,2 7,2 7,0 7,1 6,0 7,1 6,1 8,0 5,2 5,1 m256,207 l-1,-1 m-261,-203 -43,-32 l1,-1 0,-6 m286,-15 -5,-1 l2,0 -5,1',{height:10,twist:.2,scale:.25})); + // doodles.push(new Doodle('M337.59375,418.125 l-5,8 -6,1 -5,-2 -6,-5 -6,-4 -7,-3 -3,-5 -4,-5 -4,-4 -4,-4 -4,-4 -6,-7 -4,-5 -3,-5 -4,-5 -4,-5 -5,-6 -4,-6 -6,-7 -3,-5 -4,-5 -3,-6 -4,-7 -4,-6 -4,-6 -3,-9 -4,-7 -1,-7 -3,-8 -1,-7 -1,-5 0,-9 -1,-7 0,-8 0,-6 1,-8 1,-6 2,-6 3,-6 5,-3 4,-4 4,-4 7,-3 6,-5 5,-2 7,-2 5,-1 6,0 9,0 5,2 6,2 5,3 5,3 5,3 6,4 5,5 4,5 5,6 4,8 4,5 3,5 3,5 4,5 4,4 -1,-7 -3,-5 0,-6 -1,-5 0,-7 -1,-5 0,-8 0,-7 2,-7 3,-5 4,-6 4,-5 4,-5 4,-4 5,-2 5,-3 5,-2 5,-2 5,-1 6,0 7,0 6,0 7,2 5,3 6,5 5,5 4,5 3,5 3,5 2,7 0,6 0,9 0,11 -1,11 0,12 -1,6 -3,9 -1,6 -1,5 -3,9 -2,7 -4,8 -2,6 -4,9 -3,6 -2,5 -3,9 -5,8 -2,5 -4,8 -5,7 -2,5 -5,7 -2,5 -5,7 -4,6 -5,4 -4,5 -5,6 -4,4 -3,5 -3,5 -5,2 -5,2 -5,1 -5,3 -5,2 m11,-9 l-1,-6 0,-7 -2,-7 -3,-6 -2,-6 -2,-6 -2,-7 -5,-3 -5,-4 -5,-4 -5,-7 -4,-4 -4,-5 -5,-6 -4,-5 -3,-5 -3,-6 -4,-5 -3,-5 -4,-7 -3,-6 -2,-6 -2,-6 -2,-6 -2,-5 -2,-6 -1,-5 -1,-6 0,-6 1,-5 4,-5 5,-3 6,-1 6,0 7,0 5,1 6,4 5,4 6,3 5,4 4,4 5,5 4,4 4,5 4,4 5,4 5,5 6,4 6,0 4,-4 3,-6 3,-5 2,-6 2,-5 2,-6 2,-5 2,-6 1,-6 2,-5 3,-6 3,-5 3,-5 4,-5 4,-4 5,-2 5,-1 6,0 3,6 2,5 0,6 -1,6 -2,6 -2,7 -2,5 -2,5 -3,6 -3,7 -2,5 -4,7 -3,8 -3,6 -2,6 -2,7 -3,5 -2,6 -1,5 -3,5 -1,7 -3,6 -2,5 -3,5 -2,6 -2,5 -3,5 -1,5 -3,6 -1,6 -3,6 -1,5 -2,5 -3,5 m0,7 1,-11 l0,5 0,7 0,6 m-62,-142 l2,6 0,6 4,4 5,6 3,5 4,6 4,4 5,6 5,5 5,4 4,4 3,5 5,5 5,4 6,2 6,-1 3,-5 3,-6 3,-5 3,-6 2,-6 3,-6 2,-7 3,-5 3,-5 4,-7 3,-5 m-35,58 l0,2 0,7 0,8 0,7 0,9 -1,6 -1,5 0,8 0,6 0,6 2,5 m38,-129 l3,-1 1,-5 2,-6 1,-6 0,-6 1,-5 0,-6 m-53,-11 l-5,-7 -1,-7 -3,-6 -3,-5 -3,-5 -3,-5 -4,-4 -6,-3 -5,-3 -6,-3 -6,-1 -5,-1 -7,-1 -6,-2 -5,-2 -5,-4 -5,-4 -2,-5 -1,-6 -1,-5 0,-8 1,-7 3,-7 5,-6 4,-4 4,-4 5,-3 6,-3 5,-2 5,-2 5,-2 6,-1 6,0 4,4 3,5 3,5 4,-6 2,-7 2,-5 2,-5 4,-5 5,-2 5,-1 7,0 6,1 4,4 1,7 0,7 0,6 -3,7 -3,6 -5,6 -2,5 -3,5 -3,6 -2,5 -2,5 -2,6 -1,7 -1,5 -1,6 0,6 -1,6 -1,5 0,6 m92,56 l4,-1 2,-5 3,-5 2,-5 4,-5 5,-3 4,-4 5,-4 6,-3 5,-4 6,-4 6,-3 5,-2 6,-1 5,-1 7,0 7,1 6,3 4,4 4,5 2,6 2,6 0,7 0,7 -1,5 -3,5 -4,4 -6,5 -7,3 -6,4 -7,3 -7,2 -8,3 -7,3 -7,3 -7,2 -5,3 -6,1 -6,1 -7,3 -5,2 -6,2 -5,3 m-208,-37 l-5,-4 -2,-5 -3,-5 -5,-5 -5,-3 -5,-3 -5,-3 -6,-2 -5,-2 -5,-1 -6,0 -7,0 -8,0 -6,3 -5,4 -4,6 -3,6 -2,6 -1,7 0,7 0,7 3,6 3,6 5,5 4,4 4,5 6,4 6,4 8,3 8,4 5,1 8,1 8,1 5,1 7,0 7,1 7,0 7,0 6,-1 5,-1 1,-7 0,-6 m-28,-50 l3,2 6,0 m216,2 l3,-3 6,-5 6,-4 6,-2 5,-3 6,-2 7,-3 6,-1 6,0 4,5 -4,4 -4,4 -6,5 -6,4 -5,4 -5,2 -8,3 -6,4 -8,1 m-6,4 l2,1 5,-1 m-4,-1 l7,-4 6,-4 m-227,16 l-3,-5 -6,-1 -5,-3 -6,-6 -6,-7 -3,-5 -4,-4 -5,-4 -5,-2 -5,-1 -7,0 -6,0 -5,2 -6,3 -5,4 -3,5 0,7 2,5 3,5 5,5 5,3 7,5 6,2 7,2 7,0 7,1 6,0 7,1 6,1 8,0 5,2 5,1 m256,207 l-1,-1 m-261,-203 -43,-32 l1,-1 0,-6 m286,-15 -5,-1 l2,0 -5,1',{height:10,twist:.2,scale:.5,offset:new Point(100,100)})); + // doodles.push(new Doodle('M337.59375,418.125 l-5,8 -6,1 -5,-2 -6,-5 -6,-4 -7,-3 -3,-5 -4,-5 -4,-4 -4,-4 -4,-4 -6,-7 -4,-5 -3,-5 -4,-5 -4,-5 -5,-6 -4,-6 -6,-7 -3,-5 -4,-5 -3,-6 -4,-7 -4,-6 -4,-6 -3,-9 -4,-7 -1,-7 -3,-8 -1,-7 -1,-5 0,-9 -1,-7 0,-8 0,-6 1,-8 1,-6 2,-6 3,-6 5,-3 4,-4 4,-4 7,-3 6,-5 5,-2 7,-2 5,-1 6,0 9,0 5,2 6,2 5,3 5,3 5,3 6,4 5,5 4,5 5,6 4,8 4,5 3,5 3,5 4,5 4,4 -1,-7 -3,-5 0,-6 -1,-5 0,-7 -1,-5 0,-8 0,-7 2,-7 3,-5 4,-6 4,-5 4,-5 4,-4 5,-2 5,-3 5,-2 5,-2 5,-1 6,0 7,0 6,0 7,2 5,3 6,5 5,5 4,5 3,5 3,5 2,7 0,6 0,9 0,11 -1,11 0,12 -1,6 -3,9 -1,6 -1,5 -3,9 -2,7 -4,8 -2,6 -4,9 -3,6 -2,5 -3,9 -5,8 -2,5 -4,8 -5,7 -2,5 -5,7 -2,5 -5,7 -4,6 -5,4 -4,5 -5,6 -4,4 -3,5 -3,5 -5,2 -5,2 -5,1 -5,3 -5,2 m11,-9 l-1,-6 0,-7 -2,-7 -3,-6 -2,-6 -2,-6 -2,-7 -5,-3 -5,-4 -5,-4 -5,-7 -4,-4 -4,-5 -5,-6 -4,-5 -3,-5 -3,-6 -4,-5 -3,-5 -4,-7 -3,-6 -2,-6 -2,-6 -2,-6 -2,-5 -2,-6 -1,-5 -1,-6 0,-6 1,-5 4,-5 5,-3 6,-1 6,0 7,0 5,1 6,4 5,4 6,3 5,4 4,4 5,5 4,4 4,5 4,4 5,4 5,5 6,4 6,0 4,-4 3,-6 3,-5 2,-6 2,-5 2,-6 2,-5 2,-6 1,-6 2,-5 3,-6 3,-5 3,-5 4,-5 4,-4 5,-2 5,-1 6,0 3,6 2,5 0,6 -1,6 -2,6 -2,7 -2,5 -2,5 -3,6 -3,7 -2,5 -4,7 -3,8 -3,6 -2,6 -2,7 -3,5 -2,6 -1,5 -3,5 -1,7 -3,6 -2,5 -3,5 -2,6 -2,5 -3,5 -1,5 -3,6 -1,6 -3,6 -1,5 -2,5 -3,5 m0,7 1,-11 l0,5 0,7 0,6 m-62,-142 l2,6 0,6 4,4 5,6 3,5 4,6 4,4 5,6 5,5 5,4 4,4 3,5 5,5 5,4 6,2 6,-1 3,-5 3,-6 3,-5 3,-6 2,-6 3,-6 2,-7 3,-5 3,-5 4,-7 3,-5 m-35,58 l0,2 0,7 0,8 0,7 0,9 -1,6 -1,5 0,8 0,6 0,6 2,5 m38,-129 l3,-1 1,-5 2,-6 1,-6 0,-6 1,-5 0,-6 m-53,-11 l-5,-7 -1,-7 -3,-6 -3,-5 -3,-5 -3,-5 -4,-4 -6,-3 -5,-3 -6,-3 -6,-1 -5,-1 -7,-1 -6,-2 -5,-2 -5,-4 -5,-4 -2,-5 -1,-6 -1,-5 0,-8 1,-7 3,-7 5,-6 4,-4 4,-4 5,-3 6,-3 5,-2 5,-2 5,-2 6,-1 6,0 4,4 3,5 3,5 4,-6 2,-7 2,-5 2,-5 4,-5 5,-2 5,-1 7,0 6,1 4,4 1,7 0,7 0,6 -3,7 -3,6 -5,6 -2,5 -3,5 -3,6 -2,5 -2,5 -2,6 -1,7 -1,5 -1,6 0,6 -1,6 -1,5 0,6 m92,56 l4,-1 2,-5 3,-5 2,-5 4,-5 5,-3 4,-4 5,-4 6,-3 5,-4 6,-4 6,-3 5,-2 6,-1 5,-1 7,0 7,1 6,3 4,4 4,5 2,6 2,6 0,7 0,7 -1,5 -3,5 -4,4 -6,5 -7,3 -6,4 -7,3 -7,2 -8,3 -7,3 -7,3 -7,2 -5,3 -6,1 -6,1 -7,3 -5,2 -6,2 -5,3 m-208,-37 l-5,-4 -2,-5 -3,-5 -5,-5 -5,-3 -5,-3 -5,-3 -6,-2 -5,-2 -5,-1 -6,0 -7,0 -8,0 -6,3 -5,4 -4,6 -3,6 -2,6 -1,7 0,7 0,7 3,6 3,6 5,5 4,4 4,5 6,4 6,4 8,3 8,4 5,1 8,1 8,1 5,1 7,0 7,1 7,0 7,0 6,-1 5,-1 1,-7 0,-6 m-28,-50 l3,2 6,0 m216,2 l3,-3 6,-5 6,-4 6,-2 5,-3 6,-2 7,-3 6,-1 6,0 4,5 -4,4 -4,4 -6,5 -6,4 -5,4 -5,2 -8,3 -6,4 -8,1 m-6,4 l2,1 5,-1 m-4,-1 l7,-4 6,-4 m-227,16 l-3,-5 -6,-1 -5,-3 -6,-6 -6,-7 -3,-5 -4,-4 -5,-4 -5,-2 -5,-1 -7,0 -6,0 -5,2 -6,3 -5,4 -3,5 0,7 2,5 3,5 5,5 5,3 7,5 6,2 7,2 7,0 7,1 6,0 7,1 6,1 8,0 5,2 5,1 m256,207 l-1,-1 m-261,-203 -43,-32 l1,-1 0,-6 m286,-15 -5,-1 l2,0 -5,1',{height:10,twist:.2,scale:2})); + // doodles.push(new Doodle('M205,246 l0,-5 -5,2 -7,0 -5,1 -5,3 -5,4 -5,1 -6,4 -3,6 -1,5 -4,7 -3,5 -4,5 -1,5 0,7 -1,5 0,6 0,7 1,6 3,5 3,5 4,5 4,5 4,4 4,5 4,5 6,4 5,4 5,3 5,3 5,1 5,3 6,3 7,2 5,1 6,1 7,0 6,0 6,-1 6,-1 5,-3 5,-2 5,-4 5,-4 6,-5 4,-5 4,-5 4,-6 3,-5 5,-5 3,-5 4,-4 0,-6 1,-6 0,-7 0,-6 0,-6 -1,-6 -3,-5 -2,-5 -5,-4 -5,-3 -5,-3 -5,-3 -5,-3 -4,-4 -5,-4 -5,-5 -5,-5 -5,-2 -5,-3 -5,-1 -6,-2 -6,-2 -6,-1 -5,-1 -5,-1 -6,0 -7,0 -5,2 -6,2 -7,6 -5,4 m49,-24 l-5,6 0,-6 0,-8 1,-5 1,-6 3,-7 2,-6 1,-7 1,-6 2,-5 4,-6 3,-6 5,-3 6,-1 5,2 1,6 0,6 2,-5 6,-4 5,-1 5,5 0,6 -2,5 -5,2 5,2 5,1 2,5 0,6 -4,5 -5,3 -5,1 -7,0 -6,3 -2,5 -2,5 -2,5 0,6 -2,5 -1,5 -1,5 m-27,-15 l2,2 5,1 5,2 6,4 7,1 m-24,-5 l9,-1 5,1 7,0 6,0 m-21,-3 l3,1 7,3 6,3 m-19,-22 l6,3 5,1 7,3 8,2 m-23,-8 l4,3 5,3 6,2 8,2 m-20,-4 l2,1 6,0 8,3 5,2 m-24,-29 l3,2 7,1 5,2 5,1 6,2 m-21,-4 l4,1 5,3 5,3 5,3 m-26,-7 l7,2 5,2 6,2 m-14,-6 l3,2 6,0 8,2 5,1 m-20,-8 l10,3 m39,64 l-1,-2 0,-9 1,-7 2,-7 2,-5 3,-7 3,-7 3,-7 2,-5 0,-6 0,-7 -1,-6 0,-6 0,-7 0,-6 0,-6 0,-6 0,-6 0,-6 -4,-5 -3,-7 -3,-5 -1,-5 -2,-5 -3,-6 -2,-6 -2,-7 -1,-5 -2,-5 0,-7 -1,-5 -1,-6 0,-6 0,-6 3,-6 4,-5 3,-5 4,-4 5,-2 7,0 6,1 6,3 3,5 3,5 2,5 4,6 2,6 1,5 1,5 0,7 1,5 0,6 0,6 0,6 1,6 0,6 0,6 0,6 0,6 0,8 -1,6 0,7 0,7 -1,5 -1,6 -2,5 0,6 -1,5 -1,6 -1,5 -1,5 0,6 0,7 -2,6 0,6 -2,5 -2,6 -1,7 -2,5 -2,6 -5,3 -4,4 m-21,-28 l3,2 6,4 5,2 6,1 7,1 m-17,-12 l8,7 6,3 m-16,-5 l4,7 8,6 6,4 6,1 m-21,-11 l12,5 m-15,-31 l3,4 5,2 6,3 8,2 m-14,-5 l4,3 8,5 7,4 m-17,-8 l6,3 7,1 6,0 m-26,-10 l8,3 6,2 7,3 8,2 m-30,-9 l3,4 10,5 6,0 m-22,9 l6,1 7,5 8,3 7,3 m-24,-16 l9,8 10,2 5,2 m-24,-18 8,-17 l1,0 8,0 7,0 m-22,-6 l1,0 6,0 9,0 6,-1 6,-1 m-20,-2 l4,1 8,0 6,0 9,0 6,0 m-36,-2 l4,4 8,1 5,1 7,1 7,0 m-34,5 l11,-2 10,0 7,0 m-23,-6 l2,0 6,0 7,0 m-12,3 l3,-2 6,0 6,0 m-13,3 13,-35 l-3,3 -5,1 5,1 7,0 m-21,8 l2,0 6,0 7,0 5,-1 m-15,1 -1,-5 l4,-2 6,0 9,0 9,0 m-33,-1 l4,3 6,0 7,0 7,1 m-24,1 l7,0 8,0 7,0 m-17,6 l3,-1 7,0 m-12,-5 l3,2 9,0 m-16,-8 l3,0 9,0 m-6,-21 l3,0 7,0 m-9,2 l3,1 6,0 m-12,2 -5,5 l3,-2 6,0 5,-2 m23,-8 -6,8 l-2,-2 1,-6 1,7 -1,5 m-15,-8 l2,3 6,0 m-23,-3 l2,2 9,0 10,0 7,-2 m-31,4 l3,0 7,0 9,0 m-16,4 l2,0 9,0 6,-1 9,-2 m-19,-7 l2,0 8,0 m-5,0 l11,-1 7,0 m-20,6 l2,-3 9,0 m-10,0 l1,-1 10,0 m-20,-20 l4,0 6,0 6,0 m-16,3 l3,3 8,0 9,0 6,-2 m-26,11 l2,-3 5,-2 6,0 9,-2 m-20,-4 l8,-1 8,0 8,0 7,0 m-31,-3 l4,0 7,0 8,0 8,0 m-26,1 l5,1 11,0 m-22,8 l7,-1 6,0 5,-1 8,-1 m-15,-1 l20,-2 m-32,-18 l4,0 8,0 6,-1 7,0 m-28,-1 l14,-3 11,-1 7,-2 6,-2 m-29,2 l4,-2 8,0 10,0 8,0 m-36,7 l7,1 7,0 5,-1 5,-1 5,-1 6,0 m-30,2 l9,0 9,0 9,0 m-15,1 -32,-4 l4,1 10,0 10,0 5,-1 5,-1 m-16,-1 l7,-2 7,0 6,0 m-27,6 l5,-1 9,0 6,0 m-17,-3 l3,-2 7,-1 5,-1 7,-2 m-20,2 l1,2 7,0 6,0 11,0 m-32,-1 l4,1 7,0 9,0 m-16,1 l4,1 7,1 5,1 7,0 m-10,-12 l1,3 7,0 9,0 m-14,7 l2,2 7,0 m-37,-22 l5,2 10,-1 6,-1 6,-2 5,-3 5,-2 m-35,5 l3,1 11,0 6,0 6,0 9,0 m-33,8 l4,-2 11,0 7,0 7,0 m-25,3 l5,-2 6,0 6,-1 7,0 13,0 7,-1 m-30,0 l12,-4 m-21,-10 l2,5 8,1 9,0 6,2 m-5,0 l11,-1 m-15,6 l2,0 7,-1 5,-2 m-15,-1 -27,-1 l2,5 11,0 9,0 7,0 m-22,1 l5,-1 8,0 8,-3 m-29,-14 l3,2 5,3 5,1 4,-5 5,4 5,2 3,-5 1,-5 5,1 5,5 4,-5 2,-5 m-54,2 l3,1 7,1 m-23,68 2,-10 6,7 -4,5 l-2,-4 m1,-7 l3,0 5,-3 -2,6 0,7 m15,3 l-6,1 5,-3 m-19,-7 l0,1 m0,1 l2,-6 m18,7 -1,9 l0,-1 5,-5 m-7,0 l2,-4 m-6,-2 4,0 l7,4 m0,24 0,1 l-3,-1 m5,8 l-1,-4 5,-1 5,-1 m-16,12 l3,-2 6,-3 m-6,8 l1,-3 6,-3 4,-4 m11,155 l0,1 5,1 5,3 4,5 5,4 5,2 6,2 5,2 6,1 m-1,10 l3,-5 0,-6 0,-8 1,-5 3,-6 1,-5 2,-5 1,-5 0,-6 -1,-6 -6,-3 -6,1 -4,7 -1,5 -1,5 m-1,-2 l-5,-5 -7,-1 -7,-2 -7,-3 -5,-1 -5,-2 m-5,27 l2,0 8,2 6,3 m-50,27 l-2,2 0,6 0,6 1,5 1,5 4,6 4,6 4,4 -1,6 -1,5 0,7 5,3 6,-2 2,-8 1,-5 0,-6 0,-6 0,-6 m8,-3 l-4,-2 -7,-1 -6,-5 -5,-5 -2,-5 -3,-5 0,-6 m26,21 l-3,5 0,10 0,6 -1,7 m-17,-48 l-3,0 -6,0 -1,-5 -5,-4 -5,-2 -5,-3 -3,-5 0,-6 0,-7 1,-5 5,-5 5,-3 5,-1 6,0 6,2 5,3 5,3 6,3 m-11,-8 l2,3 6,6 6,5 m-121,10 l3,0 -5,4 5,-4 5,-2 4,-4 5,-3 5,-3 5,-3 m-13,6 l4,-1 5,-2 6,-4 5,-3 4,-5 5,-3 5,-4 5,-3 4,-5 4,-5 5,-4 5,-4 5,-4 3,-6 1,-6 2,-5 4,-5 m-7,13 l3,4 5,1 5,2 4,4 5,4 m-36,1 l-1,0 m312,268 l1,0 m2,0 -317,-260 6,-5 l2,-4 6,0 6,0 5,2 m287,265 l-1,0 m3,-1 -303,-252 -3,-9 l3,-3 6,0 6,0 6,1 5,2 5,1 m-4,-7 l4,13 m-75,14 l4,2 1,5 4,4 5,5 4,4 m-9,-20 l4,4 3,6 6,7 m-10,5 l2,-2 5,1 7,1 m-8,-12 l3,3 m-19,-117 l2,4 0,7 -1,5 -1,5 -2,5 -3,5 -3,5 -2,5 -4,4 -2,5 -2,5 -3,5 -2,5 -3,5 -4,5 -4,4 -7,3 -6,1 m28,-18 6,-39 3,12 l7,-5 6,-2 6,-1 5,1 5,1 0,6 -2,6 -5,4 -5,2 -6,2 -7,0 -4,-4 -2,-6 m-7,12 l3,-4 5,1 5,4 m-4,2 l8,-6 5,-1 6,0 -7,1 -6,-1 5,-4 -5,-1 6,0 -5,-3 m-19,12 l3,-2 9,0 8,0 6,1 m-17,2 l-3,-3 9,-2 10,-1 m10,14 l-5,-5 -5,-3 -4,-5 -5,-2 -6,-3 -7,0 m6,5 l4,-2 3,-5 5,-1 0,6 m-20,-1 l4,3 6,0 m-3,-3 l8,-1 5,1 m-11,0 l2,-2 6,0 m5,5 -40,29 l-1,1 0,6 0,6 2,5 5,2 5,2 5,2 6,0 5,-3 5,-6 4,-6 1,-5 -1,-6 -5,-5 -5,-3 -5,-4 -5,-1 m13,12 l-4,3 0,7 -4,-5 m7,-1 l0,2 6,-1 2,-5 -7,-2 -5,2 -2,6 5,3 6,1 2,-7 -1,-5 -5,-4 -5,5 0,6 2,5 4,-6 m-7,4 l0,2 6,0 5,-4 -3,-5 -4,4 m-2,-17 l-3,2 -3,8 -2,6 0,6 1,8 7,2 6,3 m-3,-59 l5,-3 6,0 6,0 5,2 2,7 1,5 m-28,14 l0,2 -2,6 -3,7 0,8 0,8 m3,-36 l-3,7 0,8 5,7 5,3 5,2 m-19,-14 l-3,4 2,7 4,5 5,5 6,2 m-19,-29 l1,7 4,6 4,4 m7,-22 l-4,3 -1,5 -1,9 -1,8 0,6 3,8 m10,-72 l1,1 5,1 7,2 5,5 2,7 m-22,-5 l3,1 6,0 9,0 8,0 2,7 m-21,-15 l0,1 8,0 4,6 1,5 m-11,-12 l2,0 9,3 m-61,19 l3,-4 7,-4 6,-5 5,-6 1,-5 0,-7 -6,2 -5,4 -5,6 -3,7 -1,7 1,5 8,-5 6,-9 4,-5 5,-7 2,-5 -4,7 -3,5 -4,5 -4,4 -5,5 5,-2 4,-6 4,-6 4,-5 1,-5 4,-5 -7,7 -5,6 -5,6 -6,6 4,-5 7,-8 5,-5 7,-6 5,-5 -8,3 -8,6 -4,4 -4,4 7,-4 7,-9 -5,3 -8,7 -6,5 -5,5 8,-2 6,-4 5,-4 5,-5 7,-4 -3,7 -5,5 -5,6 -7,5 3,-10 m7,-6 l-1,-3 7,-6 m110,18 l-3,3 0,7 0,7 m-3,6 l0,2 5,-3 5,-4 5,-3 3,-5 m-18,5 l-1,-3 6,-5 7,0 -2,6 1,-5 -3,5 m293,292 l0,-1 m-280,-289 l0,-2 -5,4 -3,5 -3,5 m6,-26 -11,16 -4,3 l1,-5 -4,6 0,-6 5,-4 m-3,-4 l8,3 -1,7 -5,5 3,-5 5,-5 5,-3 -5,3 m19,17 l-4,-1 -7,0 -6,1 -5,2 3,-7 4,-5 2,-5 m3,3 l4,5 -5,4 -7,1 m4,-9 l1,-1 7,-3 5,-2 -5,1 m4,26 l-3,-2 -7,1 -6,1 -5,1 5,2 6,1 m-2,3 l10,3 5,-4 6,-3 m-16,-7 l1,-3 -7,0 m-2,10 l8,-1 7,-1 m-24,18 l4,0 8,0 5,-4 3,-5 -5,-1 3,-7 4,-4 m-13,4 l6,-1 4,-4 m-7,0 -92,80 l2,-4 3,-6 1,-5 3,-6 m9,24 l0,-5 -1,-6 -5,-5 -5,-4 m2,12 l3,0 4,4 -3,-5 -4,-5 4,4 2,-5 0,9 m11,9 l-3,-3 1,-5 4,-6 2,-5 m9,17 l0,-4 -5,-6 -4,-5 -1,-6 m-2,17 l2,-1 1,-5 m13,11 l-4,-6 0,-6 0,-6 m18,16 l-3,-4 -5,-5 -5,-4 -5,-5 m3,9 l-1,0 3,5 2,-5 m-6,-11 l0,2 m1,8 l3,2 6,1 m-70,-212 l-6,5 -3,5 0,6 0,6 0,6 0,7 1,8 1,5 1,6 1,7 5,7 m-7,-63 l2,-4 8,0 6,2 2,5 3,5 1,5 2,6 1,6 1,6 0,8 1,6 1,6 3,5 2,6 m-38,-2 l3,2 4,5 5,5 m-19,-49 l7,-2 7,0 7,-1 6,-4 4,-4 m-10,-6 l-2,3 4,-6 4,-6 3,-5 -6,7 -6,8 -4,6 3,-8 2,-5 5,-3 -1,10 -4,8 7,-5 6,-7 -2,5 -3,5 -3,6 m-10,-9 l2,2 5,5 m2,-1 2,-4 l-1,11 0,8 2,8 1,5 3,7 4,4 m-49,72 l-2,-4 -4,-6 -5,-1 -5,-1 -8,0 -5,1 -5,1 -5,5 -5,3 -4,5 -3,5 -1,5 0,6 3,5 5,1 6,0 6,-2 6,-3 6,-1 6,-2 8,-3 6,0 7,1 m-41,-22 l-2,0 -3,6 4,8 1,8 -2,5 -6,-6 -2,-7 -1,-5 0,9 1,5 1,8 0,-8 -3,-6 2,7 6,8 7,5 m323,246 l-1,-1 m-337,-251 -13,-8 5,3 l2,-1 6,1 3,-5 -5,-2 -5,7 -1,6 m-9,-11 15,0 3,-1 l-1,3 5,-1 -7,-2 m6,6 l1,-2 -3,6 3,-5 -5,1 m-23,0 l9,0 5,-2 14,-6 10,-4 m-14,2 l0,2 6,0 5,-4 5,-2 5,-1 6,0 7,-1 m-9,7 l4,-5 6,0 6,0 7,0 m2,35 l0,2 0,6 -1,5 -4,5 -1,5 0,6 -2,6 -2,5 0,6 0,6 0,7 0,8 0,6 2,5 1,6 1,5 2,6 5,3 5,3 5,-2 2,-8 1,-9 1,-6 m-3,0 l2,5 0,6 1,6 3,5 4,4 5,-3 1,-5 0,-7 0,-6 1,-5 2,5 2,6 5,4 6,1 5,-4 0,-7 -5,-3 -4,-4 -5,-4 -1,-5 -5,-6 -2,-7 -2,-5 -1,-5 -2,-5 -2,-6 0,-6 0,-6 m-33,-5 l8,-1 8,1 7,0 m-17,4 l3,-1 6,0 7,0 6,0 7,-2 m-19,0 l4,-4 7,-1 6,-2 m-15,3 l6,-1 7,0 7,-1 m-29,21 l5,0 9,-1 9,-2 6,-4 m-36,10 l6,-1 6,0 7,0 8,-5 m-16,5 l5,-4 7,-1 8,-2 m-20,1 l9,-3 6,0 m-22,24 l2,0 9,0 7,-2 9,-3 4,-4 m-34,9 l10,-7 5,-1 8,-1 5,-1 8,0 6,-2 m-41,20 l4,-4 9,0 8,0 8,-1 m-28,-3 l3,-1 5,-2 10,-4 6,-3 5,-1 m-19,11 l5,-4 8,-2 6,-3 5,-1 m-21,5 -10,59 l10,4 m5,-14 l-1,4 0,6 0,6 m-14,-15 l4,4 2,5 5,2 m17,-6 l-8,4 5,2 4,4 m5,-19 l-4,10 0,7 4,5 m15,-14 l1,0 4,5 m-10,-11 l7,4 5,1 3,-5 0,-7 -2,-5 m-8,-1 l5,9 2,5 m60,-285')); + doodles.push(new Doodle('M262.59375,97.125 l0,1 -2,6 -2,5 -4,5 -2,5 -2,5 -2,5 0,6 0,6 0,6 0,6 0,6 0,6 3,5 3,5 2,5 4,4 5,3 5,2 5,2 m-17,-89 -1,0 l0,0 5,-1 5,-1 5,-1 5,-1 5,-1 m3,-2 l2,-1 m-25,0 l1,0 m2,-2 3,-2 l0,0 m0,-1 l5,-1 m8,101 l-4,0 -6,0 -5,1 -4,5 -2,5 -2,5 m-1,3 l-1,2 0,6 0,6 0,6 1,5 4,4 5,2 5,1 5,1 m241,-16 -231,-137 l1,3 0,6 0,6 0,6 -1,5 0,6 -2,6 0,8 0,6 -1,5 0,7 0,6 0,6 -1,5 -1,5 -1,5 -1,5 -1,6 m7,-1 l1,5 0,6 -1,5 -2,5 -2,5 0,6 -1,5 -2,5 -1,5 m8,-13 l-2,3 -1,5 -1,5 -1,5 -2,5 -1,5 m9,-156 l3,-2 5,1 5,1 6,0 6,0 4,4 0,6 0,6 -2,5 -2,5 0,6 -1,5 0,6 0,6 0,6 0,6 0,6 0,6 0,6 0,6 0,6 -1,6 0,6 0,6 -2,5 -1,5 -1,6 -1,5 -2,5 -1,5 -1,6 -1,5 m17,-150 l0,-1 4,-4 5,-1 6,0 6,0 6,0 6,-1 5,-1 4,4 0,6 0,6 0,6 0,6 -1,5 -5,1 -6,0 -6,0 -6,0 -6,0 -6,4 -6,0 m20,-11 l-4,0 -2,6 -5,-2 m33,1 l-7,5 -5,1 -6,0 -6,0 -7,0 -5,1 -5,2 -6,0 m35,-27 l-1,0 -6,0 -5,1 -6,0 m-1,0 l-4,1 m25,2 l-4,1 -6,0 -6,0 m-1,0 l-5,0 -6,0 5,-1 6,0 6,0 6,0 6,0 6,0 5,1 m67,363 -262,-340 l-3,1 -6,0 -4,4 -4,4 -6,0 -3,6 -1,5 0,6 0,6 0,6 1,5 1,5 0,6 0,6 2,5 4,4 4,4 3,5 m1,-14 l1,6 0,6 0,6 m-3,-20 l0,1 -2,5 0,6 1,5 -1,5 -5,4 -2,5 -1,5 0,6 0,6 0,6 3,5 5,4 m229,-25 -211,-99 l-1,3 0,6 0,6 -1,6 0,6 -2,5 -1,5 0,6 -1,5 0,6 0,6 0,6 0,6 -1,6 -3,5 -3,6 -1,5 -1,5 -2,5 -1,5 0,6 0,6 0,6 -1,5 m26,-137 l3,4 5,1 5,3 m-15,-8 l1,2 5,2 5,1 m4,-1 l1,2 -1,8 0,6 -1,7 -2,5 -1,5 -1,6 -1,5 -2,6 0,6 0,7 -1,6 0,6 0,6 0,6 0,6 0,6 0,6 0,6 0,6 2,5 1,5 -1,5 -6,0 -5,1 -5,1 m-77,4 -17,5 l3,3 6,0 6,-1 5,-2 6,0 6,0 7,1 5,2 6,0 6,0 6,0 6,0 6,0 4,-4 6,0 5,-1 5,-1 6,0 6,0 6,0 6,-1 6,0 5,-2 7,0 5,-2 5,-1 5,-1 6,0 5,-1 6,0 6,0 5,-2 5,-1 6,0 5,-2 5,-1 6,0 6,0 6,0 6,0 6,0 6,0 6,0 6,0 5,1 6,0 6,0 6,0 6,0 5,1 6,0 6,0 6,0 5,1 7,0 6,0 6,0 6,0 6,0 6,0 6,0 7,0 6,0 6,0 7,0 5,-1 6,0 7,0 6,0 5,-1 6,0 6,0 6,0 8,0 6,0 5,-3 7,0 5,-2 6,-3 5,-1 7,-1 5,-1 6,-1 5,-2 6,0 m-34,48 l1,0 m-104,-139 l-2,3 -2,5 -4,5 -4,4 -4,5 -4,5 -5,3 -5,4 -4,4 -4,4 -4,4 -2,5 -4,4 -4,4 -4,4 -4,5 -4,5 -3,5 -5,4 -4,6 -3,5 -4,5 m83,-100 l2,3 2,5 0,6 0,6 0,6 -1,6 -1,6 0,6 -1,5 0,6 -2,5 -2,5 -1,5 -1,5 -1,5 -1,5 0,6 -1,5 m46,-63 l1,3 -1,5 -1,6 0,6 0,6 -1,5 -1,5 4,4 6,0 6,0 5,-1 5,-2 5,-2 3,-5 0,-7 0,-6 -1,-5 -1,-5 -5,-3 -5,-1 -6,0 m12,-8 l-1,2 -5,1 -6,0 -5,1 m8,3 l1,0 0,6 0,6 0,6 0,6 -1,5 m-9,-18 l-2,3 5,2 5,2 6,0 6,0 6,0 6,-1 m-277,-18 1,0 l0,0 m1,5 l0,0 m4,0 l1,-1 m0,-5 l-1,0 -5,-3 -1,-5 -4,-4 -5,2 -4,4 -2,5 -5,2 -5,1 0,6 5,3 6,0 5,2 6,0 6,0 m4,-10 l2,-1 6,-1 6,0 -2,5 -5,3 -6,0 m199,68 l-1,0 m-215,-69 l-5,2 -3,5 0,6 5,3 6,0 5,-3 3,-5 m0,-1 l0,-5 -4,-4 m11,-5 l-4,0 m-1,0 l-5,0 -5,3 m-7,25 l4,2 -5,3 -1,5 0,6 4,5 6,-1 3,-5 4,-5 0,-6 m235,46 -278,-43 l4,4 6,0 5,-1 6,0 6,0 m21,-10 l2,1 6,1 6,-2 5,-2 m-14,-26 0,0 -3,34 l-2,0 -5,3 -2,7 -2,5 5,2 5,4 4,4 3,5 4,4 m-31,-12 l0,3 -2,5 -5,4 -4,4 1,-6 2,-5 4,-4 4,-5 5,-4 m224,-119 l1,3 -3,5 -4,4 -4,4 -1,5 0,7 0,6 0,6 m5,-29 l0,-3 5,1 6,0 5,-1 2,5 0,6 0,6 -1,5 -1,6 m14,-33 0,0 l0,0 m-1,-1 l-4,0 -3,5 -2,5 5,2 6,0 3,-5 m229,82 -229,-85 l0,2 1,5 5,4 m1,-21 l1,2 5,3 7,0 m115,99 1,1 -131,-105 l-3,0 6,-2 m-3,21 l5,-2 m275,316 -290,-317 l1,5 2,5 -1,6 m-5,-31 l-1,1 -4,-4 -4,-4 m32,1 l-2,3 -4,4 -5,3 m4,-6 l-1,1 -4,4 -5,1 m-22,35 l-3,1 m-13,6 l2,2 5,1 6,0 6,0 6,0 6,0 5,1 6,0 6,0 5,2 5,2 5,1 5,1 5,1 5,1 5,1 5,1 6,0 6,0 6,0 5,-1 0,-7 0,-6 0,-6 m4,5 l-2,-4 0,-6 -3,-5 -4,-4 -6,0 -6,0 0,-6 -1,-5 -6,0 -5,1 -5,3 -5,2 -5,3 -5,1 -2,6 -1,6 0,6 0,6 m53,11 l-2,0 1,5 0,6 0,6 0,6 0,6 0,6 0,6 2,6 0,6 0,7 0,6 -1,5 -5,2 m-50,-84 l-3,3 0,6 0,6 m7,-15 l0,-4 1,5 0,6 0,7 -1,6 -3,-5 -1,-5 m53,64 3,-5 l1,1 -1,7 0,7 m8,9 l0,2 -1,6 -1,5 -2,6 -2,5 -3,5 -4,5 -2,6 -3,5 -3,5 -1,6 -1,7 -1,6 -2,5 -2,5 -4,6 -2,5 -3,6 -2,5 -3,6 -3,5 -5,5 -3,5 -4,5 -2,5 -4,4 -3,5 -3,5 -3,5 -5,3 -5,3 -6,2 -5,1 -6,0 -6,0 -5,1 -7,0 -6,0 -6,1 -5,2 -5,2 -5,1 -5,1 -5,1 -6,1 -6,0 -7,0 -6,0 -6,1 -6,0 -7,0 -6,0 -6,0 -7,0 -6,0 -7,0 -7,0 -6,0 m-7,0 l0,0 -7,0 -7,0 -8,-1 -6,-1 -5,-2 -5,-2 -6,-3 -6,-2 -5,-3 -5,-4 m-2,-1 l-4,-2 -4,-4 -4,-4 -5,-3 -5,-5 -5,-4 -5,-7 -6,-6 -3,-5 -3,-5 -3,-5 -4,-6 -3,-5 -3,-6 -4,-4 -3,-5 -1,-5 -4,-6 -4,-6 -2,-5 -2,-5 -2,-5 -2,-5 -3,-5 -2,-5 -4,-4 m-5,-19 0,0 0,-1 l0,0 5,-5 1,5 1,5 0,6 m20,-11 l0,5 m11,-10 l-1,1 -4,5 -1,5 -1,5 -1,5 -4,4 m125,-40 l-2,-1 2,5 m3,2 3,-5 l0,4 0,6 0,6 m46,-11 l-1,3 -2,5 m81,-16 l0,3 0,6 0,7 0,6 m-18,-19 l3,0 7,0 5,1 0,6 -1,5 -1,6 -1,5 m-70,-24 l1,1 2,5 0,6 -5,4 -3,5')); + // doodles.push(new Doodle('M317,155.5 l-69.28203230275511,119.99999999999994 138.56406460551017,1.1368683772161603e-13 -69.28203230275506,-120.00000000000006',{height:30,twist:2,scale:.5})); + // doodles.push(new Doodle('M317,155.5 l-69.28203230275511,119.99999999999994 138.56406460551017,1.1368683772161603e-13 -69.28203230275506,-120.00000000000006',{height:50,twist:2,scale:1})); + // doodles.push(new Doodle('M317,155.5 l-47.02282018339781,15.278640450004218 -29.06170112021448,39.99999999999997 0,49.44271909999159 29.061701120214423,40 47.02282018339787,15.278640450004218 47.02282018339781,-15.278640450004218 29.06170112021448,-39.99999999999994 0,-49.44271909999162 -29.061701120214423,-40 -47.02282018339787,-15.278640450004218',{height:50,twist:2,scale:1})); viewer.setDoodles(doodles); - - // } + // printPreview.draw(); } function updateStatus() { + if (API.getBusy()) { + setTimeout(updateStatus,1000); //API call in progress, try again later. + return; + } + infoAPI.status(function(data) { // console.log(data,printerAPI.totalLinesAtStart); var buffer_progress = Math.round(data["buffered_lines"] / printerAPI.totalLinesAtStart * 100 * 100) / 100; @@ -75,53 +75,56 @@ var app = function() { } function onBtnStop() { - - configAPI.getSetting('printer.endcode',function(endcode) { + configAPI.getEndCode(function(endcode) { printerAPI.stop(endcode,function(data) { console.log('stop success',data); }) }); } - function onBtnPrepare() { - console.log('onBtnPrepare'); - - var gcode = d2g.generate(doodles); + function onBtnExtrude() { + var gcode = "G92 E0\nG1 F200 E20"; + printerAPI.print(gcode,true,true,function() { + console.log('done'); + }); + } + function preparePrint(cb) { configAPI.getStartCode(function(startcode) { configAPI.getEndCode(function(endcode) { - - var combined = startcode + "\n" + gcode + "\n" + endcode; - - $('')[0].click(); + var gcode = startcode + "\n" + d2g.generate(doodles) + "\n" + endcode; + if (cb) cb(gcode); }) }); + } - // // printerAPI.print(combined,true,true,function() { - // // console.log('done'); - // // }); - - // }); - // }); - - + function onBtnDownload() { + console.log('onBtnDownload'); + + preparePrint(function(gcode) { + $('')[0].click(); + }); } function onBtnPrint() { - var file = document.querySelector('input[type=file]').files[0]; - var reader = new FileReader(); - - reader.onloadend = function() { - var gcode = reader.result; + preparePrint(function(gcode) { printerAPI.print(gcode,true,true,function() { console.log('done'); }); - } + }) - if (file) { - reader.readAsText(file); - } + // var file = document.querySelector('input[type=file]').files[0]; + // var reader = new FileReader(); + // reader.onloadend = function() { + // var gcode = reader.result; + // printerAPI.print(gcode,true,true,function() { + // console.log('done'); + // }); + // } + // if (file) { + // reader.readAsText(file); + // } } function onLogoClick() {