From 560e9b54ddb748c7835b8bc6791feb1fffb187a1 Mon Sep 17 00:00:00 2001 From: Leni Aniva Date: Fri, 19 Jul 2024 16:37:47 -0700 Subject: [PATCH] feat: Child guard to prevent collision in shoulder --- nhf/touhou/houjuu_nue/joints.py | 50 +++++++++++++++++++++++---------- nhf/touhou/houjuu_nue/wing.py | 2 +- 2 files changed, 36 insertions(+), 16 deletions(-) diff --git a/nhf/touhou/houjuu_nue/joints.py b/nhf/touhou/houjuu_nue/joints.py index dc52908..57e80c9 100644 --- a/nhf/touhou/houjuu_nue/joints.py +++ b/nhf/touhou/houjuu_nue/joints.py @@ -252,14 +252,19 @@ class ShoulderJoint(Model): parent_lip_ext: float = 40.0 parent_lip_guard_height: float = 8.0 - # Measured from centre of axle - child_lip_length: float = 45.0 + # Generates a child guard which covers up the internals. The lip length is + # relative to the +X surface of the guard. + child_guard_ext: float = 30.0 + child_guard_width: float = 25.0 + # guard length measured from axle + child_lip_length: float = 40.0 child_lip_width: float = 20.0 child_conn_hole_diam: float = 6.0 # Measured from centre of axle - child_conn_hole_pos: list[float] = field(default_factory=lambda: [25, 35]) + child_conn_hole_pos: list[float] = field(default_factory=lambda: [15, 25]) child_core_thickness: float = 3.0 + # Rotates the torsion joint to avoid collisions or for some other purpose axis_rotate_bot: float = 225.0 axis_rotate_top: float = -225.0 @@ -345,7 +350,6 @@ class ShoulderJoint(Model): """ joint = self.torsion_joint - assert all(r > joint.radius_rider for r in self.child_conn_hole_pos) assert all(r < self.child_lip_length for r in self.child_conn_hole_pos) # Half of the height of the bridging cylinder @@ -371,6 +375,30 @@ class ShoulderJoint(Model): .assemble() .circle(radius_core_inner, mode='s') ) + core_guard = ( + Cq.Workplane('XY') + .box( + length=self.child_guard_ext, + width=self.child_guard_width, + height=self.height, + centered=(False, True, True), + ) + .copyWorkplane(Cq.Workplane('XY')) + .cylinder( + radius=self.radius, + height=self.height, + combine='cut', + centered=True, + ) + .copyWorkplane(Cq.Workplane('XY')) + .box( + length=self.child_guard_ext, + width=self.child_lip_width, + height=self.height - self.torsion_joint.total_height * 2, + combine='cut', + centered=(False, True, True), + ) + ) core = ( Cq.Workplane('XY') .placeSketch(core_profile1) @@ -381,6 +409,7 @@ class ShoulderJoint(Model): .toPending() .extrude(dh * 2) .translate(Cq.Vector(0, 0, -dh)) + .union(core_guard) ) assert self.child_lip_width / 2 <= joint.radius_rider lip_thickness = joint.rider_disk_height @@ -391,15 +420,6 @@ class ShoulderJoint(Model): hole_loc=self.child_conn_hole_pos, hole_diam=self.child_conn_hole_diam, ) - lip = ( - lip - .copyWorkplane(Cq.Workplane('XY')) - .cylinder( - radius=joint.radius_rider, - height=lip_thickness, - centered=(True, True, False), - combine='cut') - ) theta = self.torsion_joint.spring.angle_neutral - self.torsion_joint.rider_slot_span loc_rotate = Cq.Location((0, 0, 0), (1, 0, 0), 180) loc_axis_rotate_bot = Cq.Location((0, 0, 0), (0, 0, 1), self.axis_rotate_bot + self.angle_neutral) @@ -412,9 +432,9 @@ class ShoulderJoint(Model): .add(joint.rider(rider_slot_begin=180), name="rider_bot", loc=loc_axis_rotate_bot * Cq.Location((0, 0, -dh), (0, 0, 1), -90) * loc_rotate) .add(lip, name="lip_top", - loc=Cq.Location((0, 0, dh))) + loc=Cq.Location((self.child_guard_ext, 0, dh))) .add(lip, name="lip_bot", - loc=Cq.Location((0, 0, -dh)) * loc_rotate) + loc=Cq.Location((self.child_guard_ext, 0, -dh)) * loc_rotate) ) return result diff --git a/nhf/touhou/houjuu_nue/wing.py b/nhf/touhou/houjuu_nue/wing.py index 03f0fd9..c5bd232 100644 --- a/nhf/touhou/houjuu_nue/wing.py +++ b/nhf/touhou/houjuu_nue/wing.py @@ -96,7 +96,7 @@ class WingProfile(Model): self.shoulder_joint.angle_neutral = -self.shoulder_angle_neutral - self.shoulder_angle_bias self.shoulder_axle_loc = Cq.Location.from2d(self.shoulder_tip_x, self.shoulder_tip_y - self.shoulder_width / 2, self.shoulder_angle_bias) - + self.shoulder_joint.child_guard_width = self.s1_thickness + self.panel_thickness * 2 assert self.spacer_thickness == self.root_joint.child_mount_thickness @submodel(name="shoulder-joint")