# 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)