"""Головки проходят через широкие входы. Сдвиг переводит шейки в узкие пазы. Отдельный стопор обратного сдвига потребуется в нагруженном изделии.""" 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 MODEL_ID = "keyhole" DEFAULTS = { "width": 38, "length": 44, "plate_thickness": 3, "head_radius": 5, "neck_radius": 2.5, "slide": 14, "clearance": 0.3, } NOTE = "Головки проходят через широкие входы. Сдвиг переводит шейки в узкие пазы. Отдельный стопор обратного сдвига потребуется в нагруженном изделии." MODE = "rigid" def make_parts(supplied=None): p = params(DEFAULTS, supplied) w, l, b, r, n, s, c = [ p[k] for k in ( "width", "length", "plate_thickness", "head_radius", "neck_radius", "slide", "clearance", ) ] require( r > n + c and l > s + 2 * r + 4 and w > 4 * r + 6, "Head, neck and openings must fit", ) base = box(-w / 2, -l / 2, 0, w, l, 3) plate = box(-w / 2, -r - 3, 10, w, l, b) for x in (-w / 4, w / 4): base = join(base, cyl(n, 10 + c, (x, 0, 3)), cyl(r, 2, (x, 0, 10 + b + c))) opening = join( cyl(r + c, b + 2, (x, s, 9)), box(x - n - c, 0, 9, 2 * (n + c), s, b + 2), cyl(n + c, b + 2, (x, 0, 9)), ) plate = plate.cut(opening) return [ Piece("receiver", "Основание с грибками", base), Piece( "plate", "Панель с замочными отверстиями", plate, lambda t: Pose( offset=(0, -s * (1 - phase(t, 0.5, 1)), 16 * (1 - phase(t, 0, 0.5))) ), ), ] if __name__ == "__main__": main(make_parts, DEFAULTS, MODEL_ID, __file__, NOTE, MODE)