Enable support for rack gears
This commit is contained in:
parent
0b963f30a1
commit
2a849e7af6
|
@ -235,9 +235,8 @@ def generate_rack_points(tooth_count, pitch, addendum, pressure_angle,
|
||||||
p = []
|
p = []
|
||||||
p.append( (x_lhs + 0.5 * tab_length, 0) )
|
p.append( (x_lhs + 0.5 * tab_length, 0) )
|
||||||
p.append( (x_rhs - 0.5 * tab_length, 0) )
|
p.append( (x_rhs - 0.5 * tab_length, 0) )
|
||||||
guide_path = points_to_svgd(p)
|
|
||||||
# return points ready for use in an SVG 'path'
|
# return points ready for use in an SVG 'path'
|
||||||
return (points, guide_path)
|
return (points, p)
|
||||||
|
|
||||||
|
|
||||||
def generate_spur_points(teeth, base_radius, pitch_radius, outer_radius, root_radius, accuracy_involute, accuracy_circular):
|
def generate_spur_points(teeth, base_radius, pitch_radius, outer_radius, root_radius, accuracy_involute, accuracy_circular):
|
||||||
|
@ -541,7 +540,7 @@ class Gears():
|
||||||
return messages
|
return messages
|
||||||
|
|
||||||
|
|
||||||
def __call__(self, **kw):
|
def __call__(self, move="", callback=None, **kw):
|
||||||
""" Calculate Gear factors from inputs.
|
""" Calculate Gear factors from inputs.
|
||||||
- Make list of radii, angles, and centers for each tooth and
|
- Make list of radii, angles, and centers for each tooth and
|
||||||
iterate through them
|
iterate through them
|
||||||
|
@ -572,6 +571,7 @@ class Gears():
|
||||||
# visible guide lines
|
# visible guide lines
|
||||||
centercross = self.options.centercross # draw center or not (boolean)
|
centercross = self.options.centercross # draw center or not (boolean)
|
||||||
pitchcircle = self.options.pitchcircle # draw pitch circle or not (boolean)
|
pitchcircle = self.options.pitchcircle # draw pitch circle or not (boolean)
|
||||||
|
|
||||||
# Accuracy of teeth curves
|
# Accuracy of teeth curves
|
||||||
accuracy_involute = 20 # Number of points of the involute curve
|
accuracy_involute = 20 # Number of points of the involute curve
|
||||||
accuracy_circular = 9 # Number of points on circular parts
|
accuracy_circular = 9 # Number of points on circular parts
|
||||||
|
@ -592,6 +592,29 @@ class Gears():
|
||||||
(pitch_radius, base_radius, addendum, dedendum,
|
(pitch_radius, base_radius, addendum, dedendum,
|
||||||
outer_radius, root_radius, tooth) = gear_calculations(teeth, pitch, angle, clearance, self.options.internal_ring, self.options.profile_shift*0.01)
|
outer_radius, root_radius, tooth) = gear_calculations(teeth, pitch, angle, clearance, self.options.internal_ring, self.options.profile_shift*0.01)
|
||||||
|
|
||||||
|
s = self.boxes.spacing
|
||||||
|
b = self.boxes.burn
|
||||||
|
# Add Rack (instead)
|
||||||
|
if self.options.drawrack:
|
||||||
|
base_height = self.options.base_height * unit_factor
|
||||||
|
tab_width = self.options.base_tab * unit_factor
|
||||||
|
tooth_count = self.options.teeth_length
|
||||||
|
(points, guide_points) = generate_rack_points(tooth_count, pitch, addendum, angle,
|
||||||
|
base_height, tab_width, clearance, pitchcircle)
|
||||||
|
width = tooth_count * pitch + 2*tab_width + 2 * s
|
||||||
|
height = base_height+ 2* addendum + 2 * s
|
||||||
|
self.boxes.rectangularHole(width/2, height/2, width, height)
|
||||||
|
if self.boxes.move(width, height, move, before=True):
|
||||||
|
return
|
||||||
|
self.boxes.cc(callback, None, s+b, s+b)
|
||||||
|
self.boxes.ctx.save()
|
||||||
|
self.boxes.moveTo(width/2.0+s, base_height+s+addendum, -180)
|
||||||
|
self.drawPoints(points)
|
||||||
|
self.drawPoints(guide_points, kerfdir=0)
|
||||||
|
self.boxes.ctx.restore()
|
||||||
|
self.boxes.move(width, height, move)
|
||||||
|
return
|
||||||
|
|
||||||
# Detect Undercut of teeth
|
# Detect Undercut of teeth
|
||||||
## undercut = int(ceil(undercut_min_teeth( angle )))
|
## undercut = int(ceil(undercut_min_teeth( angle )))
|
||||||
## needs_undercut = teeth < undercut #? no longer needed ?
|
## needs_undercut = teeth < undercut #? no longer needed ?
|
||||||
|
@ -682,36 +705,6 @@ class Gears():
|
||||||
if pitchcircle:
|
if pitchcircle:
|
||||||
self.boxes.hole(0, 0, pitch_radius)
|
self.boxes.hole(0, 0, pitch_radius)
|
||||||
|
|
||||||
# Add Rack (below)
|
|
||||||
if self.options.drawrack:
|
|
||||||
base_height = self.options.base_height * unit_factor
|
|
||||||
tab_width = self.options.base_tab * unit_factor
|
|
||||||
tooth_count = self.options.teeth_length
|
|
||||||
(points, guide_path) = generate_rack_points(tooth_count, pitch, addendum, angle,
|
|
||||||
base_height, tab_width, clearance, pitchcircle)
|
|
||||||
path = points_to_svgd(points)
|
|
||||||
# position below Gear, so that it meshes nicely
|
|
||||||
# xoff = 0 ## if teeth % 4 == 2.
|
|
||||||
# xoff = -0.5*pitch ## if teeth % 4 == 0.
|
|
||||||
# xoff = -0.75*pitch ## if teeth % 4 == 3.
|
|
||||||
# xoff = -0.25*pitch ## if teeth % 4 == 1.
|
|
||||||
xoff = (-0.5, -0.25, 0, -0.75)[teeth % 4] * pitch
|
|
||||||
t = 'translate(' + str( xoff ) + ',' + str( pitch_radius ) + ')'
|
|
||||||
g_attribs = { inkex.addNS('label', 'inkscape'): 'RackGear' + str(tooth_count),
|
|
||||||
'transform': t }
|
|
||||||
rack = inkex.etree.SubElement(g, 'g', g_attribs)
|
|
||||||
|
|
||||||
# Create SVG Path for gear
|
|
||||||
style = {'stroke': path_stroke, 'fill': 'none', 'stroke-width': path_stroke_width }
|
|
||||||
gear_attribs = { 'style': simplestyle.formatStyle(style), 'd': path }
|
|
||||||
gear = inkex.etree.SubElement(
|
|
||||||
rack, inkex.addNS('path', 'svg'), gear_attribs)
|
|
||||||
if guide_path is not None:
|
|
||||||
style2 = { 'stroke': path_stroke, 'fill': 'none', 'stroke-width': path_stroke_light }
|
|
||||||
gear_attribs2 = { 'style': simplestyle.formatStyle(style2), 'd': guide_path }
|
|
||||||
gear = inkex.etree.SubElement(
|
|
||||||
rack, inkex.addNS('path', 'svg'), gear_attribs2)
|
|
||||||
|
|
||||||
|
|
||||||
# Add Annotations (above)
|
# Add Annotations (above)
|
||||||
if self.options.annotation:
|
if self.options.annotation:
|
||||||
|
|
Loading…
Reference in New Issue