diff --git a/nhf/joints.py b/nhf/joints.py index f809989..554d7b6 100644 --- a/nhf/joints.py +++ b/nhf/joints.py @@ -13,6 +13,7 @@ def hirth_joint(radius=60, """ # ensures secant doesn't blow up assert n_tooth >= 5 + assert radius > radius_inner # angle of half of a single tooth theta = math.pi / n_tooth @@ -64,7 +65,7 @@ def hirth_joint(radius=60, radius=radius, centered=(True, True, False)) .faces(">Z").tag("bore") - .union(teeth.val().move(Cq.Location((0,0,base_height)))) + .union(teeth.val().move(Cq.Location((0,0,base_height))), tol=tol) .clean() ) #base.workplane(offset=tooth_height/2).circle(radius=radius,forConstruction=True).tag("mate") diff --git a/nhf/touhou/houjuu_nue/__init__.py b/nhf/touhou/houjuu_nue/__init__.py index c4813ee..8d2c0c8 100644 --- a/nhf/touhou/houjuu_nue/__init__.py +++ b/nhf/touhou/houjuu_nue/__init__.py @@ -1,6 +1,7 @@ from dataclasses import dataclass import unittest import cadquery as Cq +import nhf.joints @dataclass(frozen=True) class Parameters: @@ -25,6 +26,75 @@ class Parameters: wing_r2_height = 100 wing_r3_height = 100 + """ + The Houjuu-Scarlett joint mechanism at the base of the wing + """ + hs_joint_base_width = 85 + hs_joint_base_thickness = 10 + hs_joint_ring_thickness = 10 + hs_joint_tooth_height = 10 + hs_joint_radius = 30 + hs_joint_radius_inner = 20 + hs_joint_corner_fillet = 5 + hs_joint_corner_cbore_diam = 12 + hs_joint_corner_cbore_depth = 12 + hs_joint_corner_diam = 15 + hs_joint_corner_inset = 15 + + def print_geometries(self): + return [ + self.hs_joint_parent() + ] + + def hs_joint_parent(self): + """ + Parent part of the Houjuu-Scarlett joint, which is composed of a Hirth + coupling, a cylindrical base, and a mounting base. + """ + hirth = nhf.joints.hirth_joint( + radius=self.hs_joint_radius, + radius_inner=self.hs_joint_radius_inner, + tooth_height=self.hs_joint_tooth_height, + base_height=self.hs_joint_ring_thickness) + hole_rect_width = self.hs_joint_base_width - 2 * self.hs_joint_corner_inset + hirth = ( + hirth + .faces("Z") + .workplane() + .rect(hole_rect_width, hole_rect_width, forConstruction=True) + .vertices() + .cboreHole( + diameter=self.hs_joint_corner_diam, + cboreDiameter=self.hs_joint_corner_cbore_diam, + cboreDepth=self.hs_joint_corner_cbore_depth) + .faces(">Z") + .workplane() + .union(hirth.move((0, 0, self.hs_joint_base_thickness)), tol=0.1) + .clean() + ) + return result + + + def wing_r1_profile(self) -> Cq.Sketch: """ Generates the first wing segment profile, with the wing root pointing in