"""Заходной скос отгибает балку, затем зуб возвращается за кромку. Форма прогиба задана для показа сборки; напряжения и ресурс требуют пробы.""" import FreeCAD # noqa: F401 (initialize the CAD runtime first) # isort: split import math import sys from pathlib import Path sys.path.insert(0, str(Path(__file__).resolve().parents[1])) from common import Piece, Pose, box, join, main, params, phase, require, section MODEL_ID = "cantilever" DEFAULTS = { "beam_length": 28, "beam_width": 8, "beam_thickness": 1.6, "height": 12, "tooth_depth": 2, "deflection": 3, "clearance": 0.25, } NOTE = "Заходной скос отгибает балку, затем зуб возвращается за кромку. Форма прогиба задана для показа сборки; напряжения и ресурс требуют пробы." MODE = "elastic" def make_parts(supplied=None): p = params(DEFAULTS, supplied) l, w, b, h, d, f, c = [ p[k] for k in ( "beam_length", "beam_width", "beam_thickness", "height", "tooth_depth", "deflection", "clearance", ) ] require( l > 12 and h > f + 4 and f > d and w > 3, "Beam needs working length and deflection clearance", ) base = join( box(l - 3, -w / 2 - 4, 0, 15, w + 8, 3), box(l - 3, -w / 2 - 4, 3, 3, w + 8, h - d - c - 3), box(l + 9, -w / 2 - 4, 3, 3, w + 8, h + b + 6 - 3), box(l - 3, -w / 2 - 4, h + b + 5, 15, w + 8, 2), ) def beam(t): bend = f * math.sin(math.pi * phase(t, 0.18, 0.86)) lower = [(l * i / 8, h + bend * (i / 8) ** 2) for i in range(9)] outline = ( lower + [(l, h - d + bend), (l + 4, h - d + bend), (l + 1, h + b + bend)] + [(l * i / 8, h + b + bend * (i / 8) ** 2) for i in range(8, -1, -1)] ) return join(box(-4, -w / 2, 4, 4, w, h + b - 4), section(outline, -w / 2, w)) return [ Piece("receiver", "Ответная кромка", base), Piece( "latch", "Консольная защёлка", beam(1), lambda t: Pose(offset=(-18 * (1 - t), 0, 0)), deform=beam, ), ] if __name__ == "__main__": main(make_parts, DEFAULTS, MODEL_ID, __file__, NOTE, MODE)