tconnector 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. import cadquery as cq
  2. from cq_warehouse.thread import (
  3. IsoThread
  4. )
  5. from ocp_vscode import show, show_object
  6. from cadquery.occ_impl.exporters import ExportTypes
  7. MM = 1
  8. IN = 25.4 *MM
  9. distance = 15 *MM
  10. seal_diam = 8.2 *MM
  11. seal_depth = 3.4 *MM
  12. seal_torus_diam = 1.5 *MM
  13. cartridge_small_diam = 7.7 *MM
  14. cartridge_small_depth = 5.2 *MM
  15. cartridge_large_diam = 8.9 *MM
  16. cartridge_large_depth = 2.7 *MM
  17. # version = "G1_8"
  18. version = "M7"
  19. if version == "G1_8":
  20. major_diam = 9.6 * MM
  21. pitch=0.907 * MM
  22. length=10 * MM
  23. elif version == "M7":
  24. major_diam = 7 * MM
  25. pitch=1 * MM
  26. length=8 * MM
  27. else:
  28. raise ValueError("Invalid version")
  29. iso_external_thread = IsoThread(
  30. major_diameter=major_diam,
  31. pitch=pitch,
  32. length=length,
  33. external=True,
  34. end_finishes=("chamfer", "chamfer"),
  35. )
  36. iso_external_core = (
  37. cq.Workplane("XY")
  38. .circle(iso_external_thread.min_radius)
  39. .extrude(iso_external_thread.length)
  40. )
  41. iso_external = iso_external_thread.cq_object.fuse(iso_external_core.val())
  42. housing_diameter = cartridge_large_diam * 1.5
  43. housing = (
  44. cq.Workplane("XY")
  45. .rect(housing_diameter, housing_diameter)
  46. .workplane(offset=iso_external_thread.length + distance)
  47. .center(0, housing_diameter/2)
  48. .rect(housing_diameter, housing_diameter * 2)
  49. .workplane(offset=iso_external_thread.length)
  50. .rect(housing_diameter, housing_diameter * 2)
  51. .loft()
  52. )
  53. # Side A
  54. housing = housing.cut(iso_external)
  55. # Side B
  56. housing = housing.cut(iso_external.translate((0, 0, iso_external_thread.length + distance)))
  57. # Cartidge hole
  58. housing = (
  59. housing.faces(">Z")
  60. .workplane(centerOption="CenterOfBoundBox")
  61. .center(0, housing_diameter/2)
  62. .circle(cartridge_large_diam / 2)
  63. .cutBlind(-cartridge_large_depth)
  64. )
  65. housing = (
  66. housing.faces(">Z")
  67. .workplane(centerOption="CenterOfBoundBox")
  68. .center(0, housing_diameter/2)
  69. .circle(cartridge_small_diam / 2)
  70. .cutBlind(-cartridge_small_depth)
  71. )
  72. # seal as torus
  73. seal = (
  74. cq.Workplane('XZ', origin = (seal_diam/2, 0, 0))
  75. .circle(seal_torus_diam/2)
  76. .revolve(360, (-seal_diam/2, 0, 0), (-seal_diam/2, 1, 0))
  77. )
  78. seal_position = iso_external_thread.length*2 + distance - seal_depth
  79. seal_moved = seal.translate((0, housing_diameter, seal_position))
  80. housing = housing.cut(seal_moved)
  81. # straight channel
  82. housing = (
  83. housing.faces("<Z")
  84. .circle(iso_external_thread.min_radius)
  85. .cutThruAll()
  86. )
  87. sweep = (
  88. housing.faces(">Z")
  89. .workplane(centerOption="CenterOfBoundBox", offset=-cartridge_small_depth)
  90. .center(0, housing_diameter/2)
  91. .circle(cartridge_small_diam / 2)
  92. .workplane(offset=cartridge_small_diam/2-(iso_external_thread.length + distance/2))
  93. .center(0, -housing_diameter)
  94. .transformed(rotate=(-90, 0, 0))
  95. .circle(seal_diam / 2)
  96. .loft(combine=False)
  97. )
  98. housing = housing.cut(sweep)
  99. housing = housing.faces("<Y or >Y").edges("not (>Z or <Z)").fillet(2)
  100. # show_object(iso_external_thread.cq_object, name="iso_external_thread")
  101. # show_object(iso_external_core, name="iso_external_core")
  102. # show_object(iso_external, name="iso_external")
  103. show_object(housing, name="housing")
  104. with open(f"t_connector_{version}.step", "w") as fp:
  105. cq.exporters.exportShape(housing, ExportTypes.STEP, fp)