59 lines
2.0 KiB
Python
59 lines
2.0 KiB
Python
|
"""
|
||
|
A fibre, for bearing tension
|
||
|
"""
|
||
|
import cadquery as Cq
|
||
|
from dataclasses import dataclass
|
||
|
import nhf.utils
|
||
|
|
||
|
def tension_fibre(
|
||
|
length: float,
|
||
|
hole_diam: float,
|
||
|
hole_twist: float=0,
|
||
|
thickness: float=0.5) -> Cq.Workplane:
|
||
|
"""
|
||
|
A fibre which holds tension, with an eyes on each end.
|
||
|
|
||
|
"""
|
||
|
eye_female = Cq.Solid.makeTorus(
|
||
|
radius1=hole_diam/2 + thickness/2,
|
||
|
radius2=thickness/2,
|
||
|
dir=(1,0,0),
|
||
|
)
|
||
|
hole_length_male = hole_diam * 2.5
|
||
|
hole_height_male = hole_diam * 1.2
|
||
|
eye_male = Cq.Solid.makeBox(
|
||
|
length=hole_length_male + thickness * 2,
|
||
|
width=thickness,
|
||
|
height=hole_height_male + thickness * 2,
|
||
|
).located(
|
||
|
Cq.Location((-hole_length_male/2-thickness, -thickness/2, -hole_height_male/2-thickness))
|
||
|
).cut(Cq.Solid.makeBox(
|
||
|
length=hole_length_male,
|
||
|
width=thickness,
|
||
|
height=hole_height_male,
|
||
|
).located(Cq.Location((-hole_length_male/2, -thickness/2, -hole_height_male/2))))
|
||
|
height = length - hole_diam - thickness
|
||
|
assert height > 0, "String is too short to support the given hole sizes"
|
||
|
h1 = length/2 - hole_diam/2 - thickness/2
|
||
|
h2 = length/2 - hole_height_male - thickness/2
|
||
|
result = (
|
||
|
Cq.Workplane('XY')
|
||
|
.cylinder(
|
||
|
radius=thickness/2,
|
||
|
height=h1,
|
||
|
centered=(True, True, False),
|
||
|
)
|
||
|
.copyWorkplane(Cq.Workplane('YX'))
|
||
|
.cylinder(
|
||
|
radius=thickness/2,
|
||
|
height=h2,
|
||
|
centered=(True, True, False),
|
||
|
)
|
||
|
.union(eye_female.located(Cq.Location((0, 0,length/2))))
|
||
|
.union(eye_male.located(Cq.Location((0, 0,-length/2+hole_height_male/2+thickness/2), (0,0,1), hole_twist)))
|
||
|
)
|
||
|
result.copyWorkplane(Cq.Workplane(Cq.Plane(origin=(0,0,length/2), normal=(1,0,0)))).tagPlane("female")
|
||
|
conn1_normal, _ = (Cq.Location((0,0,0),(0,0,1),hole_twist) * Cq.Location((1,0,0))).toTuple()
|
||
|
result.copyWorkplane(Cq.Workplane(Cq.Plane(origin=(0,0,-length/2), normal=conn1_normal))).tagPlane("male")
|
||
|
return result
|