"""Ось вставляется в две проушины. С-образная скоба входит в кольцевую канавку снаружи. Защёлкивание скобы требует упругой деформации.""" 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, sector_ring, ) MODEL_ID = "pin-clip" DEFAULTS = { "spacing": 20, "wall": 4, "shaft_radius": 2.8, "groove_radius": 2, "groove_width": 2, "clearance": 0.2, } NOTE = "Ось вставляется в две проушины. С-образная скоба входит в кольцевую канавку снаружи. Защёлкивание скобы требует упругой деформации." MODE = "elastic" def make_parts(supplied=None): p = params(DEFAULTS, supplied) s, w, r, g, gw, c = [ p[k] for k in ( "spacing", "wall", "shaft_radius", "groove_radius", "groove_width", "clearance", ) ] require(r > g > 1 and gw > 2 * c + 0.8 and s > 2 * w, "Groove must retain the clip") base = box(-s / 2 - w - 3, -8, 0, s + 2 * w + 6, 16, 3) for x in (-s / 2 - w, s / 2): base = join( base, box(x, -6, 3, w, 12, 14).cut(cyl(r + c, w + 2, (x - 1, 0, 10), (1, 0, 0))), ) end = s / 2 + w + c shaft = join( cyl(r, s + 2 * w + gw + 2 * c, (-s / 2 - w - c, 0, 10), (1, 0, 0)), cyl(r + 2, 2, (-s / 2 - w - c - 2, 0, 10), (1, 0, 0)), ) shaft = shaft.cut(cyl(r + 0.1, gw, (end, 0, 10), (1, 0, 0))).fuse( cyl(g, gw, (end, 0, 10), (1, 0, 0)) ) def clip_form(t): expand = 0.8 * phase(t, 0.5, 0.7) * (1 - phase(t, 0.97, 1)) return ( sector_ring(r + 2 + expand, g + c + expand, 45, 315, gw - 2 * c) .rotated(V(), V(0, 1, 0), 90) .translated(V(end + c, 0, 10)) ) clip = clip_form(1) return [ Piece("receiver", "Основание с проушинами", base), Piece( "shaft", "Ось с канавкой", shaft, lambda t: Pose(offset=(-32 * (1 - phase(t, 0, 0.55)), 0, 0)), ), Piece( "clip", "Разрезная стопорная скоба", clip, lambda t: Pose(offset=(0, 0, 10 * (1 - phase(t, 0.55, 1)))), deform=clip_form, ), ] if __name__ == "__main__": main(make_parts, DEFAULTS, MODEL_ID, __file__, NOTE, MODE)