2024-06-25 06:11:48 -07:00
|
|
|
import math
|
2024-07-16 15:42:39 -07:00
|
|
|
from dataclasses import dataclass, field
|
2024-06-25 06:11:48 -07:00
|
|
|
import cadquery as Cq
|
2024-07-16 11:55:38 -07:00
|
|
|
from nhf import Material, Role
|
2024-07-16 15:42:39 -07:00
|
|
|
from nhf.parts.handle import Handle, BayonetMount
|
|
|
|
from nhf.build import Model, target, assembly
|
|
|
|
import nhf.utils
|
2024-06-25 06:11:48 -07:00
|
|
|
|
2024-07-16 15:42:39 -07:00
|
|
|
@dataclass
|
|
|
|
class Trident(Model):
|
|
|
|
handle: Handle = field(default_factory=lambda: Handle(
|
|
|
|
diam=38,
|
|
|
|
diam_inner=38-2 * 25.4/8,
|
|
|
|
diam_connector_internal=18,
|
|
|
|
simplify_geometry=False,
|
|
|
|
mount=BayonetMount(n_pin=3),
|
|
|
|
))
|
|
|
|
terminal_height: float = 80
|
|
|
|
terminal_hole_diam: float = 24
|
|
|
|
terminal_bottom_thickness: float = 10
|
|
|
|
segment_length: float = 24 * 25.4
|
2024-07-02 19:59:09 -07:00
|
|
|
|
2024-07-16 15:42:39 -07:00
|
|
|
@target(name="handle-connector")
|
|
|
|
def handle_connector(self):
|
|
|
|
return self.handle.connector()
|
|
|
|
@target(name="handle-insertion")
|
|
|
|
def handle_insertion(self):
|
|
|
|
return self.handle.insertion()
|
|
|
|
@target(name="proto-handle-terminal-connector", prototype=True)
|
|
|
|
def proto_handle_connector(self):
|
|
|
|
return self.handle.one_side_connector(height=15)
|
|
|
|
|
|
|
|
@target(name="handle-terminal-connector")
|
|
|
|
def handle_terminal_connector(self):
|
|
|
|
result = self.handle.one_side_connector(height=self.terminal_height)
|
|
|
|
#result.faces("<Z").circle(radius=25/2).cutThruAll()
|
|
|
|
h = self.terminal_height + self.handle.insertion_length - self.terminal_bottom_thickness
|
|
|
|
result = result.faces(">Z").hole(self.terminal_hole_diam, depth=h)
|
|
|
|
return result
|
|
|
|
|
|
|
|
@assembly()
|
|
|
|
def assembly(self):
|
|
|
|
def segment():
|
|
|
|
return self.handle.segment(self.segment_length)
|
|
|
|
|
|
|
|
terminal = (
|
|
|
|
self.handle
|
|
|
|
.one_side_connector(height=self.terminal_height)
|
|
|
|
.faces(">Z")
|
|
|
|
.hole(15, self.terminal_height + self.handle.insertion_length - 10)
|
|
|
|
)
|
|
|
|
mat_c = Material.PLASTIC_PLA
|
|
|
|
mat_i = Material.RESIN_TOUGH_1500
|
|
|
|
mat_s = Material.ACRYLIC_BLACK
|
|
|
|
role_i = Role.CONNECTION
|
|
|
|
role_c = Role.CONNECTION
|
|
|
|
role_s = Role.STRUCTURE
|
|
|
|
a = (
|
|
|
|
Cq.Assembly()
|
|
|
|
.addS(self.handle.insertion(), name="i0",
|
|
|
|
material=mat_i, role=role_i)
|
|
|
|
.constrain("i0", "Fixed")
|
|
|
|
.addS(segment(), name="s1",
|
|
|
|
material=mat_s, role=role_s)
|
|
|
|
.constrain("i0?rim", "s1?mate1", "Plane", param=0)
|
|
|
|
.addS(self.handle.insertion(), name="i1",
|
|
|
|
material=mat_i, role=role_i)
|
|
|
|
.addS(self.handle.connector(), name="c1",
|
|
|
|
material=mat_c, role=role_c)
|
|
|
|
.addS(self.handle.insertion(), name="i2",
|
|
|
|
material=mat_i, role=role_i)
|
|
|
|
.constrain("s1?mate2", "i1?rim", "Plane", param=0)
|
|
|
|
.constrain("i1?mate", "c1?mate1", "Plane")
|
|
|
|
.constrain("i2?mate", "c1?mate2", "Plane")
|
|
|
|
.addS(segment(), name="s2",
|
|
|
|
material=mat_s, role=role_s)
|
|
|
|
.constrain("i2?rim", "s2?mate1", "Plane", param=0)
|
|
|
|
.addS(self.handle.insertion(), name="i3",
|
|
|
|
material=mat_i, role=role_i)
|
|
|
|
.constrain("s2?mate2", "i3?rim", "Plane", param=0)
|
|
|
|
.addS(self.handle.one_side_connector(), name="head",
|
|
|
|
material=mat_c, role=role_c)
|
|
|
|
.constrain("i3?mate", "head?mate", "Plane")
|
|
|
|
.addS(terminal, name="terminal",
|
|
|
|
material=mat_c, role=role_c)
|
|
|
|
.constrain("i0?mate", "terminal?mate", "Plane")
|
|
|
|
)
|
|
|
|
return a.solve()
|