"""Ушки вводятся через два окна и поворачиваются в кольцевой дорожке. Показана геометрия байонета, стопор от самоповорота подбирается под нагрузку.""" 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 Piece, Pose, V, box, cyl, join, main, params, phase, require, ring MODEL_ID = "bayonet" DEFAULTS = { "outer_radius": 18, "bore_radius": 10, "height": 14, "ear_depth": 4, "ear_width": 4, "turn_angle": 60, "clearance": 0.3, } NOTE = "Ушки вводятся через два окна и поворачиваются в кольцевой дорожке. Показана геометрия байонета, стопор от самоповорота подбирается под нагрузку." MODE = "rigid" def make_parts(supplied=None): p = params(DEFAULTS, supplied) ro, ri, h, e, w, a, c = [ p[k] for k in ( "outer_radius", "bore_radius", "height", "ear_depth", "ear_width", "turn_angle", "clearance", ) ] require( ro > ri + e + c + 2 and h > 9 and ri > 5 and w < ri, "Need material around the internal race", ) base = ring(ro, ri, h).cut(cyl(ri + e + c, 2 + 2 * c, (0, 0, 5 - c))) for sign in (-1, 1): x = ri - 1 if sign > 0 else -ri - e - 1 base = base.cut(box(x, -w / 2 - c, 5 - c, e + 2, w + 2 * c, h)) plug = join(cyl(ri - c, h - 3 + c, (0, 0, 3)), cyl(ro - 2, 3, (0, 0, h + c))) for sign in (-1, 1): ear = box(ri - 1 if sign > 0 else -ri - e, -w / 2, 5, e + 1, w, 2) plug = join(plug, ear.rotated(V(), V(0, 0, 1), a)) return [ Piece("receiver", "Кольцо байонета", base), Piece( "plug", "Вставка с ушками", plug, lambda t: Pose( offset=(0, 0, (h + 8) * (1 - phase(t, 0, 0.5))), angle=-a * (1 - phase(t, 0.5, 1)), ), ), ] if __name__ == "__main__": main(make_parts, DEFAULTS, MODEL_ID, __file__, NOTE, MODE)