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