"""Выступ пружины входит в лунку ползуна. Фиксатор задаёт положение с ограниченным усилием. Деформация показана заданной формой балки.""" 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, section MODEL_ID = "detent" DEFAULTS = { "beam_length": 25, "beam_width": 6, "beam_thickness": 1.4, "bulge_radius": 2, "clearance": 0.3, "deflection": 2.2, "slide": 24, } NOTE = "Выступ пружины входит в лунку ползуна. Фиксатор задаёт положение с ограниченным усилием. Деформация показана заданной формой балки." MODE = "elastic" def make_parts(supplied=None): p = params(DEFAULTS, supplied) l, w, b, r, c, f, s = [ p[k] for k in ( "beam_length", "beam_width", "beam_thickness", "bulge_radius", "clearance", "deflection", "slide", ) ] require(l > 12 and r > 1 and f >= r and f < 5, "Allow spring travel above the base") def spring(t): bend = f * phase(t, 0.05, 0.15) * (1 - phase(t, 0.9, 1)) low = [(-l + l * i / 8, 8 - bend * (i / 8) ** 2) for i in range(9)] high = [(-l + l * i / 8, 8 + b - bend * (i / 8) ** 2) for i in range(8, -1, -1)] beam = section(low + high, -w / 2, w) bump = cyl(r, w, (0, -w / 2, 8 + b), (0, 1, 0)).translated(V(0, 0, -bend)) return join( box(-l - 5, -w / 2, 0, l + 18, w, 3), box(-l - 5, -w / 2, 3, 5, w, 5 + b), beam, bump, ) z = 8 + b slider = box(-12, -w / 2 - 2, z, 30, w + 4, 6).cut( cyl(r + c, w + 6, (0, -w / 2 - 3, z), (0, 1, 0)) ) return [ Piece("spring", "Основание с пружинным выступом", spring(1), deform=spring), Piece( "slider", "Ползун с лункой", slider, lambda t: Pose(offset=(s * (1 - t), 0, 0)), ), ] if __name__ == "__main__": main(make_parts, DEFAULTS, MODEL_ID, __file__, NOTE, MODE)