"""Проушины совмещаются на общей оси. Вначале вставляется отдельная ось, затем створка поворачивается. Ось нуждается в стопоре от осевого выхода.""" 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 = "pin-hinge" DEFAULTS = { "leaf_length": 24, "width": 30, "knuckle_radius": 5, "pin_radius": 2, "leaf_thickness": 3, "clearance": 0.3, "opening_angle": 85, } NOTE = "Проушины совмещаются на общей оси. Вначале вставляется отдельная ось, затем створка поворачивается. Ось нуждается в стопоре от осевого выхода." MODE = "rigid" def make_parts(supplied=None): p = params(DEFAULTS, supplied) l, w, r, pr, b, c, a = [ p[k] for k in ( "leaf_length", "width", "knuckle_radius", "pin_radius", "leaf_thickness", "clearance", "opening_angle", ) ] require( l > r + 8 and w > 12 and r > pr + c + 1 and b < r, "Leave material around the hinge bore", ) z = r + 1 left = box(-l, -w / 2, z - b, l - r - c, w, b) right = box(r + c, -w / 6 + c / 2, z - b, l - r - c, w / 3 - c, b) for y in (-w / 2, w / 6 + c / 2): length = w / 3 - c / 2 knuckle = cyl(r, length, (0, y, z), (0, 1, 0)).cut( cyl(pr + c, length + 2, (0, y - 1, z), (0, 1, 0)) ) left = join(left, knuckle, box(-r - 1, y, z - b, r + 1, length, b)) middle = cyl(r, w / 3 - c, (0, -w / 6 + c / 2, z), (0, 1, 0)).cut( cyl(pr + c, w / 3 + 2, (0, -w / 6 - 1, z), (0, 1, 0)) ) right = join(right, middle, box(0, -w / 6 + c / 2, z - b, r + 1, w / 3 - c, b)) left = left.cut(cyl(pr + c, w + 2, (0, -w / 2 - 1, z), (0, 1, 0))) right = right.cut(cyl(pr + c, w + 2, (0, -w / 2 - 1, z), (0, 1, 0))) pin = join( cyl(pr, w + 3, (0, -w / 2 - 1, z), (0, 1, 0)), cyl(pr + 2, 2, (0, -w / 2 - 3, z), (0, 1, 0)), ) return [ Piece("left", "Неподвижная створка", left), Piece( "right", "Подвижная створка", right, lambda t: Pose( angle=-a * (1 - phase(t, 0.5, 1)), axis=(0, 1, 0), pivot=(0, 0, z) ), ), Piece( "pin", "Съёмная ось", pin, lambda t: Pose(offset=(0, -(w + 5) * (1 - phase(t, 0, 0.5)), 0)), ), ] if __name__ == "__main__": main(make_parts, DEFAULTS, MODEL_ID, __file__, NOTE, MODE)