transformlist branch: fix scaling or rotated elements
git-svn-id: http://svg-edit.googlecode.com/svn/branches/transformlist@900 eee81c28-f429-11dd-99c0-75d572ba1dddmaster
parent
f9b4b0a647
commit
85d35b6cbd
|
@ -1,9 +1,8 @@
|
||||||
/*
|
/*
|
||||||
TODOs for TransformList:
|
TODOs for TransformList:
|
||||||
|
|
||||||
* Fix moving/resizing/rotating of groups (pummel the transforms down to the children?)
|
|
||||||
* Fix rotation transforms after scaling
|
|
||||||
* Fix proper selector box sizing
|
* Fix proper selector box sizing
|
||||||
|
* Fix moving/resizing/rotating of groups (pummel the transforms down to the children?)
|
||||||
* Ensure resizing in negative direction works
|
* Ensure resizing in negative direction works
|
||||||
* Ensure ungrouping works
|
* Ensure ungrouping works
|
||||||
* Ensure undo still works properly
|
* Ensure undo still works properly
|
||||||
|
@ -1313,11 +1312,13 @@ function BatchCommand(text) {
|
||||||
|
|
||||||
// reduce the transform list here...
|
// reduce the transform list here...
|
||||||
var box = canvas.getBBox(selected);
|
var box = canvas.getBBox(selected);
|
||||||
var newcenter = {x: (box.x+box.width/2), y: (box.y+box.height/2)};
|
var origcenter = {x: (box.x+box.width/2), y: (box.y+box.height/2)};
|
||||||
|
var newcenter = {x: origcenter.x, y: origcenter.y};
|
||||||
var currentMatrix = {a:1, b:0, c:0, d:1, e:0, f:0};
|
var currentMatrix = {a:1, b:0, c:0, d:1, e:0, f:0};
|
||||||
var n = tlist.numberOfItems;
|
var n = tlist.numberOfItems;
|
||||||
var tx = 0, ty = 0, sx = 1, sy = 1, r = 0.0;
|
var tx = 0, ty = 0, sx = 1, sy = 1, r = 0.0;
|
||||||
while (n--) {
|
while (n--) {
|
||||||
|
var bRemoveTransform = true;
|
||||||
var xform = tlist.getItem(n);
|
var xform = tlist.getItem(n);
|
||||||
var m = xform.matrix;
|
var m = xform.matrix;
|
||||||
// if translate...
|
// if translate...
|
||||||
|
@ -1334,14 +1335,43 @@ function BatchCommand(text) {
|
||||||
scaleh = function(h) { return m.d * h; }
|
scaleh = function(h) { return m.d * h; }
|
||||||
break;
|
break;
|
||||||
case 4: // ROTATE
|
case 4: // ROTATE
|
||||||
// TODO: re-center the rotation and then continue (we cannot reduce a rotate)
|
// if the new center of the shape has moved, then
|
||||||
var newrot = svgroot.createSVGTransform();
|
// re-center the rotation, and determine the movement
|
||||||
newrot.setRotate(xform.angle, newcenter.x, newcenter.y);
|
// offset required to keep the shape in the same place
|
||||||
// tlist.replaceItem(newrot, n);
|
if (origcenter.x != newcenter.x || origcenter.y != newcenter.y) {
|
||||||
|
var alpha = xform.angle * Math.PI / 180.0;
|
||||||
|
|
||||||
|
// determine where the new rotated center should be
|
||||||
|
var dx = newcenter.x - origcenter.x,
|
||||||
|
dy = newcenter.y - origcenter.y,
|
||||||
|
r = Math.sqrt(dx*dx + dy*dy),
|
||||||
|
theta = Math.atan2(dy,dx) + alpha;
|
||||||
|
var cx = r * Math.cos(theta) + origcenter.x,
|
||||||
|
cy = r * Math.sin(theta) + origcenter.y;
|
||||||
|
|
||||||
|
dx = cx - newcenter.x;
|
||||||
|
dy = cy - newcenter.y;
|
||||||
|
|
||||||
|
// TODO: fix this so that it determines the true translation
|
||||||
|
// required so that the rotational center lines up
|
||||||
|
remap = function(x,y) {
|
||||||
|
return { x: x + dx, y: y + dy };
|
||||||
|
};
|
||||||
|
scalew = function(w) { return w; }
|
||||||
|
scaleh = function(h) { return h; }
|
||||||
|
|
||||||
|
bRemoveTransform = false;
|
||||||
|
var newrot = svgroot.createSVGTransform();
|
||||||
|
newrot.setRotate(xform.angle, cx, cy);
|
||||||
|
tlist.replaceItem(newrot, n);
|
||||||
|
}
|
||||||
|
break;
|
||||||
// fall through to the default: continue below
|
// fall through to the default: continue below
|
||||||
default:
|
default:
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (!remap) continue;
|
||||||
|
|
||||||
newcenter = remap(box.x+box.width/2, box.y+box.height/2);
|
newcenter = remap(box.x+box.width/2, box.y+box.height/2);
|
||||||
var bpt = remap(box.x,box.y);
|
var bpt = remap(box.x,box.y);
|
||||||
box.x = bpt.x;
|
box.x = bpt.x;
|
||||||
|
@ -1363,7 +1393,6 @@ function BatchCommand(text) {
|
||||||
var pt = remap(childBox.x,childBox.y),
|
var pt = remap(childBox.x,childBox.y),
|
||||||
w = scalew(childBox.width),
|
w = scalew(childBox.width),
|
||||||
h = scaleh(childBox.height);
|
h = scaleh(childBox.height);
|
||||||
console.log([pt.x,pt.y,w,h]);
|
|
||||||
childBox.x = pt.x; childBox.y = pt.y;
|
childBox.x = pt.x; childBox.y = pt.y;
|
||||||
childBox.width = w; childBox.height = h;
|
childBox.width = w; childBox.height = h;
|
||||||
batchCmd.addSubCommand(recalculateDimensions(child, childBox));
|
batchCmd.addSubCommand(recalculateDimensions(child, childBox));
|
||||||
|
@ -1392,7 +1421,6 @@ function BatchCommand(text) {
|
||||||
changes["cy"] = c.y;
|
changes["cy"] = c.y;
|
||||||
changes["rx"] = scalew(changes["rx"]);
|
changes["rx"] = scalew(changes["rx"]);
|
||||||
changes["ry"] = scaleh(changes["ry"]);
|
changes["ry"] = scaleh(changes["ry"]);
|
||||||
console.log(changes);
|
|
||||||
break;
|
break;
|
||||||
case "rect":
|
case "rect":
|
||||||
case "image":
|
case "image":
|
||||||
|
@ -1456,7 +1484,9 @@ function BatchCommand(text) {
|
||||||
} // switch on element type to get initial values
|
} // switch on element type to get initial values
|
||||||
|
|
||||||
// we have eliminated the transform, so remove it from the list
|
// we have eliminated the transform, so remove it from the list
|
||||||
tlist.removeItem(n);
|
if (bRemoveTransform) {
|
||||||
|
tlist.removeItem(n);
|
||||||
|
}
|
||||||
|
|
||||||
// now loop through the other transforms and adjust accordingly
|
// now loop through the other transforms and adjust accordingly
|
||||||
for ( var j = n; j < tlist.numberOfItems; ++j) {
|
for ( var j = n; j < tlist.numberOfItems; ++j) {
|
||||||
|
@ -2096,7 +2126,6 @@ function BatchCommand(text) {
|
||||||
else if(griptype == "selectorGrip_resize_") {
|
else if(griptype == "selectorGrip_resize_") {
|
||||||
current_mode = "resize";
|
current_mode = "resize";
|
||||||
current_resize_mode = gripid.substr(20,gripid.indexOf("_",20)-20);
|
current_resize_mode = gripid.substr(20,gripid.indexOf("_",20)-20);
|
||||||
console.log(current_resize_mode);
|
|
||||||
}
|
}
|
||||||
mouse_target = selectedElements[0];
|
mouse_target = selectedElements[0];
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue