Advertisement
Guest User

Untitled

a guest
Nov 18th, 2014
9
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.11 KB | None | 0 0
  1. __author__ = 'squirrel'
  2.  
  3. from pycad.primitives import Import, Cylinder, Cube, Cone
  4. from pycad.groups import Union, Difference, Intersection, Hull
  5. from pycad.formats.scad import fast_scad_export
  6. from pycad.tools.part import Part
  7.  
  8. from pycad.tools.screws import HexagonScrew
  9. from pycad.tools.bearing import Bearing
  10. from pycad.tools import colors
  11.  
  12. from math import *
  13.  
  14. #test =Import("B+_Model_v4.stl").translate([100, -70, 0])
  15.  
  16.  
  17. class TrackGearedWheel(Part):
  18.  
  19.     def __init__(self, chain, n, thickness, hub_d, screw, screw_distance, fn=8):
  20.         super().__init__()
  21.  
  22.         self.chain = chain
  23.         self.n = n
  24.         self.height = chain.space_w
  25.         self.thickness = thickness
  26.         self.hub_d = hub_d
  27.         self.screw = screw
  28.         self.screw_distance = screw_distance
  29.         self.chain_scale = 1.2
  30.         self.fn=fn
  31.  
  32.         self.inner_angle = 360/n
  33.         self.track_angle = 180 - self.inner_angle
  34.  
  35.         self.r = ( chain.length/2 ) / sin( radians(self.inner_angle/2) )
  36.  
  37.  
  38.     def create_part(self):
  39.  
  40.  
  41.         self.add(main_d=Difference())
  42.  
  43.         positive = Union().add(
  44.             Cylinder(d= self.r*2, h= self.height, center=True)
  45.         )
  46.  
  47.         self.main_d.add(
  48.             positive,
  49.             Cylinder(d=self.hub_d, h=self.height + 2, fn=self.fn, center=True)
  50.         )
  51.  
  52.         for i in [0, 120, -120]:
  53.             self.main_d.add(
  54.                 Cylinder(d=self.screw.d, h=self.height + 2, center=True, fn=self.fn).translate([self.screw_distance, 0, 0]).rotate([0, 0, i])
  55.             )
  56.  
  57.  
  58.         for i in range(self.n):
  59.  
  60.             chain_c = [self.r-self.chain.d/2+(self.chain.d*self.chain_scale)/2, 0]
  61.             space_angle = self.inner_angle/2
  62.             space_c = [self.r*cos(radians(space_angle)), self.r*sin(radians(space_angle))]
  63.             distance = sqrt( (chain_c[0] - space_c[0])*(chain_c[0] - space_c[0]) + (chain_c[1] - space_c[1])*(chain_c[1] - space_c[1]) )
  64.             space_r = distance - (self.chain.d*self.chain_scale)/2
  65.  
  66.             self.main_d.add(
  67.                 Cylinder(d=self.chain.d*self.chain_scale, h=self.height + 2, center=True, fn=self.fn)
  68.                     .translate([self.r-self.chain.d/2+(self.chain.d*self.chain_scale)/2, 0, 0])
  69.                     .rotate([0, 0, i*360/self.n])
  70.             )
  71.             positive.add(
  72.  
  73.                 Cylinder(r=space_r, h=self.height, center=True, fn=self.fn)
  74.                     .translate([self.r, 0, 0])
  75.                     .rotate([0, 0, (i+0.5)*360/self.n])
  76.             )
  77.  
  78.         for i in [-1, 1]:
  79.  
  80.  
  81.             self.main_d.add(
  82.                 Difference().add(
  83.                     Cylinder(r=self.r+space_r+10, h=self.height/2 + 0.5, fn=self.fn*2),
  84.                     Cone(r1=self.r+space_r, r2=self.r, h=self.height/2, fn=self.fn*2).translate([0, 0, 0])
  85.                 ).rotate([90+i*90, 0, 0])
  86.             )
  87.  
  88.  
  89.  
  90.  
  91. class Chain(Part):
  92.  
  93.     def __init__(self, length, t, space_w, space_gap, width, screw_d, teeth_h, fn):
  94.         super().__init__()
  95.         self.teeth_h = teeth_h
  96.         self.length = length
  97.         self.d = t
  98.         self.t = t
  99.         self.space_w = space_w
  100.         self.space_gap = space_gap
  101.         self.width = width
  102.         self.screw_d = screw_d
  103.         self.fn =fn
  104.  
  105.     def create_part(self):
  106.  
  107.         self.side_width = self.width/2 - (self.space_w + 0.2) - self.space_gap/2
  108.         positive = Union()
  109.         positive.add(
  110.             Cylinder(d=self.d, h=self.width - self.side_width, center=True, fn=self.fn).rotate([90, 0, 0]),
  111.             Hull().add(
  112.                 Cylinder(d=self.d, h=self.space_gap, center=True, fn=self.fn).rotate([90, 0, 0]),
  113.                 Cylinder(d=self.d, h=self.space_gap, center=True, fn=self.fn).rotate([90, 0, 0]).translate([self.length, 0, 0])
  114.             )
  115.         )
  116.         for i in [-1, 1]:
  117.  
  118.             positive.add(
  119.                 Difference().add(
  120.                     Hull().add(
  121.                         Cylinder(d=self.d, h=self.side_width, fn=self.fn).rotate([-90*i, 0, 0]).translate([self.length, i*(self.width/2 - self.side_width), 0]),
  122.                         Cylinder(d=self.d, h=self.side_width, fn=self.fn).rotate([-90*i, 0, 0]).translate([0, i*(self.width/2 - self.side_width), 0])
  123.                     ),
  124.                     Cylinder(d=self.d*1.2, h=self.side_width/2 + 1, fn=self.fn).rotate([-90*i, 0, 0]).translate([0, i*(self.width/2 - self.side_width/2), 0]),
  125.                 )
  126.             )
  127.  
  128.         self.add(
  129.             Hull().add(
  130.                 Cylinder(d=self.d, h=self.space_gap, center=True).rotate([90, 0, 0]).translate([self.d*1.2, 0, 0]),
  131.                 Cylinder(d=self.d, h=self.space_gap, center=True).rotate([90, 0, 0]).translate([self.length - self.d*1.2, 0, 0]),
  132.  
  133.                 Cylinder(d=self.d, h=self.space_gap - 2, center=True, fn=self.fn).rotate([90, 0, 0]).translate([self.length/2, 0, self.teeth_h])
  134.             )
  135.         )
  136.  
  137.         self.add(
  138.             Difference().add(
  139.                 positive,
  140.                 Cylinder(d=self.screw_d, h=self.width + 2, center=True, fn=self.fn).rotate([90, 0, 0]),
  141.                 Cylinder(d=self.screw_d, h=self.width + 2, center=True, fn=self.fn).rotate([90, 0, 0]).translate([self.length, 0, 0]),
  142.                 Cylinder(d=self.d*1.2, h=self.space_gap/4 + (self.space_w + 0.2) + self.side_width/2, fn=self.fn).rotate([-90, 0, 0]).translate([self.length, self.space_gap/4, 0]),
  143.                 Cylinder(d=self.d*1.2, h=self.space_gap/4 + (self.space_w + 0.2) + self.side_width/2, fn=self.fn).rotate([90, 0, 0]).translate([self.length, -self.space_gap/4, 0]),
  144.                 Cylinder(d=self.d*1.2, h=self.space_gap/2, center=True, fn=self.fn).rotate([90, 0, 0]),
  145.             )
  146.         )
  147.  
  148. class TrackWheel(Part):
  149.  
  150.     def __init__(self, track, d, screw, bearing, t, fn=16):
  151.         super().__init__()
  152.         self.bearing = bearing
  153.         self.track = track
  154.         self.d = d
  155.         self.screw = screw
  156.         self.t = t
  157.         self.base_height = self.track.width/2 - self.track.space_gap/2
  158.         self.fn = fn
  159.  
  160.     def create_holes(self, diff, min_r, max_r):
  161.         hole_d = max_r-min_r
  162.         hole_r = (max_r+min_r)/2
  163.         hole_n = round( ( 2*pi*hole_r ) / ( hole_d + self.t ) )
  164.  
  165.         for i in range(hole_n):
  166.             diff.add(
  167.                 Cylinder(d=hole_d, h=self.base_height +2, fn=self.fn).translate([hole_r, 0, -1]).rotate([0, 0, i*360/hole_n])
  168.             )
  169.  
  170.     def create_part(self):
  171.  
  172.         self.color(colors.Brass)
  173.  
  174.         main_d = Difference()
  175.         main_d.translate([0, 0, self.track.space_gap/2])
  176.  
  177.         base = Cylinder(d=self.d, h=self.base_height, fn=self.fn*2)
  178.         main_d.add(base)
  179.  
  180.         min_r = self.screw.d/2 + self.t
  181.         max_r = self.d/2 - self.t
  182.         self.create_holes(main_d, min_r, max_r)
  183.  
  184.  
  185.         for i in [-1, 1]:
  186.  
  187.             main_d.add(
  188.                 Difference().add(
  189.                     Cylinder(r=self.d/2 + 2, h=4, fn=self.fn*2).translate([0, 0, self.base_height/2 - 2]),
  190.                     Cone(r1=self.d/2 + 1 , r2=self.d/2 - 2, h=3, fn=self.fn*2).translate([0, 0, self.base_height/2 - 2])
  191.                 ).rotate([90+i*90, 0, 0])
  192.                 .translate([0, 0, self.base_height/2])
  193.             )
  194.  
  195.         self.add(
  196.             Difference().add(
  197.                 Union().add(
  198.                     main_d,
  199.                     Cylinder(d=self.bearing.d, h=self.track.space_gap/2, fn=self.fn),
  200.                     Cylinder(d=self.bearing.d2 - 2, h=self.track.space_gap/2 - self.bearing.height/2, fn=self.fn).translate([0, 0, self.bearing.height/2])
  201.                 ),
  202.                 Cylinder(d=self.screw.d, h=self.base_height + 2, fn=self.fn).translate([0, 0, -1]),
  203.                 Cylinder(d=self.screw.e, h=self.track.width, fn=self.fn).translate([0, 0, self.screw.l/2])
  204.             )
  205.         )
  206.  
  207. fn = 128
  208. track = Chain(
  209.     length = 15,
  210.     t=6,
  211.     space_w=5,
  212.     space_gap=10-0.2,
  213.     width = 40,
  214.     screw_d=2,
  215.     teeth_h = 6,
  216.     fn=fn
  217. )
  218. geared_wheel = TrackGearedWheel(
  219.     chain = track,
  220.     n=8,
  221.     thickness=3,
  222.     hub_d=6,
  223.     screw = HexagonScrew("M3", l=20),
  224.     screw_distance=8,
  225.     fn=fn
  226. )
  227. bearing = Bearing(5, 10, 5, fn=fn)
  228. bearing.translate([0, 0, -bearing.height/2]).rotate([90, 0, 0])
  229. bearing.color(colors.Aluminum)
  230.  
  231. wheel = TrackWheel(track=track, d=30, screw=HexagonScrew("M3", l=20), t=4, bearing=bearing, fn=fn)
  232. wheel2 = wheel.copy()
  233.  
  234. set = Union().add(
  235.     wheel.rotate([90, 0, 0]),
  236.     wheel2.rotate([-90, 0, 0]),
  237.     bearing
  238. ).translate([0, 0, wheel.d/2 + track.d/2])
  239.  
  240. print(("raidus", geared_wheel.r))
  241.  
  242. fast_scad_export(
  243.     [
  244.      set.translate([50, 0, 0]),
  245.      set.copy().translate([40, 0, 0]),
  246.      geared_wheel.copy().rotate([90, 0, 0]).translate([0, track.space_gap/2 + geared_wheel.height/2, geared_wheel.r]),
  247.      geared_wheel.copy().rotate([90, 0, 0]).translate([0, -track.space_gap/2 - geared_wheel.height/2, geared_wheel.r]),
  248.      #wheel
  249.      track,
  250.      track.copy().translate([track.length, 0, 0]),
  251.      track.copy().translate([2*track.length, 0, 0]),
  252.      track.copy().translate([3*track.length, 0, 0]),
  253.      track.copy().translate([4*track.length, 0, 0])
  254.      ],
  255.      "main.scad"
  256. )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement