1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
|
#
# create_spiral.py - create spiral lines
# Tamito KAJIYAMA <26 March 2000>
#
# Copyright (C) 2000 by Tamito KAJIYAMA
# Copyright (C) 2000 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, cos, sin
from Sketch import PolyBezier, CreatePath, Polar, Point, \
ContAngle, ContSmooth, ContSymmetrical
from Sketch.UI.sketchdlg import SKModal
from Tkinter import *
import unit
class CreateStarDlg(SKModal):
title = "Create Spiral"
def build_dlg(self):
self.var_rotation = IntVar(self.top)
self.var_rotation.set(4)
label = Label(self.top, text="Rotations")
label.grid(column=0, row=0, sticky=E)
entry = Entry(self.top, width=15, textvariable=self.var_rotation)
entry.grid(column=1, row=0)
self.var_radius = StringVar(self.top)
self.var_radius.set("100pt")
label = Label(self.top, text="Radius")
label.grid(column=0, row=1, sticky=E)
entry = Entry(self.top, width=15, textvariable=self.var_radius)
entry.grid(column=1, row=1)
button = Button(self.top, text="OK", command=self.ok)
button.grid(column=0, row=2, sticky=W)
button = Button(self.top, text="Cancel", command=self.cancel)
button.grid(column=1, row=2, sticky=E)
def ok(self):
self.close_dlg((self.var_rotation.get(),
self.var_radius.get()))
def create_spiral(context):
args = CreateStarDlg(context.application.root).RunDialog()
if args is None:
return
path = apply(create_spiral_path, args)
bezier = PolyBezier((path,))
context.main_window.PlaceObject(bezier)
def create_spiral_path(rotation, radius):
r = unit.convert(radius)
rate = r / (rotation * 2 * pi)
def tangent(phi, a = 0.55197 * rate):
return a * Point(cos(phi) - phi * sin(phi),
sin(phi) + phi * cos(phi))
pi2 = pi / 2.0
angle = 0
tang = tangent(0)
path = CreatePath()
p = Point(0, 0)
path.AppendLine(p)
for i in range(rotation * 4):
p1 = p + tang
angle = pi2 * (i + 1)
p = Polar(rate * angle, angle)
tang = tangent(angle)
p2 = p - tang
path.AppendBezier(p1, p2, p, ContSymmetrical)
return path
import Sketch.Scripting
Sketch.Scripting.AddFunction('create_spiral', 'Spiral',
create_spiral, menu = 'Create Objects',
script_type = Sketch.Scripting.AdvancedScript)
|