Scaling Groups?
dfepstein at comcast.net
dfepstein at comcast.net
Fri Dec 11 13:10:35 EST 2009
Before I go off and try to reinvent the wheel, does anyone have a script
that will proportionally scale objects within a group relative to each
other?
Scott Rossi has answered his own question, but FWIW here's my similar approach to the same problem. It does not assume that the scaled group stays in the same location, but it does require that the intended new rectangle of the group (not just a scaling factor) be specified--e.g., "set the groupRect of pGroup to 100,100,400,400"
David Epstein
on storeStartingGroupRects gID
-- load a custom property set of group id gID storing its rect and the rects of its members
repeat with n = 1 to the number of controls in group id gID
set the startingRects[n] of group id gID to the rect of control n of group id gID
end repeat
set the startingRects[0] of group id gID to the rect of group id gID
end storeStartingGroupRects
setProp groupRect r
-- target group's new rect is r; set its members' rects accordingly
put the short id of the target into gID
if the startingRects[0] of group id gID is not empty then
repeat with n = 1 to the number of controls in group id gID
set the rect of control n of group id gID to scaledRect(the startingRects[n] of group id gID,the startingRects[0] of group id gID,r)
end repeat
end if
end groupRect
function scaledRect rA,rB,rY
-- return a rectangle "rX" whose position and size relative to rY is the same as rA's position relative to rB
repeat for each char k in "12"
put comma & relativeF(item k of rA,item k of rY,item k+2 of rY,item k of rB,item k+2 of rB) after hold
end repeat
repeat for each char k in "34"
put comma & relativeF(item k of rA,item k-2 of rY,item k of rY,item k-2 of rB,item k of rB) after hold
end repeat
return char 2 to -1 of hold
end scaledRect
function relativef q,e,g,p,r
-- return value "f" whose value relative to e and g is the same as q's value relative to p and r (rounded)
return round(e+(q-p)/(r-p)*(g-e))
end relativeF
More information about the use-livecode
mailing list