"""Две захваченные створки печатаются одной сборкой с технологическим зазором. Анимация показывает освобождение и поворот после печати. Используйте общий assembly.stl.""" 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, require MODEL_ID = "print-hinge" DEFAULTS = { "leaf_length": 24, "width": 30, "knuckle_radius": 5, "pin_radius": 2, "leaf_thickness": 3, "clearance": 0.35, "opening_angle": 85, } NOTE = "Две захваченные створки печатаются одной сборкой с технологическим зазором. Анимация показывает освобождение и поворот после печати. Используйте общий assembly.stl." MODE = "print-in-place" 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 captured axis", ) z = r + 1 left = box(-l, -w / 2 - 3, z - b, l - r - c, w + 6, 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 left = join( left, cyl(r, length, (0, y, z), (0, 1, 0)).cut( cyl(pr + c, length + 2, (0, y - 1, z), (0, 1, 0)) ), box(-r - 1, y, z - b, r + 1, length, b), ) left = left.cut(cyl(pr + c, w + 2, (0, -w / 2 - 1, z), (0, 1, 0))) left = join(left, cyl(pr, w + 6, (0, -w / 2 - 3, z), (0, 1, 0))) for y in (-w / 2 - 3, w / 2 + 1): left = join( left, cyl(r, 2, (0, y, z), (0, 1, 0)), box(-r - 1, y, z - b, r + 1, 2, 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)) right = right.cut(cyl(pr + c, w + 2, (0, -w / 2 - 1, z), (0, 1, 0))) return [ Piece("left", "Створка со встроенной осью", left), Piece( "right", "Захваченная створка", right, lambda t: Pose(angle=-a * t, axis=(0, 1, 0), pivot=(0, 0, z)), ), ] if __name__ == "__main__": main(make_parts, DEFAULTS, MODEL_ID, __file__, NOTE, MODE)