// Stitchode's main changes and addtions to snap! go in here // sorry it lacks proper documentation var tStitch = {}; tStitch.draw_jumps = true; tStitch.draw_stitches = true; tStitch.draw_stitch_len = 2; tStitch.debug_msg = function (st,clear) { o = new String(); if (!clear) { o = document.getElementById("bug").innerHTML; } else { o = ""; } o += st; document.getElementById("bug").innerHTML = o; } tStitch.getBaseURL = function () { var url = location.href; // entire url including querystring - also: window.location.href; var baseURL = url.substring(0, url.lastIndexOf('/')); return baseURL + "/"; } tStitch.debug = true; tStitch.stitches = {}; tStitch.stitches.x = new Array(); tStitch.stitches.y = new Array(); tStitch.stitches.jump = new Array(); tStitch.clearPoints = function() { tStitch.stitches.x = new Array(); tStitch.stitches.y = new Array(); tStitch.stitches.jump = new Array(); } tStitch.addPoint = function (x,y,jump) { if (tStitch.debug) { s = new String(); s = s + "(" + x + "," + y; if (jump) s = s + ",jump"; s+= ")"; tStitch.debug_msg(s); } if (tStitch.stitches.x[tStitch.stitches.x.length-1] == x && tStitch.stitches.y[tStitch.stitches.y.length-1] == y ) { //alert("pint exist"); } else { tStitch.stitches.x.push(x); tStitch.stitches.y.push(y); tStitch.stitches.jump.push(jump); } } tStitch.toogleShowStitches = function() { tStitch.draw_stitches = !tStitch.draw_stitches; } tStitch.getShowStitches = function() { return tStitch.draw_stitches; } tStitch.toogleShowJumpStitches = function() { tStitch.draw_jumps = !tStitch.draw_jumps; } tStitch.getShowJumpStitches = function() { return tStitch.draw_jumps; } tStitch.upload = function() { tStitch.debug_msg("uploading points... sending SAVE with num points= " + tStitch.stitches.x.length, true); params = { "x[]": tStitch.stitches.x, "y[]":tStitch.stitches.y, "j[]":tStitch.stitches.jump }; if (tStitch.stitches.x.length <= 1 || tStitch.stitches.y <= 1) { new DialogBoxMorph().inform( 'Upload Error', 'No stitches to upload, please (re)generate a drawing first!', world); } else { $.post( "/upload", data = params, successCallback = function (data) { if (data!="ERROR") { /*new DialogBoxMorph().inform( 'Upload Success', 'Your embroidery file is ready and will be available at this url:\n' + window.location.hostname + '/view/'+data,'\n', world);*/ window.open('http://' + window.location.hostname + '/view/'+data, 'TurtleStitch file preview'); } else { new DialogBoxMorph().inform( 'Upload Error', 'Sorry! Upload failed for an unknown reason', world); } }); } /* $.fileDownload(tStitch.getBaseURL() +"stitchcode/backend/save.py", { successCallback: function (html, url) { alert("DSD"); }, failCallback: function (html, url) { alert( 'Your file download just failed for this URL:' + url + '\r\n' + 'Here was the resulting error HTML: \r\n' + html ); }, httpMethod: "POST", data: params }); */ } /* Sprite */ // modified SpriteMorph turtle functions // SpriteMorph motion primitives SpriteMorph.prototype.forward = function (steps) { var dest, dist = steps * this.parent.scale || 0; if (dist >= 0) { dest = this.position().distanceAngle(dist, this.heading); } else { dest = this.position().distanceAngle( Math.abs(dist), (this.heading - 180) ); } this.setPosition(dest); this.positionTalkBubble(); //this.drawLineX(dest); tx = dest.x - this.parent.topLeft().x ty = dest.y - this.parent.topLeft().y tjump = !this.isDown; tStitch.addPoint(tx,ty,tjump); //alert("move to: " + tx + "x" + ty + " - isJump = " + tjump); }; SpriteMorph.prototype.gotoXY = function (x, y, justMe) { var stage = this.parentThatIsA(StageMorph), newX, newY, dest; newX = stage.center().x + (+x || 0) * stage.scale; newY = stage.center().y - (+y || 0) * stage.scale; if (this.costume) { dest = new Point(newX, newY).subtract(this.rotationOffset); } else { dest = new Point(newX, newY).subtract(this.extent().divideBy(2)); } this.setPosition(dest, justMe); this.positionTalkBubble(); tx = dest.x - this.parent.topLeft().x ty = dest.y - this.parent.topLeft().y tjump = !this.isDown; //alert("jump to: " + tx + "x" + ty); tStitch.addPoint(tx,ty,tjump); }; // SpriteMorph drawing: SpriteMorph.prototype.drawLine = function (start, dest) { var stagePos = this.parent.bounds.origin, stageScale = this.parent.scale, context = this.parent.penTrails().getContext('2d'), from = start.subtract(stagePos).divideBy(stageScale), to = dest.subtract(stagePos).divideBy(stageScale), damagedFrom = from.multiplyBy(stageScale).add(stagePos), damagedTo = to.multiplyBy(stageScale).add(stagePos), damaged = damagedFrom.rectangle(damagedTo).expandBy( Math.max(this.size * stageScale / 2, 1) ).intersect(this.parent.visibleBounds()).spread(); if (this.isDown) { context.lineWidth = this.size; context.strokeStyle = this.color.toString(); if (this.useFlatLineEnds) { context.lineCap = 'butt'; context.lineJoin = 'miter'; } else { context.lineCap = 'round'; context.lineJoin = 'round'; } context.beginPath(); context.moveTo(from.x, from.y); context.lineTo(to.x, to.y); context.stroke(); if (this.isWarped === false) { this.world().broken.push(damaged); } } }; SpriteMorph.prototype.drawJumpLine = function (start, dest) { var stagePos = this.parent.bounds.origin, stageScale = this.parent.scale, context = this.parent.penTrails().getContext('2d'), from = start.subtract(stagePos).divideBy(stageScale), to = dest.subtract(stagePos).divideBy(stageScale), damagedFrom = from.multiplyBy(stageScale).add(stagePos), damagedTo = to.multiplyBy(stageScale).add(stagePos), damaged = damagedFrom.rectangle(damagedTo).expandBy( Math.max(this.size * stageScale / 2, 1) ).intersect(this.parent.visibleBounds()).spread(); context.lineWidth = this.size; context.strokeStyle = new Color(255, 0, 0).toString(); context.lineCap = 'round'; context.lineJoin = 'round'; context.beginPath(); context.moveTo(from.x, from.y); context.lineTo(to.x, to.y); context.stroke(); if (this.isWarped === false) { this.world().broken.push(damaged); } }; SpriteMorph.prototype.drawStitch = function (dest) { //dest = dest.subtract(this.topLeft()); var s = tStitch.draw_stitch_len; var stagePos = this.parent.bounds.origin, stageScale = this.parent.scale, context = this.parent.penTrails().getContext('2d'), to = dest.subtract(stagePos).divideBy(stageScale), damagedFrom = new Point(to.x-s,to.y-s).multiplyBy(stageScale).add(stagePos), damagedTo = new Point(to.x+s,to.y+s).multiplyBy(stageScale).add(stagePos), damaged = damagedFrom.rectangle(damagedTo).expandBy( Math.max(this.size * stageScale / 2, 1) ).intersect(this.parent.visibleBounds()).spread(); context.lineWidth = this.size; context.strokeStyle = new Color(0, 0, 255).toString(); context.lineCap = 'round'; context.lineJoin = 'round'; context.beginPath(); context.moveTo(to.x - s, to.y - s ); context.lineTo(to.x + s, to.y + s); context.stroke(); context.beginPath(); context.moveTo(to.x - s, to.y + s); context.lineTo(to.x + s, to.y - s); context.stroke(); if (this.isWarped === false) { this.world().broken.push(damaged); } }; SpriteMorph.prototype.clear = function () { this.parent.clearPenTrails(); tStitch.clearPoints(); if (tStitch.debug) { tStitch.debug_msg("",true); } }; // SpriteMorph motion - adjustments due to nesting SpriteMorph.prototype.moveBy = function (delta, justMe) { // override the inherited default to make sure my parts follow // unless it's justMe (a correction) var start = this.isDown && !justMe && this.parent ? this.rotationCenter() : null; // add stitch controls if (this.parent) { if (this.parent.penTrails()) { origin = this.rotationCenter(); } } SpriteMorph.uber.moveBy.call(this, delta); // add stitch controls if (this.parent) { if (this.parent.penTrails() && origin.x > 100) { //alert(origin.x); if (tStitch.draw_stitches) { this.drawStitch(this.rotationCenter()); } if (tStitch.draw_jumps && !this.isDown) { this.drawJumpLine(origin,this.rotationCenter()); } } } if (start) { this.drawLine(start, this.rotationCenter()); } if (!justMe) { this.parts.forEach(function (part) { part.moveBy(delta); }); } }; /* // Definition of new block categories SpriteMorph.prototype.categories = [ 'motion', 'control', 'shapes', 'colors', 'sensing', 'operators', 'variables', 'lists', 'my blocks' ]; SpriteMorph.prototype.blockColor = { motion : new Color(74, 108, 212), shapes : new Color(143, 86, 227), colors : new Color(207, 74, 217), sound : new Color(207, 74, 217), // we need to keep this color for the zoom blocks dialog control : new Color(230, 168, 34), sensing : new Color(4, 148, 220), operators : new Color(98, 194, 19), variables : new Color(243, 118, 29), lists : new Color(217, 77, 17), other : new Color(150, 150, 150), 'my blocks': new Color(150, 150, 60), }; // now move also "make a block to 'my blocks' */