# Sketch script for spreading selected objects ("distribute" in XFig)
# -*- encoding: iso-latin-1 -*-
# (c) 2000 Michael Loin
#
# 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"))
|