From f665d0d53ea0a3d18e3d8ff00fc9725ebf88a17a Mon Sep 17 00:00:00 2001 From: Leni Aniva Date: Sun, 21 Jul 2024 23:34:02 -0700 Subject: [PATCH] feat: Add mount for onboard electronics --- nhf/touhou/houjuu_nue/__init__.py | 12 ++++++ nhf/touhou/houjuu_nue/electronics.py | 6 +++ nhf/touhou/houjuu_nue/wing.py | 60 +++++++++++++++++----------- 3 files changed, 55 insertions(+), 23 deletions(-) diff --git a/nhf/touhou/houjuu_nue/__init__.py b/nhf/touhou/houjuu_nue/__init__.py index 18a0758..da2d1c1 100644 --- a/nhf/touhou/houjuu_nue/__init__.py +++ b/nhf/touhou/houjuu_nue/__init__.py @@ -52,26 +52,38 @@ class Parameters(Model): wing_r1: MW.WingR = field(default_factory=lambda: MW.WingR( name="r1", shoulder_angle_bias = 15.0, + s0_top_hole=False, + s0_bot_hole=True, )) wing_r2: MW.WingR = field(default_factory=lambda: MW.WingR( name="r2", + s0_top_hole=True, + s0_bot_hole=True, )) wing_r3: MW.WingR = field(default_factory=lambda: MW.WingR( name="r3", shoulder_angle_bias = 15.0, + s0_top_hole=True, + s0_bot_hole=False, )) wing_l1: MW.WingL = field(default_factory=lambda: MW.WingL( name="l1", wrist_angle=-60.0, + s0_top_hole=False, + s0_bot_hole=True, )) wing_l2: MW.WingL = field(default_factory=lambda: MW.WingL( name="l2", wrist_angle=-30.0, shoulder_angle_bias = 15.0, + s0_top_hole=True, + s0_bot_hole=True, )) wing_l3: MW.WingL = field(default_factory=lambda: MW.WingL( name="l3", wrist_angle=-0.0, + s0_top_hole=True, + s0_bot_hole=False, )) trident: MT.Trident = field(default_factory=lambda: MT.Trident()) diff --git a/nhf/touhou/houjuu_nue/electronics.py b/nhf/touhou/houjuu_nue/electronics.py index 2cf1c4e..b07bdd7 100644 --- a/nhf/touhou/houjuu_nue/electronics.py +++ b/nhf/touhou/houjuu_nue/electronics.py @@ -421,3 +421,9 @@ class Flexor: a.constrain(tag_hole_back, f"{name_bracket_back}?conn_side", "Plane") if tag_dir: a.constrain(tag_dir, f"{name_bracket_front}?conn_mid", "Axis", param=0) + + +@dataclass +class ElectronicBoard: + + hole_diam: float = 4.0 diff --git a/nhf/touhou/houjuu_nue/wing.py b/nhf/touhou/houjuu_nue/wing.py index fe99ad4..0f7419f 100644 --- a/nhf/touhou/houjuu_nue/wing.py +++ b/nhf/touhou/houjuu_nue/wing.py @@ -13,7 +13,7 @@ from nhf.parts.box import box_with_centre_holes, MountingBox, Hole from nhf.parts.joints import HirthJoint from nhf.parts.planar import extrude_with_markers from nhf.touhou.houjuu_nue.joints import RootJoint, ShoulderJoint, ElbowJoint, DiskJoint -from nhf.touhou.houjuu_nue.electronics import LINEAR_ACTUATOR_10, LINEAR_ACTUATOR_50 +from nhf.touhou.houjuu_nue.electronics import LINEAR_ACTUATOR_10, LINEAR_ACTUATOR_50, ElectronicBoard import nhf.utils @dataclass(kw_only=True) @@ -38,6 +38,13 @@ class WingProfile(Model): shoulder_mid_x: float = -125.0 shoulder_mid_y: float = 75.0 + s0_hole_loc: Cq.Location = Cq.Location.from2d(-25, 33) + s0_hole_diam: float = 15.0 + s0_top_hole: bool = False + s0_bot_hole: bool = True + + electronic_board: ElectronicBoard = field(default_factory=lambda: ElectronicBoard()) + s1_thickness: float = 25.0 elbow_joint: ElbowJoint = field(default_factory=lambda: ElbowJoint( @@ -171,7 +178,7 @@ class WingProfile(Model): return result @target(name="profile-s0", kind=TargetKind.DXF) - def profile_s0(self) -> Cq.Sketch: + def profile_s0(self, top: bool = True) -> Cq.Sketch: tip_x = self.shoulder_tip_x tip_y = self.shoulder_tip_y mid_x = self.shoulder_mid_x @@ -197,6 +204,14 @@ class WingProfile(Model): .circle(self.shoulder_joint.radius, mode='a') .circle(self.shoulder_joint.bolt.diam_head / 2, mode='s') ) + top = top == self.flip + if (self.s0_top_hole and top) or (self.s0_bot_hole and not top): + sketch = ( + sketch + .reset() + .push([self.s0_hole_loc.to2d_pos()]) + .circle(self.s0_hole_diam / 2, mode='s') + ) return sketch def outer_shell_s0(self) -> Cq.Workplane: @@ -260,19 +275,20 @@ class WingProfile(Model): centred=(True, True), flip_y=self.flip, ) - @submodel(name="spacer-s0-mid3") - def spacer_s0_mid3(self) -> MountingBox: + @submodel(name="spacer-s0-electronic") + def spacer_s0_electronic(self) -> MountingBox: + holes = [ + Hole(x=30, y=80), + Hole(x=30, y=-80), + Hole(x=-30, y=80), + Hole(x=-30, y=-80), + ] return MountingBox( + holes=holes, + hole_diam=self.electronic_board.hole_diam, length=self.root_height, - width=40, - thickness=self.spacer_thickness, - flip_y=self.flip - ) - @submodel(name="spacer-s0-mid2") - def spacer_s0_mid2(self) -> MountingBox: - return MountingBox( - length=self.root_height, - width=60, + width=170, + centred=(True, True), thickness=self.spacer_thickness, flip_y=self.flip ) @@ -281,22 +297,21 @@ class WingProfile(Model): base_dx = -(self.base_width - self.root_joint.child_width) / 2 - 10 base_dy = self.root_joint.hirth_joint.joint_height loc_tip = Cq.Location(0, -self.shoulder_joint.parent_lip_width / 2) - mid_spacer_loc = ( - Cq.Location.from2d(0, -self.shoulder_width/2) * - self.shoulder_axle_loc * - Cq.Location.rot2d(self.shoulder_joint.angle_neutral) - ) + #mid_spacer_loc = ( + # Cq.Location.from2d(0, -self.shoulder_width/2) * + # self.shoulder_axle_loc * + # Cq.Location.rot2d(self.shoulder_joint.angle_neutral) + #) tags = [ ("shoulder", self.shoulder_axle_loc * self.shoulder_joint.parent_arm_loc() * loc_tip), ("base", Cq.Location.from2d(base_dx, base_dy, 90)), - ("mid3", mid_spacer_loc * Cq.Location.from2d(90, 0)), - ("mid2", mid_spacer_loc * Cq.Location.from2d(150, 0)), + ("electronic", Cq.Location.from2d(-55, 75, 64)), ] result = extrude_with_markers( - self.profile_s0(), + self.profile_s0(top=top), self.panel_thickness, tags, reverse=not top, @@ -326,8 +341,7 @@ class WingProfile(Model): for o, tag in [ (self.spacer_s0_shoulder().generate(), "shoulder"), (self.spacer_s0_base().generate(), "base"), - (self.spacer_s0_mid3().generate(), "mid3"), - (self.spacer_s0_mid2().generate(), "mid2"), + (self.spacer_s0_electronic().generate(), "electronic"), ]: top_tag, bot_tag = "top", "bot" if self.flip: