cosplay: Touhou/Houjuu Nue #4
|
@ -52,26 +52,38 @@ class Parameters(Model):
|
||||||
wing_r1: MW.WingR = field(default_factory=lambda: MW.WingR(
|
wing_r1: MW.WingR = field(default_factory=lambda: MW.WingR(
|
||||||
name="r1",
|
name="r1",
|
||||||
shoulder_angle_bias = 15.0,
|
shoulder_angle_bias = 15.0,
|
||||||
|
s0_top_hole=False,
|
||||||
|
s0_bot_hole=True,
|
||||||
))
|
))
|
||||||
wing_r2: MW.WingR = field(default_factory=lambda: MW.WingR(
|
wing_r2: MW.WingR = field(default_factory=lambda: MW.WingR(
|
||||||
name="r2",
|
name="r2",
|
||||||
|
s0_top_hole=True,
|
||||||
|
s0_bot_hole=True,
|
||||||
))
|
))
|
||||||
wing_r3: MW.WingR = field(default_factory=lambda: MW.WingR(
|
wing_r3: MW.WingR = field(default_factory=lambda: MW.WingR(
|
||||||
name="r3",
|
name="r3",
|
||||||
shoulder_angle_bias = 15.0,
|
shoulder_angle_bias = 15.0,
|
||||||
|
s0_top_hole=True,
|
||||||
|
s0_bot_hole=False,
|
||||||
))
|
))
|
||||||
wing_l1: MW.WingL = field(default_factory=lambda: MW.WingL(
|
wing_l1: MW.WingL = field(default_factory=lambda: MW.WingL(
|
||||||
name="l1",
|
name="l1",
|
||||||
wrist_angle=-60.0,
|
wrist_angle=-60.0,
|
||||||
|
s0_top_hole=False,
|
||||||
|
s0_bot_hole=True,
|
||||||
))
|
))
|
||||||
wing_l2: MW.WingL = field(default_factory=lambda: MW.WingL(
|
wing_l2: MW.WingL = field(default_factory=lambda: MW.WingL(
|
||||||
name="l2",
|
name="l2",
|
||||||
wrist_angle=-30.0,
|
wrist_angle=-30.0,
|
||||||
shoulder_angle_bias = 15.0,
|
shoulder_angle_bias = 15.0,
|
||||||
|
s0_top_hole=True,
|
||||||
|
s0_bot_hole=True,
|
||||||
))
|
))
|
||||||
wing_l3: MW.WingL = field(default_factory=lambda: MW.WingL(
|
wing_l3: MW.WingL = field(default_factory=lambda: MW.WingL(
|
||||||
name="l3",
|
name="l3",
|
||||||
wrist_angle=-0.0,
|
wrist_angle=-0.0,
|
||||||
|
s0_top_hole=True,
|
||||||
|
s0_bot_hole=False,
|
||||||
))
|
))
|
||||||
|
|
||||||
trident: MT.Trident = field(default_factory=lambda: MT.Trident())
|
trident: MT.Trident = field(default_factory=lambda: MT.Trident())
|
||||||
|
|
|
@ -421,3 +421,9 @@ class Flexor:
|
||||||
a.constrain(tag_hole_back, f"{name_bracket_back}?conn_side", "Plane")
|
a.constrain(tag_hole_back, f"{name_bracket_back}?conn_side", "Plane")
|
||||||
if tag_dir:
|
if tag_dir:
|
||||||
a.constrain(tag_dir, f"{name_bracket_front}?conn_mid", "Axis", param=0)
|
a.constrain(tag_dir, f"{name_bracket_front}?conn_mid", "Axis", param=0)
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class ElectronicBoard:
|
||||||
|
|
||||||
|
hole_diam: float = 4.0
|
||||||
|
|
|
@ -13,7 +13,7 @@ from nhf.parts.box import box_with_centre_holes, MountingBox, Hole
|
||||||
from nhf.parts.joints import HirthJoint
|
from nhf.parts.joints import HirthJoint
|
||||||
from nhf.parts.planar import extrude_with_markers
|
from nhf.parts.planar import extrude_with_markers
|
||||||
from nhf.touhou.houjuu_nue.joints import RootJoint, ShoulderJoint, ElbowJoint, DiskJoint
|
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
|
import nhf.utils
|
||||||
|
|
||||||
@dataclass(kw_only=True)
|
@dataclass(kw_only=True)
|
||||||
|
@ -38,6 +38,13 @@ class WingProfile(Model):
|
||||||
shoulder_mid_x: float = -125.0
|
shoulder_mid_x: float = -125.0
|
||||||
shoulder_mid_y: float = 75.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
|
s1_thickness: float = 25.0
|
||||||
|
|
||||||
elbow_joint: ElbowJoint = field(default_factory=lambda: ElbowJoint(
|
elbow_joint: ElbowJoint = field(default_factory=lambda: ElbowJoint(
|
||||||
|
@ -171,7 +178,7 @@ class WingProfile(Model):
|
||||||
return result
|
return result
|
||||||
|
|
||||||
@target(name="profile-s0", kind=TargetKind.DXF)
|
@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_x = self.shoulder_tip_x
|
||||||
tip_y = self.shoulder_tip_y
|
tip_y = self.shoulder_tip_y
|
||||||
mid_x = self.shoulder_mid_x
|
mid_x = self.shoulder_mid_x
|
||||||
|
@ -197,6 +204,14 @@ class WingProfile(Model):
|
||||||
.circle(self.shoulder_joint.radius, mode='a')
|
.circle(self.shoulder_joint.radius, mode='a')
|
||||||
.circle(self.shoulder_joint.bolt.diam_head / 2, mode='s')
|
.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
|
return sketch
|
||||||
|
|
||||||
def outer_shell_s0(self) -> Cq.Workplane:
|
def outer_shell_s0(self) -> Cq.Workplane:
|
||||||
|
@ -260,19 +275,20 @@ class WingProfile(Model):
|
||||||
centred=(True, True),
|
centred=(True, True),
|
||||||
flip_y=self.flip,
|
flip_y=self.flip,
|
||||||
)
|
)
|
||||||
@submodel(name="spacer-s0-mid3")
|
@submodel(name="spacer-s0-electronic")
|
||||||
def spacer_s0_mid3(self) -> MountingBox:
|
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(
|
return MountingBox(
|
||||||
|
holes=holes,
|
||||||
|
hole_diam=self.electronic_board.hole_diam,
|
||||||
length=self.root_height,
|
length=self.root_height,
|
||||||
width=40,
|
width=170,
|
||||||
thickness=self.spacer_thickness,
|
centred=(True, True),
|
||||||
flip_y=self.flip
|
|
||||||
)
|
|
||||||
@submodel(name="spacer-s0-mid2")
|
|
||||||
def spacer_s0_mid2(self) -> MountingBox:
|
|
||||||
return MountingBox(
|
|
||||||
length=self.root_height,
|
|
||||||
width=60,
|
|
||||||
thickness=self.spacer_thickness,
|
thickness=self.spacer_thickness,
|
||||||
flip_y=self.flip
|
flip_y=self.flip
|
||||||
)
|
)
|
||||||
|
@ -281,22 +297,21 @@ class WingProfile(Model):
|
||||||
base_dx = -(self.base_width - self.root_joint.child_width) / 2 - 10
|
base_dx = -(self.base_width - self.root_joint.child_width) / 2 - 10
|
||||||
base_dy = self.root_joint.hirth_joint.joint_height
|
base_dy = self.root_joint.hirth_joint.joint_height
|
||||||
loc_tip = Cq.Location(0, -self.shoulder_joint.parent_lip_width / 2)
|
loc_tip = Cq.Location(0, -self.shoulder_joint.parent_lip_width / 2)
|
||||||
mid_spacer_loc = (
|
#mid_spacer_loc = (
|
||||||
Cq.Location.from2d(0, -self.shoulder_width/2) *
|
# Cq.Location.from2d(0, -self.shoulder_width/2) *
|
||||||
self.shoulder_axle_loc *
|
# self.shoulder_axle_loc *
|
||||||
Cq.Location.rot2d(self.shoulder_joint.angle_neutral)
|
# Cq.Location.rot2d(self.shoulder_joint.angle_neutral)
|
||||||
)
|
#)
|
||||||
tags = [
|
tags = [
|
||||||
("shoulder",
|
("shoulder",
|
||||||
self.shoulder_axle_loc *
|
self.shoulder_axle_loc *
|
||||||
self.shoulder_joint.parent_arm_loc() *
|
self.shoulder_joint.parent_arm_loc() *
|
||||||
loc_tip),
|
loc_tip),
|
||||||
("base", Cq.Location.from2d(base_dx, base_dy, 90)),
|
("base", Cq.Location.from2d(base_dx, base_dy, 90)),
|
||||||
("mid3", mid_spacer_loc * Cq.Location.from2d(90, 0)),
|
("electronic", Cq.Location.from2d(-55, 75, 64)),
|
||||||
("mid2", mid_spacer_loc * Cq.Location.from2d(150, 0)),
|
|
||||||
]
|
]
|
||||||
result = extrude_with_markers(
|
result = extrude_with_markers(
|
||||||
self.profile_s0(),
|
self.profile_s0(top=top),
|
||||||
self.panel_thickness,
|
self.panel_thickness,
|
||||||
tags,
|
tags,
|
||||||
reverse=not top,
|
reverse=not top,
|
||||||
|
@ -326,8 +341,7 @@ class WingProfile(Model):
|
||||||
for o, tag in [
|
for o, tag in [
|
||||||
(self.spacer_s0_shoulder().generate(), "shoulder"),
|
(self.spacer_s0_shoulder().generate(), "shoulder"),
|
||||||
(self.spacer_s0_base().generate(), "base"),
|
(self.spacer_s0_base().generate(), "base"),
|
||||||
(self.spacer_s0_mid3().generate(), "mid3"),
|
(self.spacer_s0_electronic().generate(), "electronic"),
|
||||||
(self.spacer_s0_mid2().generate(), "mid2"),
|
|
||||||
]:
|
]:
|
||||||
top_tag, bot_tag = "top", "bot"
|
top_tag, bot_tag = "top", "bot"
|
||||||
if self.flip:
|
if self.flip:
|
||||||
|
|
Loading…
Reference in New Issue