"""Цилиндр вводится сбоку через узкий вход. Губки расходятся и возвращаются. Для нагрузки в сторону входа требуется отдельная проверка удержания.""" 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, box, cyl, join, main, params, phase, require, sector_ring, ) MODEL_ID = "c-clip" DEFAULTS = { "radius": 6, "wall": 2.5, "height": 8, "clearance": 0.25, "deflection": 0.6, "opening_angle": 100, } NOTE = "Цилиндр вводится сбоку через узкий вход. Губки расходятся и возвращаются. Для нагрузки в сторону входа требуется отдельная проверка удержания." MODE = "elastic" def make_parts(supplied=None): p = params(DEFAULTS, supplied) r, w, h, c, f, a = [ p[k] for k in ( "radius", "wall", "height", "clearance", "deflection", "opening_angle", ) ] require(45 < a < 150 and w > 1 and r > 2, "Opening must retain the cylinder") def holder(t): bend = phase(t, 0.05, 0.3) * (1 - phase(t, 0.98, 1)) inner = r + c + f * bend outer = inner + w arc = (360 - a) / 2 - 20 * bend ring_body = sector_ring(outer, inner, -arc, arc, h, 3) return join(ring_body, box(r + 1, -h, 0, w + 4, 2 * h, h + 3)) peg = cyl(r, h, (0, 0, 3)) return [ Piece("holder", "С-образный держатель", holder(1), deform=holder), Piece( "peg", "Удерживаемый цилиндр", peg, lambda t: Pose(offset=(-4 * r * (1 - t), 0, 0)), ), ] if __name__ == "__main__": main(make_parts, DEFAULTS, MODEL_ID, __file__, NOTE, MODE)