by fabberking 2 years, 1 month ago
4 times 5.73s avg. build time

Revox A76 & A78 foot rail

This is a spare part for the Revox A76 vintage Hifi tuner. The tuner has 2 plastic rails on the bottom; each rail holds two rubber blocks that serve as feet for the device. The rail has 2 bolts that snap into the holes in the wooden tuner case.The Revox A78 vintage Hifi amplifier has the same wooden case and feet system, so the rail also works for the A78.

License: CreativeCommons-ShareAlike Publicly Listed: True Tags: None

Log in to download models or make your own copy!

Auto Apply Changes

  1. # Revox A76 / A78 foot rail
  2. #
  3. # (c) 2015 fabberking.com
  4. # Important MetaData
  5. #
  6. UOM = "mm"
  7. # PARAMETERS and PRESETS
  8. # These parameters can be manipulated by end users
  9. #
  10. DEFAULT_PRESET = 'Standard size'
  11. rubber_hole_length = FloatParam( min=10.0, max=23.0, presets={'Standard size':20}, group="Rubber holes", desc="length of rectangular hole for rubber")
  12. rubber_hole_width = FloatParam(min=4.0,max=9.0,presets={'Standard size':7.2}, group="Rubber holes", desc="width of rectangular hole for rubber")
  13. fixing_bolt_diameter = FloatParam(min=3.0,max=6.0,presets={'Standard size':4.4}, group="Fixing bolts", desc="diameter of bolt")
  14. fixing_bolt_length = FloatParam(min=5.0,max=20.0,presets={'Standard size':8.0}, group="Fixing bolts", desc="length of bolt over rail, up to ring")
  15. # Your build method. It must return a solid object
  16. #
  17. def build():
  18. # size of rail
  19. part_length = 150.0
  20. part_width = 12.2
  21. part_height = 10.0
  22. wall_thickness = 1.6
  23. part_bottom_reduce = 0.4
  24. # size of the 2 rectangular holes at both ends of the rail, for the rubber feet inlay
  25. hole_rect_length = rubber_hole_length.value
  26. hole_rect_width = rubber_hole_width.value
  27. # size of the 2 bolts that fix the rail
  28. bolt_diameter = fixing_bolt_diameter.value
  29. bolt_height_flat = part_height + fixing_bolt_length.value
  30. bolt_disc_diameter = bolt_diameter + 0.6
  31. bolt_disc_thickness = 1.0
  32. bolt_loft_height = 1.0
  33. bolt_distance = 90.5
  34. # the rail shell
  35. part = Workplane("XY").box(part_length, part_width, part_height).faces(">Z").shell(-wall_thickness)
  36. # fix our temp reference workplane, located at the bottom center of the part
  37. # this is a workaround... the part.faces("<Z").workplane() function selects the last added solid (which might not be centered to origin)
  38. # when several solids qualify for the same plane part.faces(">Y").workplane(- p
  39. bottom_workplane = part.faces("<Z").workplane()
  40. # the 2 rectangular holes at both ends of the rail
  41. hole_rect_center_distance = part_length - 2 * hole_rect_length / 2 - 2 * (part_width - hole_rect_width) / 2
  42. bottom_workplane.pushPoints([ (hole_rect_center_distance / 2, 0), (-hole_rect_center_distance / 2, 0) ]).rect(hole_rect_length, hole_rect_width).cutThruAll()
  43. # the 2 bolts for fixing the rail...
  44. # create one bolt with all details first
  45. bolt = bottom_workplane.circle(bolt_diameter / 2).extrude(- (bolt_height_flat), combine = False) # don't auto combine with existing base part
  46. disc = bolt.faces(">Z").workplane().circle(bolt_disc_diameter / 2).extrude(-bolt_disc_thickness, combine = False).edges().fillet(bolt_disc_thickness / 2.1)
  47. loft = bolt.faces(">Z").workplane().circle(bolt_diameter / 2).workplane(offset = bolt_loft_height).circle(0.5).loft(combine = False)
  48. anchor = bolt.faces("<Z").workplane().rect(wall_thickness, part_width).extrude(-part_height * 0.8, combine = False)
  49. bolt = bolt.add(disc).add(loft).add(anchor).combine()
  50. slot = bolt.faces(">Z").workplane().rect(1.0, bolt_disc_diameter).extrude(-(bolt_height_flat + bolt_disc_thickness - part_height), combine = False) # >Z ignores loft
  51. slot.faces('<Z').edges('|Y').fillet(0.4)
  52. bolt.cut(slot)
  53. # now copy and move to desired place
  54. bolt1 = bolt.translate((bolt_distance / 2, 0, 0))
  55. bolt2 = bolt.translate((-bolt_distance / 2, 0, 0))
  56. # assemble the part and bolts
  57. part = part.add(bolt1).add(bolt2).combine()
  58. # reduce the bottom rect area by cutting off from the shell
  59. alpha_deg = math.atan(part_bottom_reduce / part_height) * 180 / math.pi
  60. part.faces(">Y").workplane(- part_bottom_reduce / 2).transformed( rotate = Vector(-alpha_deg, 0, 0) ).split(keepBottom = True)
  61. part.faces("<Y").workplane(- part_bottom_reduce / 2).transformed( rotate = Vector(alpha_deg, 0, 0) ).split(keepBottom = True)
  62. part.faces(">X").workplane(- part_bottom_reduce / 2).transformed( rotate = Vector(0, alpha_deg, 0) ).split(keepBottom = True)
  63. part.faces("<X").workplane(- part_bottom_reduce / 2).transformed( rotate = Vector(0, -alpha_deg, 0) ).split(keepBottom = True)
  64. return part