"""Показана кинематика рычага и тяги постоянной длины. Замок проходит мёртвую точку. Упругий натяг и удержание от вибрации требуют физической пробы.""" 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, Pose, V, box, cyl, join, main, params, require MODEL_ID = "toggle" DEFAULTS = { "pivot_spacing": 40, "crank_length": 12, "link_length": 36, "lever_length": 27, "pin_radius": 1.2, "clearance": 0.25, } NOTE = "Показана кинематика рычага и тяги постоянной длины. Замок проходит мёртвую точку. Упругий натяг и удержание от вибрации требуют физической пробы." MODE = "rigid" def make_parts(supplied=None): p = params(DEFAULTS, supplied) d, r, l, handle, pr, c = [ p[k] for k in ( "pivot_spacing", "crank_length", "link_length", "lever_length", "pin_radius", "clearance", ) ] require( l > d - r + 2 and l > d + r * math.cos(math.radians(130)) and handle > r, "Link must reach the catch throughout the stroke", ) def points(t): angle = 130 + 40 * t ang = math.radians(angle) bx = d / 2 + r * math.cos(ang) bz = 8 + r * math.sin(ang) return angle, (bx, bz), (-d / 2, bz + math.sqrt(l * l - (bx + d / 2) ** 2)) af, bf, cf = points(1) base = join(box(-d / 2 - 10, -10, 0, d + 20, 20, 3), box(d / 2 - 3, 2, 3, 6, 5, 8)) base = base.cut(cyl(pr + c, 12, (d / 2, -3, 8), (0, 1, 0))) lever = box(d / 2, -1, 6, handle, 3, 4).rotated(V(d / 2, 0, 8), V(0, 1, 0), -af) lever = join(lever, cyl(3, 3, (d / 2, -1, 8), (0, 1, 0))).cut( cyl(pr + c, 7, (d / 2, -3, 8), (0, 1, 0)) ) link = cyl(1.6, l, (cf[0], -4, cf[1]), (bf[0] - cf[0], 0, bf[1] - cf[1])) for x, z in (bf, cf): link = join(link, cyl(3, 3, (x, -5.5, z), (0, 1, 0))) for x, z in (bf, cf): link = link.cut(cyl(pr + c, 6, (x, -7, z), (0, 1, 0))) lid = join( box(-d / 2 - 9, 2, cf[1] + 3, 18, 12, 3), box(-d / 2 - 3, 2, cf[1] - 3, 6, 5, 6) ) axle = cyl(pr, 9, (d / 2, -5, 8), (0, 1, 0)) def rod_pose(t): _angle, b, a = points(t) a0 = math.degrees(math.atan2(bf[1] - cf[1], bf[0] - cf[0])) a1 = math.degrees(math.atan2(b[1] - a[1], b[0] - a[0])) return Pose( offset=(a[0] - cf[0], 0, a[1] - cf[1]), angle=-(a1 - a0), axis=(0, 1, 0), pivot=(cf[0], -4, cf[1]), ) return [ Piece("receiver", "Основание рычага", base), Piece( "lid", "Ответный крюк", lid, lambda t: Pose(offset=(0, 0, points(t)[2][1] - cf[1])), ), Piece( "lever", "Перекидной рычаг", lever, lambda t: Pose( angle=-(points(t)[0] - af), axis=(0, 1, 0), pivot=(d / 2, 0, 8) ), ), Piece("link", "Тяга постоянной длины", link, rod_pose), Piece("axle", "Ось рычага", axle, role="hardware"), ] if __name__ == "__main__": main(make_parts, DEFAULTS, MODEL_ID, __file__, NOTE, MODE)