cosplay: Touhou/Houjuu Nue #4

Open
aniva wants to merge 189 commits from touhou/houjuu-nue into main
3 changed files with 32 additions and 24 deletions
Showing only changes of commit cdb46263f8 - Show all commits

View File

@ -101,7 +101,12 @@ class HirthJoint:
( (
result result
.polyline([(0, 0, 0), (1, 0, 0)], forConstruction=True) .polyline([(0, 0, 0), (1, 0, 0)], forConstruction=True)
.tag("dir") .tag("dirX")
)
(
result
.polyline([(0, 0, 0), (0, 1, 0)], forConstruction=True)
.tag("dirY")
) )
return result return result
@ -109,12 +114,15 @@ class HirthJoint:
assembly: Cq.Assembly, assembly: Cq.Assembly,
parent: str, parent: str,
child: str, child: str,
angle: int = 0): offset: int = 0):
angle = offset * self.tooth_angle
( (
assembly assembly
.constrain(f"{parent}?mate", f"{child}?mate", "Plane") .constrain(f"{parent}?mate", f"{child}?mate", "Plane")
.constrain(f"{parent}?dir", f"{child}?dir", .constrain(f"{parent}?dirX", f"{child}?dirX",
"Axis", param=angle * self.tooth_angle) "Axis", param=angle)
.constrain(f"{parent}?dirY", f"{child}?dirX",
"Axis", param=90 - angle)
) )
def assembly(self, offset: int = 1): def assembly(self, offset: int = 1):
@ -138,17 +146,17 @@ class HirthJoint:
self.generate(is_mated=True) self.generate(is_mated=True)
.union(tab) .union(tab)
) )
angle = offset * self.tooth_angle
result = ( result = (
Cq.Assembly() Cq.Assembly()
.addS(obj1, name="obj1", role=Role.PARENT) .addS(obj1, name="obj1", role=Role.PARENT)
.addS(obj2, name="obj2", role=Role.CHILD) .addS(obj2, name="obj2", role=Role.CHILD)
.constrain("obj1", "Fixed")
.constrain("obj1?mate", "obj2?mate", "Plane")
.constrain("obj1?dir", "obj2?dir", "Axis", param=angle)
.solve()
) )
return result self.add_constraints(
result,
parent="obj1",
child="obj2",
offset=offset)
return result.solve()
def comma_joint(radius=30, def comma_joint(radius=30,
shaft_radius=10, shaft_radius=10,

View File

@ -30,6 +30,7 @@ s1, s2, s3. The joints are named (from root to tip)
shoulder, elbow, wrist in analogy with human anatomy. shoulder, elbow, wrist in analogy with human anatomy.
""" """
from dataclasses import dataclass, field from dataclasses import dataclass, field
from typing import Optional
import cadquery as Cq import cadquery as Cq
from nhf.build import Model, TargetKind, target, assembly from nhf.build import Model, TargetKind, target, assembly
from nhf.parts.joints import HirthJoint, TorsionJoint from nhf.parts.joints import HirthJoint, TorsionJoint
@ -147,11 +148,11 @@ class Parameters(Model):
@assembly() @assembly()
def wing_r1_assembly(self) -> Cq.Assembly: def wing_r1_assembly(self, parts: Optional[list[str]] = None) -> Cq.Assembly:
return self.wing_profile.assembly() return self.wing_profile.assembly(parts)
@assembly() @assembly()
def wings_harness_assembly(self) -> Cq.Assembly: def wings_harness_assembly(self, parts: Optional[list[str]] = None) -> Cq.Assembly:
""" """
Assembly of harness with all the wings Assembly of harness with all the wings
""" """
@ -160,13 +161,13 @@ class Parameters(Model):
result = ( result = (
Cq.Assembly() Cq.Assembly()
.add(self.harness_assembly(), name="harness", loc=Cq.Location((0, 0, 0))) .add(self.harness_assembly(), name="harness", loc=Cq.Location((0, 0, 0)))
.add(self.wing_r1_assembly(), name="wing_r1") .add(self.wing_r1_assembly(parts), name="wing_r1")
.add(self.wing_r1_assembly(), name="wing_r2") .add(self.wing_r1_assembly(parts), name="wing_r2")
.add(self.wing_r1_assembly(), name="wing_r3") .add(self.wing_r1_assembly(parts), name="wing_r3")
) )
self.hs_hirth_joint.add_constraints(result, "harness/r1", "wing_r1/s0/hs", angle=9) self.hs_hirth_joint.add_constraints(result, "harness/r1", "wing_r1/s0/hs", offset=9)
self.hs_hirth_joint.add_constraints(result, "harness/r2", "wing_r2/s0/hs", angle=8) self.hs_hirth_joint.add_constraints(result, "harness/r2", "wing_r2/s0/hs", offset=8)
self.hs_hirth_joint.add_constraints(result, "harness/r3", "wing_r3/s0/hs", angle=7) self.hs_hirth_joint.add_constraints(result, "harness/r3", "wing_r3/s0/hs", offset=7)
return result.solve() return result.solve()
@assembly(collision_check=False) @assembly(collision_check=False)

View File

@ -192,7 +192,7 @@ class WingProfile(Model):
.constrain(f"{tag}?top", f"top?{tag}", "Plane") .constrain(f"{tag}?top", f"top?{tag}", "Plane")
.constrain(f"{tag}?dir", f"top?{tag}_dir", "Axis") .constrain(f"{tag}?dir", f"top?{tag}_dir", "Axis")
) )
hirth = self.base_joint.generate() hirth = self.base_joint.generate(is_mated=True)
( (
result result
.addS(hirth, name="hs", role=Role.CHILD, material=self.mat_hs_joint) .addS(hirth, name="hs", role=Role.CHILD, material=self.mat_hs_joint)
@ -614,8 +614,7 @@ class WingProfile(Model):
.constrain("s3/wrist_bot?conn0", "wrist/child/bot?conn0", "Plane") .constrain("s3/wrist_bot?conn0", "wrist/child/bot?conn0", "Plane")
.constrain("s3/wrist_bot?conn1", "wrist/child/bot?conn1", "Plane") .constrain("s3/wrist_bot?conn1", "wrist/child/bot?conn1", "Plane")
) )
if len(parts) > 1:
result.solve()
return result.solve() return result