"""Две упругие лапки проходят отверстие и раскрываются под пакетом панелей. Зацепы доступны снизу для сжатия.""" 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, section MODEL_ID = "split-pin" DEFAULTS = { "panel_width": 28, "panel_thickness": 3, "hole_radius": 3.2, "head_radius": 5.5, "leg_width": 1.5, "tooth_radius": 4, "deflection": 1.4, "clearance": 0.3, } NOTE = "Две упругие лапки проходят отверстие и раскрываются под пакетом панелей. Зацепы доступны снизу для сжатия." MODE = "elastic" def make_parts(supplied=None): p = params(DEFAULTS, supplied) w, b, r, head, l, tooth, f, c = [ p[k] for k in ( "panel_width", "panel_thickness", "hole_radius", "head_radius", "leg_width", "tooth_radius", "deflection", "clearance", ) ] require( head > r > l + 1 and tooth > r and f > tooth - r and w > 2 * head + 4, "Head and hooks must retain the panels", ) lower = box(-w / 2, -w / 2, 6, w, w, b).cut(cyl(r, b + 2, (0, 0, 5))) upper = box(-w / 2, -w / 2, 6 + b + c, w, w, b).cut( cyl(r, b + 2, (0, 0, 5 + b + c)) ) z = 6 + 2 * b + 2 * c def pin(t): bend = f * phase(t, 0.15, 0.3) * (1 - phase(t, 0.99, 1)) result = cyl(head, 2, (0, 0, z)) for sign in (-1, 1): pts = [ (1, z + 0.1), (1 + l, z + 0.1), (1 + l - bend, 5.7), (tooth - bend, 5.7), (1 + l - bend, 3.5), (1 - bend / 2, 3.5), ] result = join(result, section([(sign * x, zz) for x, zz in pts], -1.5, 3)) return result return [ Piece("lower", "Нижняя панель", lower), Piece("upper", "Верхняя панель", upper), Piece( "pin", "Разрезной штифт с зубьями", pin(1), lambda t: Pose(offset=(0, 0, 17 * (1 - t))), deform=pin, ), ] if __name__ == "__main__": main(make_parts, DEFAULTS, MODEL_ID, __file__, NOTE, MODE)