tconnector.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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_outer_diam = 8.2 *MM
  11. seal_depth = 5.27 *MM
  12. seal_torus_diam = 1.5 *MM
  13. cartridge_small_diam = 7.6 *MM
  14. cartridge_small_depth = 6.6 *MM
  15. cartridge_large_diam = 8.85 *MM
  16. cartridge_large_depth = 3.6 *MM
  17. eps = 0.1 * MM
  18. version = "G1_8"
  19. # version = "M7"
  20. if version == "G1_8":
  21. major_diam = 9.7 * MM + eps*2
  22. pitch=0.907 * MM
  23. length=12 * MM
  24. housing_factor = 2
  25. elif version == "M7":
  26. major_diam = 7 * MM + eps*2
  27. pitch=1 * MM
  28. length=8 * MM
  29. housing_factor = 1.75
  30. else:
  31. raise ValueError("Invalid version")
  32. cartridge = cq.importers.importStep("cell_measure_robot/pneumatics/sensor_tip.step")
  33. iso_external_thread = IsoThread(
  34. major_diameter=major_diam,
  35. pitch=pitch,
  36. length=length,
  37. external=True,
  38. end_finishes=("chamfer", "chamfer"),
  39. )
  40. iso_external_core = (
  41. cq.Workplane("XY")
  42. .circle(iso_external_thread.min_radius)
  43. .extrude(iso_external_thread.length)
  44. )
  45. iso_external = iso_external_thread.cq_object.fuse(iso_external_core.val())
  46. housing_diameter = cartridge_large_diam * housing_factor
  47. housing = (
  48. cq.Workplane("XY")
  49. .rect(housing_diameter, housing_diameter)
  50. .workplane(offset=iso_external_thread.length + distance)
  51. .center(0, housing_diameter/2)
  52. .rect(housing_diameter, housing_diameter * 2)
  53. .workplane(offset=iso_external_thread.length)
  54. .rect(housing_diameter, housing_diameter * 2)
  55. .loft()
  56. )
  57. # Side A
  58. housing = housing.cut(iso_external)
  59. # Side B
  60. housing = housing.cut(iso_external.translate((0, 0, iso_external_thread.length + distance)))
  61. # Cartidge hole
  62. moved_cartridge = (
  63. cartridge.rotate((0, 0, 0), (1, 0, 0), 90)
  64. .translate((0, housing_diameter, iso_external_thread.length*2 + distance + 0.9))
  65. )
  66. housing = housing.cut(moved_cartridge)
  67. # straight channel
  68. housing = (
  69. housing.faces("<Z")
  70. .circle(iso_external_thread.min_radius)
  71. .cutThruAll()
  72. )
  73. sweep = (
  74. housing.faces(">Z")
  75. .workplane(centerOption="CenterOfBoundBox", offset=-cartridge_small_depth)
  76. .center(0, housing_diameter/2)
  77. .circle(cartridge_small_diam / 2)
  78. .workplane(offset=cartridge_small_diam/2-(iso_external_thread.length + distance/2))
  79. .center(0, -housing_diameter)
  80. .transformed(rotate=(-90, 0, 0))
  81. .circle(seal_outer_diam / 2)
  82. .loft(combine=False)
  83. )
  84. housing = housing.cut(sweep)
  85. housing = housing.faces("<Y or >Y").edges("not (>Z or <Z)").fillet(2)
  86. # show_object(iso_external_thread.cq_object, name="iso_external_thread")
  87. # show_object(iso_external_core, name="iso_external_core")
  88. # show_object(iso_external, name="iso_external")
  89. show_object(housing, name="housing")
  90. with open(f"t_connector_{version}.step", "w") as fp:
  91. cq.exporters.exportShape(housing, ExportTypes.STEP, fp)