"""Две половины гнезда собираются вокруг шара и стягиваются винтами. После затяжки шар поворачивается в пределах горловины. Усилие фиксации угла проверяется пробой.""" import FreeCAD # noqa: F401 (initialize the CAD runtime first) # isort: split import sys from pathlib import Path sys.path.insert(0, str(Path(__file__).resolve().parents[1])) from common import ( Part, Piece, Pose, V, box, cyl, hexagon, join, main, params, phase, require, ) MODEL_ID = "ball-joint" DEFAULTS = { "ball_radius": 8, "socket_wall": 4, "stem_radius": 3, "clearance": 0.25, "tilt_angle": 22, "screw_radius": 1.5, "screw_pitch": 0.7, } NOTE = "Металлические винты и гайки представлены габаритными моделями. Две половины гнезда собираются вокруг шара и стягиваются винтами. После затяжки шар поворачивается в пределах горловины. Усилие фиксации угла проверяется пробой." MODE = "rigid" def make_parts(supplied=None): p = params(DEFAULTS, supplied) r, w, s, c, a, sr, pitch = [ p[k] for k in ( "ball_radius", "socket_wall", "stem_radius", "clearance", "tilt_angle", "screw_radius", "screw_pitch", ) ] require( r > s + 3 and w > 2 and 0 < a < 28 and sr > pitch, "Neck must leave a retaining rim", ) ro = r + w z = r + 4 ear = ro + 1 shell = ( cyl(ro, 2 * r + 2, (0, 0, 2)) .cut(Part.makeSphere(r + c, V(0, 0, z))) .cut(cyl(r - 1, 2 * r, (0, 0, z + 4))) ) for y in (-ear, ear): shell = join(shell, box(-6, y - 3, 8, 12, 6, 6)) nuts = [] bolts = [] bolt = join( cyl(sr, 14, (-7, 0, 11), (1, 0, 0)), cyl(sr + 1.3, 2, (-9, 0, 11), (1, 0, 0)) ) for j, y in enumerate((-ear, ear)): shell = shell.cut(cyl(sr + c, 16, (-8, y, 11), (1, 0, 0))) pocket = hexagon(3 + c, 3).rotated(V(), V(0, 1, 0), 90).translated(V(4, y, 11)) shell = shell.cut(pocket) nut = ( hexagon(3, 2) .rotated(V(), V(0, 1, 0), 90) .translated(V(4, y, 11)) .cut(cyl(sr + c, 4, (3, y, 11), (1, 0, 0))) ) nuts.append( Piece( f"nut{j}", "Гайка стяжки", nut, lambda t: Pose(offset=(18 * (1 - phase(t, 0, 0.5)), 0, 0)), role="hardware", ) ) bolts.append( Piece( f"bolt{j}", "Стяжной винт", bolt.translated(V(0, y, 0)), lambda t, y=y: Pose( offset=(-24 * (1 - phase(t, 0.5, 1)), 0, 0), angle=-360 * 24 * (1 - phase(t, 0.5, 1)) / pitch, axis=(1, 0, 0), pivot=(0, y, 11), ), role="hardware", ) ) left = shell.common( box(-ro + 1, -ear - 5, 0, ro - 1 - c / 2, 2 * ear + 10, 3 * r + 10) ) right = shell.common( box(c / 2, -ear - 5, 0, ro - 1 - c / 2, 2 * ear + 10, 3 * r + 10) ) ball = join(Part.makeSphere(r, V(0, 0, z)), cyl(s, r + 10, (0, 0, z + r - 1))) return [ Piece("left", "Левая половина гнезда", left), Piece( "right", "Правая половина гнезда", right, lambda t: Pose(offset=(18 * (1 - phase(t, 0, 0.5)), 0, 0)), ), Piece( "ball", "Шар со стойкой", ball, lambda t: Pose(angle=a * phase(t, 0.6, 1), axis=(0, 1, 0), pivot=(0, 0, z)), ), *nuts, *bolts, ] if __name__ == "__main__": main(make_parts, DEFAULTS, MODEL_ID, __file__, NOTE, MODE)