"""Гайка вводится сбоку в шестигранный карман. Винт с настоящей резьбой затягивается после установки панели. Размеры гайки задаются как геометрия образца.""" 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, hexagon, join, main, params, phase, require, thread, ) MODEL_ID = "captive-nut" DEFAULTS = { "screw_radius": 3, "pitch": 1, "nut_radius": 5.8, "nut_height": 5, "base_width": 28, "base_height": 12, "cover_thickness": 3, "clearance": 0.25, } NOTE = "Гайка вводится сбоку в шестигранный карман. Винт с настоящей резьбой затягивается после установки панели. Размеры гайки задаются как геометрия образца." MODE = "rigid" def make_parts(supplied=None): p = params(DEFAULTS, supplied) r, pitch, n, nh, w, h, b, c = [ p[k] for k in ( "screw_radius", "pitch", "nut_radius", "nut_height", "base_width", "base_height", "cover_thickness", "clearance", ) ] require( n > r + 1 and w > 2 * n + 4 and h > nh + 4, "Leave walls around the nut pocket" ) l = h + b + 3 z = h + c + b - l screw = join( thread(r, pitch, l).translated(V(0, 0, z)), hexagon(r + 2, 3, h + c + b) ) tool = thread(r, pitch, l, extra=c).translated(V(0, 0, z)) nut = hexagon(n, nh, 2).cut(tool) base = box(-w / 2, -w / 2, 0, w, w, h).cut(cyl(r + c, h + 2, (0, 0, -1))) pocket = join( hexagon(n + c, nh + 2 * c, 2 - c), box(0, -n * 0.866 - c, 2 - c, w, 2 * n * 0.866 + 2 * c, nh + 2 * c), ) base = base.cut(pocket) lid = box(-w / 2, -w / 2, h + c, w, w, b).cut(cyl(r + c, b + 2, (0, 0, h + c - 1))) travel = l + 5 return [ Piece("receiver", "Корпус с боковым карманом", base), Piece( "nut", "Закладная гайка", nut, lambda t: Pose(offset=((w + 3) * (1 - phase(t, 0, 0.35)), 0, 0)), role="hardware", ), Piece("lid", "Присоединяемая панель", lid), Piece( "screw", "Винт", screw, lambda t: Pose( offset=(0, 0, travel * (1 - phase(t, 0.35, 1))), angle=360 * travel * (1 - phase(t, 0.35, 1)) / pitch, ), role="hardware", ), ] if __name__ == "__main__": main(make_parts, DEFAULTS, MODEL_ID, __file__, NOTE, MODE)