class CrystalScad::Gears::PrintedGear

Acts the same as Gear, but does produce printable output

Public Class Methods

new(args={}) click to toggle source
Calls superclass method CrystalScad::Gears::Gear::new
# File lib/crystalscad/Gears.rb, line 74
def initialize(args={})
  super
  @pressure_angle = args[:pressure_angle] || 20
  @clearance = args[:clearance] || 0.0
  @backlash = args[:backlash] || 0.0
  @twist = args[:twist] || 0.0
  @teeth_to_hide = args[:teeth_to_hide] || 0.0
 
  @rotation = args[:rotation] || 0.0 # rotation in teeth
end

Public Instance Methods

degrees(a) click to toggle source
# File lib/crystalscad/Gears.rb, line 122
def degrees(a)
  a*180 /  Math::PI
end
iang(r1,r2) click to toggle source
# File lib/crystalscad/Gears.rb, line 130
def iang(r1,r2) 
  Math::sqrt((r2/r1)*(r2/r1) - 1)/Math::PI*180 - degrees(Math::acos(r1/r2)) #//unwind a string this many degrees to go from radius r1 to radius r2
end
output() click to toggle source

ported from publicDomainGearV1.1.scad

# File lib/crystalscad/Gears.rb, line 90
def output
  p = @module * @teeth / 2.0
  c  = p + @module - @clearance       # radius of pitch circle
        b  = p*Math::cos(radians(@pressure_angle))         # radius of base circle
    r  = p-(c-p)-@clearance             # radius of root circle
    t  = (@module*Math::PI)/2.0-@backlash/2.0     # tooth thickness at pitch circle
    k  = -iang(b, p) - t/2.0/p/Math::PI*180    # angle to where involute meets base circle on each side of tooth
        
        points=[
                                                            [0, -@hub_dia/10.0],
                                                            polar(r, -181/@teeth.to_f),
                                                            polar(r, r<b ? k : -180/@teeth.to_f),
                                                            q7(0/5,r,b,c,k, 1),q7(1/5,r,b,c,k, 1),q7(2/5,r,b,c,k, 1),q7(3/5,r,b,c,k, 1),q7(4/5,r,b,c,k, 1),q7(5/5,r,b,c,k, 1),
                                                            q7(5/5,r,b,c,k,-1),q7(4/5,r,b,c,k,-1),q7(3/5,r,b,c,k,-1),q7(2/5,r,b,c,k,-1),q7(1/5,r,b,c,k,-1),q7(0/5,r,b,c,k,-1),
                                                            polar(r, r<b ? -k : 180/@teeth.to_f),
                                                            polar(r, 181/@teeth.to_f)
                                                    ]
                    paths=[(0..16).to_a]
  
  res = CrystalScadObject.new
  (0..@teeth-@teeth_to_hide-1).each do |i|
    res+= polygon(points:points,paths:paths).linear_extrude(h:@height,convexity:10,center:false,twist:@twist).rotate(z:i*360/@teeth.to_f)
  end

 res-= cylinder(h:@height+0.2,d:@bore).translate(z:-0.1)
 res.rotate(z:@rotation*360.0/@teeth)
end
polar(r,theta) click to toggle source
# File lib/crystalscad/Gears.rb, line 126
def polar(r,theta)
  [r*Math::sin(radians(theta)), r*Math::cos(radians(theta))]  #convert polar to cartesian coordinates
end
q6(b,s,t,d) click to toggle source
# File lib/crystalscad/Gears.rb, line 138
def q6(b,s,t,d)
  polar(d,s*(iang(b,d)+t)) # point at radius d on the involute curve
end
q7(f,r,b,r2,t,s) click to toggle source
# File lib/crystalscad/Gears.rb, line 134
def q7(f,r,b,r2,t,s)
  q6(b,s,t,(1-f)*[b,r].max+f*r2) #radius a fraction f up the curved side of the tooth
end
radians(a) click to toggle source
# File lib/crystalscad/Gears.rb, line 118
def radians(a)
  a/180.0 * Math::PI
end
show() click to toggle source
# File lib/crystalscad/Gears.rb, line 85
def show
  output
end