"""Две жёсткие створки соединены тонкой перемычкой с распределённым изгибом. Для печати дан плоский образец. Усталость и допустимый угол зависят от материала.""" import FreeCAD # noqa: F401 (initialize the CAD runtime first) # isort: split import math import sys from pathlib import Path sys.path.insert(0, str(Path(__file__).resolve().parents[1])) from common import Piece, V, box, join, main, params, require, section MODEL_ID = "living-hinge" DEFAULTS = { "leaf_length": 24, "width": 22, "leaf_thickness": 3, "bridge_length": 8, "bridge_thickness": 0.65, "fold_angle": 110, } NOTE = "Две жёсткие створки соединены тонкой перемычкой с распределённым изгибом. Для печати дан плоский образец. Усталость и допустимый угол зависят от материала." MODE = "compliant" def make_parts(supplied=None): p = params(DEFAULTS, supplied) l, w, b, span, th, a = [ p[k] for k in ( "leaf_length", "width", "leaf_thickness", "bridge_length", "bridge_thickness", "fold_angle", ) ] require( th < b and span > 4 * th and a < 150, "Bridge must be thinner than the leaves" ) def hinge(t): theta = math.radians(a * t) if theta < 1e-8: return join( box(-l, -w / 2, 0, l, w, b), box(0, -w / 2, 0, span, w, th), box(span, -w / 2, 0, l, w, b), ) radius = span / theta lower = [] upper = [] for i in range(17): angle = theta * i / 16 x = radius * math.sin(angle) z = radius * (1 - math.cos(angle)) lower.append((x, z)) upper.append((x - th * math.sin(angle), z + th * math.cos(angle))) bridge = section(lower + list(reversed(upper)), -w / 2, w) leaf = ( box(span, -w / 2, 0, l, w, b) .rotated(V(span, 0, 0), V(0, 1, 0), -a * t) .translated(V(lower[-1][0] - span, 0, lower[-1][1])) ) return join(box(-l, -w / 2, 0, l, w, b), bridge, leaf) return [ Piece( "hinge", "Створки с гибкой перемычкой", hinge(1), deform=hinge, fabrication_shape=hinge(0), ) ] if __name__ == "__main__": main(make_parts, DEFAULTS, MODEL_ID, __file__, NOTE, MODE)