import math from dataclasses import dataclass, field import cadquery as Cq from nhf import Material, Role from nhf.parts.handle import Handle, BayonetMount from nhf.build import Model, target, assembly import nhf.utils @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 @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").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()