# (c) 2014 David Douard # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License (LGPL) # as published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # for detail see the LICENCE text file. # # FCGear 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 FCGear; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 import itertools from math import cos, sin from involute import CreateExternalGear, rotate def makeGear(m, Z, angle): w = SVGWireBuilder() CreateExternalGear(w, m, Z, angle) return '\n'.join(w.svg) class SVGWireBuilder(object): def __init__(self): self.theta = 0.0 self.pos = None self.svg = [] def move(self, p): p = rotate(p, self.theta) self.svg.append('M %s,%s' % (p[0], p[1])) self.pos = p def line(self, p): p = rotate(p, self.theta) self.svg.append('L %s,%s' % (p[0], p[1])) self.pos = p def arc(self, p, r, sweep): p = rotate(p, self.theta) self.svg.append('A %s,%s 0,0,%s %s,%s' % (r, r, str(sweep), p[0], p[1])) self.pos = p def curve(self, *points): """Add a Bezier curve from self.pos to points[-1] every other points are the control points of the Bezier curve (which will thus be of degree len(points) ) """ assert len(points) == 3 points = [rotate(p, self.theta) for p in points] self.svg.append('C %s,%s %s,%s %s,%s' % tuple(itertools.chain(*points))) self.pos = points[-1] def close(self): self.svg.append('Z') if __name__ == '__main__': from optparse import OptionParser p = OptionParser() p.add_option('-a', '--angle', help='pressure angle', dest='angle', default=20) opts, args = p.parse_args() if len(args) != 2: p.error() m, Z = [float(v) for v in args] print(makeGear(m, int(Z), float(opts.angle)))