proof of concept works. performance is horrible....

dev-2.0-svg
Michael Aschauer 2017-01-20 13:14:35 +01:00
rodzic 32ddc734c0
commit ee1f01d48d
9 zmienionych plików z 196 dodań i 2957 usunięć

Wyświetl plik

@ -57,7 +57,6 @@
position:absolute;right:0;bottom:0;width:480px;height:360px; position:absolute;right:0;bottom:0;width:480px;height:360px;
border:1px solid #c0c0c0"></canvas> border:1px solid #c0c0c0"></canvas>
<div id="svg2" style="background:white;font-size:60%;position:absolute; <div id="svg2" style="background:white;font-size:60%;position:absolute;
position:absolute;right:0;bottom:0;width:480px;height:360px; position:absolute;right:0;bottom:0;width:480px;height:360px;
border:1px solid #c0c0c0" ></div> border:1px solid #c0c0c0" ></div>

Wyświetl plik

@ -68,6 +68,11 @@ IDE_Morph.prototype.buildPanes = function () {
this.createPaletteHandle(); this.createPaletteHandle();
}; };
IDE_Morph.prototype.origSetStageExtent = IDE_Morph.prototype.setStageExtent;
IDE_Morph.prototype.setStageExtent = function (aPoint) {
this.origSetStageExtent(aPoint);
turtleShepherd.setStageDimensions(aPoint.x, aPoint.y);
};
// Create contol bar - (and add custom buttons) // Create contol bar - (and add custom buttons)
IDE_Morph.prototype.createControlBar = function () { IDE_Morph.prototype.createControlBar = function () {
@ -1310,9 +1315,9 @@ IDE_Morph.prototype.createCategories = function () {
buttonHeight = myself.categories.children[0].height(), buttonHeight = myself.categories.children[0].height(),
border = 3, border = 3,
rows = Math.ceil((myself.categories.children.length) / 2), rows = Math.ceil((myself.categories.children.length) / 2),
xPadding = (myself.categories.width() xPadding = (myself.categories.width() -
- border border -
- buttonWidth * 2) / 3, buttonWidth * 2) / 3,
yPadding = 2, yPadding = 2,
l = myself.categories.left(), l = myself.categories.left(),
t = myself.categories.top(), t = myself.categories.top(),
@ -1423,12 +1428,12 @@ IDE_Morph.prototype.projectMenu = function () {
menu.addLine(); menu.addLine();
menu.addItem( menu.addItem(
'Download as SVG', 'Download as SVG',
function() { myself.downloadSVG() }, function() { myself.downloadSVG(); },
'download current drawing as SVG file' 'download current drawing as SVG file'
); );
menu.addItem( menu.addItem(
'Download as EXP', 'Download as EXP',
function() { myself.downloadEXP() }, function() { myself.downloadEXP(); },
'download current drawing as EXP file' 'download current drawing as EXP file'
); );
@ -1483,27 +1488,6 @@ IDE_Morph.prototype.projectMenu = function () {
), ),
'Select categories of additional blocks to add to this project.' 'Select categories of additional blocks to add to this project.'
); );
graphicsName = 'Backgrounds';
menu.addItem(
'Backgrounds...',
createMediaMenu(
'Backgrounds',
function loadLib(file, name) {
var url = myself.resourceURL('Backgrounds', file);
img = new Image();
img.onload = function () {
var canvas = newCanvas(new Point(img.width, img.height));
canvas.getContext('2d').drawImage(img, 0, 0);
myself.droppedImageStage(canvas, name);
};
img.src = url;
}
),
'Select categories of additional blocks to add to this project.'
);
menu.popup(world, pos); menu.popup(world, pos);
}; };

Wyświetl plik

@ -1,6 +1,13 @@
/* Sprite */ /* Sprite */
// modified SpriteMorph turtlestitch functions // modified SpriteMorph turtlestitch functions
SpriteMorph.prototype.origInit = SpriteMorph.prototype.init;
SpriteMorph.prototype.init = function(globals) {
this.origInit(globals);
this.hide();
};
SpriteMorph.prototype.origForward = SpriteMorph.prototype.forward; SpriteMorph.prototype.origForward = SpriteMorph.prototype.forward;
SpriteMorph.prototype.forward = function (steps) { SpriteMorph.prototype.forward = function (steps) {
oldx = this.xPosition(); oldx = this.xPosition();
@ -16,10 +23,10 @@ SpriteMorph.prototype.origGotoXY = SpriteMorph.prototype.gotoXY;
SpriteMorph.prototype.gotoXY = function (x, y, justMe) { SpriteMorph.prototype.gotoXY = function (x, y, justMe) {
oldx = this.xPosition(); oldx = this.xPosition();
oldy = this.yPosition(); oldy = this.yPosition();
console.log("jump in place - don't add.");
this.origGotoXY(x, y, justMe); this.origGotoXY(x, y, justMe);
if ( Math.abs(this.xPosition()-oldx)<=1 && Math.abs(this.yPosition()-oldy)<=1 ) { if ( Math.abs(this.xPosition()-oldx)<=1 && Math.abs(this.yPosition()-oldy)<=1 ) {
console.log("jump in place - don't add."); // jump in place - don't add.
if (DEBUG) turtleShepherd.debug_msg("jump in place - don't add");
} else { } else {
if (!turtleShepherd.hasSteps()) if (!turtleShepherd.hasSteps())
turtleShepherd.initPosition(oldx, oldy); turtleShepherd.initPosition(oldx, oldy);
@ -32,14 +39,18 @@ SpriteMorph.prototype.origClear = SpriteMorph.prototype.clear;
SpriteMorph.prototype.clear = function () { SpriteMorph.prototype.clear = function () {
this.origClear(); this.origClear();
turtleShepherd.clear(); turtleShepherd.clear();
//this.changed();
this.reRender(); this.reRender();
}; };
SpriteMorph.prototype.reRender = function () { SpriteMorph.prototype.reRender = function () {
this.parent.clearPenTrails(); //this.changed();
turtleShepherd.reRender(this.parent.penTrails()); turtleShepherd.reRender(this.parent.penTrails());
this.hide();
this.changed();
}; };
/* Stage */ /* Stage */
// modified StageMorph turtlestitch functions // modified StageMorph turtlestitch functions
@ -51,6 +62,140 @@ StageMorph.prototype.mouseScroll = function (y, x) {
turtleShepherd.zoomIn(); turtleShepherd.zoomIn();
} }
this.clearPenTrails(); this.reRender();
reDraw(this.penTrails()); this.changed();
}; };
StageMorph.prototype.reRender = function () {
//this.changed();
turtleShepherd.reRender(this.penTrails());
//this.changed();
};
StageMorph.prototype.originalSetScale = StageMorph.prototype.setScale;
StageMorph.prototype.setScale = function (number) {
this.scaleChanged = true;
this.originalSetScale(number);
if (DEBUG) turtleShepherd.debug_msg("scale stage to "+ number );
if (DEBUG) turtleShepherd.debug_msg("stage dimensions " +
this.extent().x + " " +
this.extent().y);
if (DEBUG) turtleShepherd.debug_msg("stage position " +
this.position().x + " " +
this.position().y);
turtleShepherd.setStageDimensions(this.extent().x, this.extent().y);
turtleShepherd.setStagePosition(this.position().x, this.position().y);
//this.resizePenTrails();
this.changed();
this.reRender();
};
StageMorph.prototype.resizePenTrails = function () {
this.trailsCanvas = newCanvas(new Point(this.extent().x,this.extent().y));
this.changed();
};
StageMorph.prototype.originalDrawOn = StageMorph.prototype.drawOn;
/*
StageMorph.prototype.drawOn = function (aCanvas, aRect) {
if (DEBUG) turtleShepherd.debug_msg("draw on stage");
//turtleShepherd.reRender(this.penTrails());
c = this.penTrails().getContext('2d');
c.drawSvg(turtleShepherd.toSVG(), 0, 0, aCanvas.width, aCanvas.height);
return this.originalDrawOn(aCanvas, aRect);
};*
/* from beetleblocks */
/*
// StageMorph drawing
StageMorph.prototype.originalDrawOn = StageMorph.prototype.drawOn;
StageMorph.prototype.drawOn = function (aCanvas, aRect) {
// If the scale is lower than 1, we reuse the original method,
// otherwise we need to modify the renderer dimensions
// we do not need to render the original canvas anymore because
// we have removed sprites and backgrounds
var rectangle, area, delta, src, context, w, h, sl, st;
if (!this.isVisible) {
return null;
}
if (this.scale < 1) {
return this.originalDrawOn(aCanvas, aRect);
}
rectangle = aRect || this.bounds;
area = rectangle.intersect(this.bounds).round();
if (area.extent().gt(new Point(0, 0))) {
delta = this.position().neg();
src = area.copy().translateBy(delta).round();
context = aCanvas.getContext('2d');
context.globalAlpha = this.alpha;
sl = src.left();
st = src.top();
w = Math.min(src.width(), this.image.width - sl);
h = Math.min(src.height(), this.image.height - st);
if (w < 1 || h < 1) {
return null;
}
context.save();
if (this.scaleChanged) {
w = this.width();
h = this.height();
this.scaleChanged = false;
this.reRender();
}
context.drawImage(
this.penTrails(),
src.left() / this.scale,
src.top() / this.scale,
w,
h,
area.left() / this.scale,
area.top() / this.scale,
w,
h
);
context.restore();
}
};
*/
/*
StageMorph.prototype.originalSetScale = StageMorph.prototype.setScale;
StageMorph.prototype.setScale = function (number) {
this.scaleChanged = true;
this.originalSetScale(number);
};
// Contextual menu
StageMorph.prototype.userMenu = function () {
var ide = this.parentThatIsA(IDE_Morph),
menu = new MenuMorph(this),
shiftClicked = this.world().currentKey === 16,
myself = this;
if (ide && ide.isAppMode) {
menu.hide();
return menu;
}
menu.addItem(
'pic...',
function () {
window.open(myself.fullImageClassic().toDataURL());
},
'open a new window\nwith a picture of the scene'
);
return menu;
};
*/

Wyświetl plik

@ -1,402 +0,0 @@
// Stitchode's main changes and addtions to snap! go in here
// sorry it lacks proper documentation
var tStitch = {};
tStitch.debug = true;
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;
if (url.lastIndexOf('#') > 0) {
url = url.substring(0, url.lastIndexOf('#'));
}
url = url.substring(0, url.lastIndexOf('/'));
return url + "/";
}
tStitch.stitches = {};
tStitch.stitches.x = new Array();
tStitch.stitches.y = new Array();
tStitch.stitches.jump = new Array();
tStitch.isFirst = function() {
if (tStitch.stitches.x.length > 0)
return false;
else
return true;
}
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 + "adding Point (" + x + "," + y;
if (jump) s = s + ",jump";
s+= ")";
console.log(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.signup = function() {
window.open('http://' + window.location.hostname + '/signup');
}
tStitch.upload = function(name) {
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, "name":name };
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;
oldpos = this.position();
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;
if (tStitch.isFirst()) {
origx = oldpos.x - this.parent.topLeft().x;
origy = oldpos.y - this.parent.topLeft().y;
tStitch.addPoint(origx , origy ,true);
//alert("first");
//alert("orig: " + origx + "," + origy+ " tx/ty: " + tx + ", "+ ty + " - "+ this.position());
}
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;
oldX = this.position().x / stage.scale - stage.center().x + this.extent().x/2;
oldY = -(this.position().y / stage.scale - stage.center().y + this.extent().y/2);
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;
if ( Math.abs(x-oldX)<=1.1 && Math.abs(y-oldY)<=1.1 ) {
if (tStitch.debug)
console.log("jump in place - don't add.");
} else {
if (tStitch.debug)
console.log("gotoXY "+ x + "," + y + " from: + " + oldX + "," + oldY);
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'
*/

Wyświetl plik

@ -1,146 +0,0 @@
// Stitchode's main changes and addtions to snap! go in here
// sorry it lacks proper documentation
var tStitch = {};
tStitch.debug = true;
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;
if (url.lastIndexOf('#') > 0) {
url = url.substring(0, url.lastIndexOf('#'));
}
url = url.substring(0, url.lastIndexOf('/'));
return url + "/";
};
tStitch.stitches = {};
tStitch.stitches.x = [];
tStitch.stitches.y = [];
tStitch.stitches.jump = [];
tStitch.isFirst = function() {
if (tStitch.stitches.x.length > 0)
return false;
else
return true;
};
tStitch.clearPoints = function() {
tStitch.stitches.x = [];
tStitch.stitches.y = [];
tStitch.stitches.jump = [];
};
tStitch.addPoint = function (x,y,jump) {
if (tStitch.debug) {
s = new String();
s = s + "adding Point (" + x + "," + y;
if (jump) s = s + ",jump";
s+= ")";
console.log(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.signup = function() {
window.open('http://' + window.location.hostname + '/signup');
};
tStitch.upload = function(name) {
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, "name":name };
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
}); */
};
IDE_Morph.prototype.uploadStitches = function () {
tStitch.upload();
};

Wyświetl plik

@ -1,21 +0,0 @@
var tstools = {};
tstools.getBaseURL = function () {
var url = location.href; // entire url including querystring - also: window.location.href;
if (url.lastIndexOf('#') > 0) {
url = url.substring(0, url.lastIndexOf('#'));
}
url = url.substring(0, url.lastIndexOf('/'));
return url + "/";
};
tstools.debug_msg = function (st, clear=false) {
o = new String();
if (!clear) {
o = document.getElementById("debug").innerHTML;
} else {
o = "";
}
o = st + "<br />" + o;
document.getElementById("debug").innerHTML = o;
};

Wyświetl plik

@ -6,7 +6,10 @@
*/ */
function TurtleShepherd() { function TurtleShepherd() {
this.w = 480;
this.h = 360;
this.clear(); this.clear();
this.gridSize = 50;
} }
TurtleShepherd.prototype.clear = function() { TurtleShepherd.prototype.clear = function() {
@ -18,8 +21,6 @@ TurtleShepherd.prototype.clear = function() {
this.steps = 0; this.steps = 0;
this.initX = 0; this.initX = 0;
this.initY = 0; this.initY = 0;
this.w = 480;
this.h = 360;
this.scale = 1; this.scale = 1;
}; };
@ -85,16 +86,30 @@ TurtleShepherd.prototype.zoomOut = function() {
if (DEBUG) this.debug_msg("zoom to scale "+ this.scale ); if (DEBUG) this.debug_msg("zoom to scale "+ this.scale );
}; };
TurtleShepherd.prototype.setDimensions = function(x,y) { TurtleShepherd.prototype.setStageDimensions = function(w,h) {
this.w = x; this.w = w;
this.h = y; this.h = h;
/*
document.getElementById("svg2").style.left = x + "px";
document.getElementById("svg2").style.top = y+ "px";
*/
document.getElementById("svg2").style.width = w + "px";
document.getElementById("svg2").style.height = h + "px";
document.getElementById("svg2").style.right = "0";
document.getElementById("svg2").style.bottom = "0";
};
TurtleShepherd.prototype.setStagePosition = function(x,y) {
//document.getElementById("svg2").style.top = y + "px";
//document.getElementById("svg2").style.left = x + "px";
}; };
TurtleShepherd.prototype.renderGrid = function(size=50) { TurtleShepherd.prototype.renderGrid = function(size) {
return '<defs>\n' + size = this.gridSize;
'<pattern id="grid" width="'+size+'" height="'+size+'" patternUnits="userSpaceOnUse">\n' + return '<defs>' +
'<path d="M '+size+' 0 L 0 0 0 '+size+'" fill="none" stroke="gray" stroke-width="0.5"/>\n' + '<pattern id="grid" width="'+size+'" height="'+size+'" patternUnits="userSpaceOnUse">' +
'<path d="M '+size+' 0 L 0 0 0 '+size+'" fill="none" stroke="gray" stroke-width="0.5"/>' +
'</pattern>' + '</pattern>' +
'</defs>\n'; '</defs>\n';
}; };
@ -103,7 +118,7 @@ TurtleShepherd.prototype.toSVG = function() {
//var svgStr = "<?xml version=\"1.0\" standalone=\"no\"?>\n"; //var svgStr = "<?xml version=\"1.0\" standalone=\"no\"?>\n";
//svgStr += "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \n\"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n"; //svgStr += "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \n\"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n";
svgStr = '<svg width="' + this.w +'" height="' +this.h + '"' + svgStr = '<svg width="' +this.w + '" height="' +this.h + '"' +
' viewBox="' + (-1 * this.w / 2 * this.scale) + ' ' + ' viewBox="' + (-1 * this.w / 2 * this.scale) + ' ' +
(-1 * this.h / 2 * this.scale) + ' ' + (-1 * this.h / 2 * this.scale) + ' ' +
(this.w* this.scale) + ' ' + (this.w* this.scale) + ' ' +
@ -182,18 +197,20 @@ TurtleShepherd.prototype.toSVG = function() {
TurtleShepherd.prototype.reRender = function(cnv) { TurtleShepherd.prototype.reRender = function(cnv) {
//load a svg snippet in the canvas with id = 'svg' //load a svg snippet in the canvas with id = 'svg'
canvas = document.getElementById('svg'); //canvas = document.getElementById('svg');
document.getElementById("code").innerHTML = turtleShepherd.toSVG(); document.getElementById("code").innerHTML = turtleShepherd.toSVG();
document.getElementById("svg2").innerHTML = turtleShepherd.toSVG(); document.getElementById("svg2").innerHTML = turtleShepherd.toSVG();
//canvg(document.getElementById('svg'), cmdCache.toSVG()); //canvg(document.getElementById('svg'), turtleShepherd.toSVG());
//canvg(cnv, cmdCache.toSVG()); canvg(cnv, turtleShepherd.toSVG());
//var cnv = caller.parent.penTrails(); //var cnv = caller.parent.penTrails();
//var ctx = cnv.getContext('2d'); //alert(cnv);
//ctx.drawSvg(cmdCache.toSVG(), 0, 0, cnv.width, cnv.height); //if (cnv) {
// var ctx = cnv.getContext('2d');
} // ctx.drawSvg(turtleShepherd.toSVG(), 0, 0, cnv.width, cnv.height);
//}
};
TurtleShepherd.prototype.debug_msg = function (st, clear) { TurtleShepherd.prototype.debug_msg = function (st, clear) {
o = ""; o = "";

Wyświetl plik

@ -4,9 +4,9 @@ DEBUG = true;
function reDraw(cnv) { function reDraw(cnv) {
//load a svg snippet in the canvas with id = 'svg' //load a svg snippet in the canvas with id = 'svg'
canvas = document.getElementById('svg'); //canvas = document.getElementById('svg');
//document.getElementById("code").innerHTML = cmdCache.toSVG(); //document.getElementById("code").innerHTML = cmdCache.toSVG();
document.getElementById("svg2").innerHTML = turtleShepherd.toSVG(); // document.getElementById("svg2").innerHTML = turtleShepherd.toSVG();
//canvg(document.getElementById('svg'), cmdCache.toSVG()); //canvg(document.getElementById('svg'), cmdCache.toSVG());
//canvg(cnv, cmdCache.toSVG()); //canvg(cnv, cmdCache.toSVG());