Advertisement
Guest User

Untitled

a guest
Sep 14th, 2014
476
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.89 KB | None | 0 0
  1.  
  2. /* Gear
  3.  *
  4. layer = active.proxy.layerByName("0")
  5.  
  6. local Gear = {}
  7. Gear.__index = Gear
  8.  
  9. setmetatable(Gear, {
  10.   __call = function (cls, ...)
  11.     return cls.new(...)
  12.   end,
  13. })
  14.  
  15. function Gear.new()
  16.   local self = setmetatable({}, Gear)
  17.   return self
  18. end
  19.  
  20. function Gear:involute_intersect_angle(Rb, R)
  21.     return (math.sqrt(R*R - Rb*Rb) / (Rb)) - (math.acos(Rb / R))
  22. end
  23.  
  24. function Gear:point_on_circle(radius, angle)
  25.     p = {}
  26.     p.x= radius * math.cos(angle)
  27.     p.y= radius * math.sin(angle)
  28.     return p
  29. end
  30.  
  31. --ce CreateEntities object
  32. --phi = pressure angle
  33. --PC = Circular Pitch
  34. --teeth = no of teeth
  35. function Gear:calc(builder, N, phi, Pc)
  36.     -- Pitch Circle
  37.     local D = N * Pc / math.pi
  38.     local R = D / 2.0
  39.  
  40.     -- Diametrial pitch
  41.     local Pd = N / D
  42.  
  43.     -- Base Circle
  44.     local Db = D * math.cos(phi)
  45.     local Rb = Db / 2.0
  46.  
  47.     -- Addendum
  48.     local a = 1.0 / Pd
  49.  
  50.     -- Outside Circle
  51.     local Ro = R + a
  52.     local Do = 2 * Ro
  53.  
  54.     -- Tooth thickness
  55.     local T = (math.pi * D) / (2 * N)
  56.  
  57.     -- undercut?
  58.     local U = (2 / (math.sin(phi) * (math.sin(phi))))
  59.     local needs_undercut = N < U
  60.     -- sys.stderr.write("N:%s R:%s Rb:%s\n" % (N,R,Rb))
  61.  
  62.  
  63.     -- Clearance
  64.     local c = 0.0
  65.     -- Dedendum
  66.     local b = a + c
  67.  
  68.     -- Root Circle
  69.     local Rr = R - b
  70.     local Dr = 2 * Rr
  71.  
  72.     local two_pi = 2 * math.pi
  73.     local half_thick_angle = two_pi / (4 * N)
  74.     local pitch_to_base_angle = self:involute_intersect_angle(Rb, R)
  75.     local pitch_to_outer_angle = self:involute_intersect_angle(Rb, Ro) -- pitch_to_base_angle
  76.  
  77.     local points ={}
  78.     for x=1,N do
  79.         local c = x * two_pi / N;
  80.  
  81.         -- angles
  82.         local pitch1 = c - half_thick_angle
  83.         local base1 = pitch1 - pitch_to_base_angle
  84.         local outer1 = pitch1 + pitch_to_outer_angle
  85.  
  86.         local pitch2 = c + half_thick_angle
  87.         local base2 = pitch2 + pitch_to_base_angle
  88.         local outer2 = pitch2 - pitch_to_outer_angle
  89.  
  90.         -- points
  91.         local b1 = self:point_on_circle(Rb, base1)
  92.         local p1 = self:point_on_circle(R, pitch1)
  93.         local o1 = self:point_on_circle(Ro, outer1)
  94.         local o2 = self:point_on_circle(Ro, outer2)
  95.         local p2 = self:point_on_circle(R, pitch2)
  96.         local b2 = self:point_on_circle(Rb, base2)
  97.  
  98.         if Rr >= Rb then
  99.             local pitch_to_root_angle = pitch_to_base_angle - self:involute_intersect_angle(Rb, Rr)
  100.             local root1 = pitch1 - pitch_to_root_angle
  101.             local root2 = pitch2 + pitch_to_root_angle
  102.             local r1 = self:point_on_circle(Rr, root1)
  103.             local r2 = self:point_on_circle(Rr, root2)
  104.  
  105.             table.insert(points, r1)
  106.             table.insert(points, p1)
  107.             table.insert(points, o1)
  108.             table.insert(points, o2)
  109.             table.insert(points, p2)
  110.             table.insert(points, r2)
  111.  
  112.         else
  113.             local r1 = self:point_on_circle(Rr, base1)
  114.             local r2 = self:point_on_circle(Rr, base2)
  115.             table.insert(points, r1)
  116.             table.insert(points, b1)
  117.             table.insert(points, p1)
  118.             table.insert(points, o1)
  119.             table.insert(points, o2)
  120.             table.insert(points, p2)
  121.             table.insert(points, b2)
  122.             table.insert(points, r2)
  123.         end
  124.      end
  125.         local first = points[1]
  126.         local fKeep = first
  127.         table.remove(points, 1)
  128.         for k,v in pairs(points) do
  129.             builder:append(Line(Coord(first.x,first.y), Coord(v.x,v.y),layer))
  130.              first=v
  131.         end
  132.             builder:append(Line(Coord(first.x,first.y), Coord(fKeep.x,fKeep.y),layer))
  133.  
  134. end
  135.  
  136. local gear = Gear()
  137.  
  138. b=Builder(active.document())
  139. layer = active.proxy.layerByName("0")
  140.  
  141. gear:calc(b, 20,math.rad(10),math.rad(10))
  142. gear:calc(b, 10,math.rad(10),math.rad(10))
  143. b:push()
  144. b:scale(Coord(0,0),Coord(10,10))
  145. b:execute()
  146.  
  147.  
  148. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement