# Sketch - A Python-based interactive drawing program
# Copyright (C) 1999, 2000, 2002 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
from math import pi
from Tkinter import IntVar,DoubleVar,Entry,Label,Button,Frame
import Sketch.Scripting
from Sketch import _,SolidPattern,StandardColors,PolyBezier,CreatePath,\
Point, Polar
from Sketch.UI.sketchdlg import SKModal
#
#
#
def create_star_path(corners, step, radius):
# create a star-like polygon.
center = Point(300, 400)
radius = 100
angle = step * 2 * pi / corners
# create an empty path and append the line segments
path = CreatePath()
for i in range(corners):
p = Polar(radius, angle * i + pi / 2)
path.AppendLine(p)
# close the path.
path.AppendLine(path.Node(0))
path.ClosePath()
return path
#
# A modal dialog that asks for the parameters
#
# SKModal is the baseclass Sketch uses for modal dialogs. It provides
# some standard functionality for all modal dialogs.
#
# The intended use of a sub-class of SKModal is to instantiate it and
# call its RunDialog method.
#
# RunDialog pops up the dialog and returns when the user either cancels
# the dialog or presses the OK button. Its return value is None if the
# dialog was canceled or whatever object was passed to the close_dlg
# method to close the dialog in response to the click on the OK-button.
# See the method ok below.
#
class CreateStarDlg(SKModal):
title = _("Create Star")
def __init__(self, master, **kw):
# This constructor is here just for illustration purposes; it's
# not really needed here, as it simply passes all parameters on
# to the base class' constructor.
#
# The parameter master is the window this dialog belongs to. It
# should normally be the top-level application window.
apply(SKModal.__init__, (self, master), kw)
def build_dlg(self):
# The SKModal constructor automatically calls this method to
# create the widgets in the dialog.
#
# self.top is the top-level window of the dialog. All widgets of
# the dialog must contained in it.
top = self.top
# The rest is normal Tkinter code.
self.var_corners = IntVar(top)
self.var_corners.set(5)
label = Label(top, text = _("Corners"), anchor = 'e')
label.grid(column = 0, row = 0, sticky = 'ew')
entry = Entry(top, textvariable = self.var_corners, width = 15)
entry.grid(column = 1, row = 0, sticky = 'ew')
self.var_steps = IntVar(top)
self.var_steps.set(2)
label = Label(top, text = _("Steps"), anchor = 'e')
label.grid(column = 0, row = 1, sticky = 'ew')
entry = Entry(top, textvariable = self.var_steps, width = 15)
entry.grid(column = 1, row = 1, sticky = 'ew')
self.var_radius = DoubleVar(top)
self.var_radius.set(100)
label = Label(top, text = _("Radius"), anchor = 'e')
label.grid(column = 0, row = 2, sticky = 'ew')
entry = Entry(top, textvariable = self.var_radius, width = 15)
entry.grid(column = 1, row = 2, sticky = 'ew')
but_frame = Frame(top)
but_frame.grid(column = 0, row = 3, columnspan = 2)
button = Button(but_frame, text = _("OK"), command = self.ok)
button.pack(side = 'left', expand = 1)
# The self.cancel method is provided by the base class and
# cancels the dialog.
button = Button(but_frame, text = _("Cancel"), command = self.cancel)
button.pack(side = 'right', expand = 1)
def ok(self, *args):
# This method is bound to the OK-button. Its purpose is to
# collect the values of the various edit fields and pass them as
# one parameter to the close_dlg method.
#
# close_dlg() saves its parameter and closes the dialog.
corners = self.var_corners.get()
steps = self.var_steps.get()
radius = self.var_radius.get()
self.close_dlg((corners, steps, radius))
def create_star(context):
# Instantiate the modal dialog...
dlg = CreateStarDlg(context.application.root)
# ... and run it.
result = dlg.RunDialog()
if result is not None:
# if the result is not None, the user pressed OK. Now constuct
# the star-path...
corners, steps, radius = result
path = create_star_path(corners, steps, radius)
# ... and create the bezier object. The parameter to the
# constructor must be a tuple of paths
bezier = PolyBezier((path,))
# Set the line color to blue, the line width to 4pt
bezier.SetProperties(line_pattern = SolidPattern(StandardColors.blue),
line_width = 4)
# and insert it into the document
context.main_window.PlaceObject(bezier)
Sketch.Scripting.AddFunction('create_star', _("Create Star"),
create_star,
script_type = Sketch.Scripting.AdvancedScript)
|