# Sketch - A Python-based interactive drawing program
# Copyright (C) 1999 by Bernhard Herzog
#
# 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
# This is a reimplementation of the Arrange| Abut Horizontal command as
# a safe script.
#
# This script uses these methods and concepts:
#
# SelectedObjects():
#
# The document method SelectedObjects returns a list of all
# currently selected objects. If no objects are selected the list
# is empty.
#
# coord_rect:
#
# The coord_rect attribute of a graphics object is an axis-aligned
# rectangle that contains the entire object. This is not exactly
# the same as a bounding rectangle, as explained in more detail in
# the developer's guide (Doc/devguide.html).
#
# The coord_rect is a rect object and has four read only
# attributes, left, bottom, right, and top, that contain the
# coordinates of the rectangle.
#
# Point(x, y):
#
# Point is a function that returns a point object with the
# coordinates x and y. point objects are immutable objects that
# overload the usual arithmetic operators such as +, -, * among
# others. * is the inner product or multiplication with a scalar
# depending on the operand types. Thy are interpreted as points or
# vectors depending on the context in which they are used.
#
# Point objects are described in more detail in the developer's
# guide.
#
# Translate(offset):
#
# The translate method of a graphics object translates (i.e.
# moves) the object by offset, which has to be a point object.
#
# This method modifies the object involved and an advanced script
# would have to deal with undo when using this method.
#
# First, we need the Sketch specific function Point. Point creates
# point-objects, that represent a 2D-point or vector.
from Sketch import Point
# define the abut_horizontal function. As stated above, it has to accept
# a single argument, customarily called 'context'.
def abut_horizontal(context):
# We have to refer to the document frequently, so save some typing
# by binding it to the local variable doc.
doc = context.document
pos = []
for obj in doc.SelectedObjects():
rect = obj.coord_rect
pos.append((rect.left, rect.top, rect.right - rect.left, obj))
if pos:
# pos is empty (= false) if no object is selected
pos.sort()
start, top, width, ob = pos[0]
next = start + width
for left, top, width, obj in pos[1:]:
obj.Translate(Point(next - left, 0))
next = next + width
# register script
import Sketch.Scripting
Sketch.Scripting.AddFunction('abut_horizontal', 'Abut Horizontal',
abut_horizontal, menu = 'Arrange')
|