"""Сменная клипса соединяет два гнезда. Нижние лапки отгибаются при первой установке, верхние при опускании второго модуля. Доступ к зубьям нужен с обеих сторон.""" 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, box, join, main, params, phase, require, section MODEL_ID = "double-clip" DEFAULTS = { "width": 28, "depth": 20, "plate_thickness": 3, "spacing": 13, "clip_thickness": 1.5, "clearance": 0.25, "deflection": 1.4, } NOTE = "Сменная клипса соединяет два гнезда. Нижние лапки отгибаются при первой установке, верхние при опускании второго модуля. Доступ к зубьям нужен с обеих сторон." MODE = "elastic" def make_parts(supplied=None): p = params(DEFAULTS, supplied) w, d, b, s, th, c, f = [ p[k] for k in ( "width", "depth", "plate_thickness", "spacing", "clip_thickness", "clearance", "deflection", ) ] require( w > 12 and d > 8 and s > 2 * b + 4 and th > f / 2, "Separate two receivers and the central web", ) inner = 1.6 outer = inner + th hook = outer + 1.4 low = box(-w / 2, -d / 2, 5, w, d, b).cut( box(-outer - c, -3 - c, 4, 2 * outer + 2 * c, 6 + 2 * c, b + 2) ) top = box(-w / 2, -d / 2, 5 + s, w, d, b).cut( box(-outer - c, -3 - c, 4 + s, 2 * outer + 2 * c, 6 + 2 * c, b + 2) ) upper = 5 + s + b + c def clip(t): upper_bend = f * math.sin(math.pi * phase(t, 0.45, 0.95)) lower_bend = f * math.sin(math.pi * phase(t, 0, 0.4)) solids = [box(-inner, -3, 10, 2 * inner, 6, 2)] for sign in (-1, 1): pts = [ (inner - lower_bend, 2), (outer - lower_bend, 2), (outer, 11), (outer - upper_bend, upper + 3), (inner - upper_bend, upper + 3), (inner, 11), ] solids.append( section( [ (sign * x, z) for x, z in [ (outer - lower_bend, 2), (hook - lower_bend, 4.5), (outer - lower_bend, 4.5), ] ], -3, 6, ) ) solids.append( section( [ (sign * x, z) for x, z in [ (outer - upper_bend, upper), (hook - upper_bend, upper), (outer - upper_bend, upper + 3), ] ], -3, 6, ) ) solids.append(section([(sign * x, z) for x, z in pts], -3, 6)) return join(*solids) return [ Piece("lower", "Нижнее гнездо", low), Piece( "upper", "Верхнее гнездо", top, lambda t: Pose(offset=(0, 0, 22 * (1 - phase(t, 0.42, 1)))), ), Piece( "clip", "Двусторонняя клипса", clip(1), lambda t: Pose(offset=(0, 0, -6 * (1 - phase(t, 0, 0.4)))), deform=clip, ), ] if __name__ == "__main__": main(make_parts, DEFAULTS, MODEL_ID, __file__, NOTE, MODE)