# Sketch script for spreading selected objects ("distribute" in XFig) # -*- encoding: iso-latin-1 -*- # (c) 2000 Michael Loßin # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Library General Public License for more details. # # You should have received a copy of the GNU Library General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # these are based on abut_*.py from Sketch import _, Point import Sketch.Scripting # spread objects horizontally (cascade left) def spread_h_casc_l(context): pos = [] for obj in context.document.SelectedObjects(): pos.append((obj.coord_rect.left, obj)) l = len(pos) - 1 if l > 1: pos.sort() left1, ob = pos[0] left2, ob = pos[-1] skip = (left2 - left1) / l next = left1 + skip for left, obj in pos[1:-1]: obj.Translate(Point(next - left, 0)) next = next + skip Sketch.Scripting.AddFunction('spread_h_casc_l', _("Spread Horizontal (cascade left)"), spread_h_casc_l, menu = _("Arrange")) # spread objects horizontally (cascade right) def spread_h_casc_r(context): pos = [] for obj in context.document.SelectedObjects(): pos.append((obj.coord_rect.right, obj)) l = len(pos) - 1 if l > 1: pos.sort() right1, ob = pos[0] right2, ob = pos[-1] skip = (right2 - right1) / l next = right1 + skip for right, obj in pos[1:-1]: obj.Translate(Point(next - right, 0)) next = next + skip Sketch.Scripting.AddFunction('spread_h_casc_r', _("Spread Horizontal (cascade right)"), spread_h_casc_r, menu = _("Arrange")) # spread objects horizontally (equidistant centers) def spread_h_center(context): pos = [] for obj in context.document.SelectedObjects(): rect = obj.coord_rect pos.append(((rect.left + rect.right) / 2, obj)) l = len(pos) - 1 if l > 1: pos.sort() center1, ob = pos[0] center2, ob = pos[-1] gap = (center2 - center1) / l next = center1 + gap for center, obj in pos[1:-1]: obj.Translate(Point(next - center, 0)) next = next + gap Sketch.Scripting.AddFunction('spread_h_center', _("Spread Horizontal (center)"), spread_h_center, menu = _("Arrange")) # spread objects horizontally (gaps/overlaps of equal width) def spread_h_bbox(context): pos = [] sum = 0 for obj in context.document.SelectedObjects(): rect = obj.coord_rect width = rect.right - rect.left pos.append((rect.left, width, obj)) sum = sum + width l = len(pos) - 1 if l > 1: pos.sort() start, width1, ob = pos[0] end, width2, ob = pos[-1] gap = (end + width2 - start - sum) / l next = start + width1 + gap for left, width, obj in pos[1:-1]: obj.Translate(Point(next - left ,0)) next = next + width + gap Sketch.Scripting.AddFunction('spread_h_bbox', _("Spread Horizontal (bbox)"), spread_h_bbox, menu = _("Arrange")) # spread objects vertically (cascade bottom) def spread_v_casc_b(context): pos = [] for obj in context.document.SelectedObjects(): pos.append((obj.coord_rect.bottom, obj)) l = len(pos) - 1 if l > 1: pos.sort() pos.reverse() bottom1, ob = pos[0] bottom2, ob = pos[-1] skip = (bottom1 - bottom2) / l next = bottom1 - skip for bottom, obj in pos[1:-1]: obj.Translate(Point(0, next - bottom)) next = next - skip Sketch.Scripting.AddFunction('spread_v_casc_b', _("Spread Vertical (cascade bottom)"), spread_v_casc_b, menu = _("Arrange")) # spread objects vertically (cascade top) def spread_v_casc_t(context): pos = [] for obj in context.document.SelectedObjects(): pos.append((obj.coord_rect.top, obj)) l = len(pos) - 1 if l > 1: pos.sort() pos.reverse() top1, ob = pos[0] top2, ob = pos[-1] skip = (top1 - top2) / l next = top1 - skip for top, obj in pos[1:-1]: obj.Translate(Point(0, next - top)) next = next - skip Sketch.Scripting.AddFunction('spread_v_casc_t', _("Spread Vertical (cascade top)"), spread_v_casc_t, menu = _("Arrange")) # spread objects vertically (equidistant centers) def spread_v_center(context): pos = [] for obj in context.document.SelectedObjects(): rect = obj.coord_rect pos.append(((rect.top + rect.bottom) / 2, obj)) l = len(pos) - 1 if l > 1: pos.sort() pos.reverse() center1, ob = pos[0] center2, ob = pos[-1] gap = (center1 - center2) / l next = center1 - gap for center, obj in pos[1:-1]: obj.Translate(Point(0, next - center)) next = next - gap Sketch.Scripting.AddFunction('spread_v_center', _("Spread Vertical (center)"), spread_v_center, menu = _("Arrange")) # spread objects vertically (gaps/overlaps of equal height) def spread_v_bbox(context): pos = [] sum = 0 for obj in context.document.SelectedObjects(): rect = obj.coord_rect height = rect.top - rect.bottom pos.append((rect.top, height, obj)) sum = sum + height l = len(pos) - 1 if l > 1: pos.sort() pos.reverse() start, height1, ob = pos[0] end, height2, ob = pos[-1] gap = (start - end + height2 - sum) / l next = start - height1 - gap for top, height, obj in pos[1:-1]: obj.Translate(Point(0, next - top)) next = next - height - gap Sketch.Scripting.AddFunction('spread_v_bbox', _("Spread Vertical (bbox)"), spread_v_bbox, menu = _("Arrange"))