"""Сначала ставится втулка, затем внутренний сердечник раздвигает её четыре лапки. Форма расширения задана для демонстрации, удержание проверяется печатью.""" 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, V, box, cone, cyl, join, main, params, phase, require, ring, ) MODEL_ID = "push-rivet" DEFAULTS = { "panel_width": 30, "panel_thickness": 5, "hole_radius": 3.5, "sleeve_radius": 3.2, "flange_radius": 6, "expansion": 1, "clearance": 0.25, } NOTE = "Сначала ставится втулка, затем внутренний сердечник раздвигает её четыре лапки. Форма расширения задана для демонстрации, удержание проверяется печатью." MODE = "elastic" def make_parts(supplied=None): p = params(DEFAULTS, supplied) w, b, hole, r, flange, e, c = [ p[k] for k in ( "panel_width", "panel_thickness", "hole_radius", "sleeve_radius", "flange_radius", "expansion", "clearance", ) ] require( r < hole < r + e and flange > hole + 1 and r > 2.4, "Sleeve must pass before expansion and retain afterwards", ) panel = box(-w / 2, -w / 2, 8, w, w, b).cut(cyl(hole, b + 2, (0, 0, 7))) top = 8 + b + c def sleeve(t): spread = e * phase(t, 0.5, 1) bottom = cone(r + spread, r, 3, V(0, 0, 5)) outside = join(bottom, cyl(r, top - 8, (0, 0, 8))) inside = cone(0.8 + spread, 2.8, top - 5, V(0, 0, 5)) stem = outside.cut(inside) body = join(stem, ring(flange, 3.1, 2, top)) for angle in (0, 90): body = body.cut( box(-0.35, -flange, 4, 0.7, 2 * flange, top - 4.5).rotated( V(), V(0, 0, 1), angle ) ) return body pin = join( cone(1.6, 2.6, top - 5, V(0, 0, 5)), cyl(2.6, 2 + c, (0, 0, top)), cyl(4.5, 2, (0, 0, top + 2 + c)), ) return [ Piece("panel", "Панель с отверстием", panel), Piece( "sleeve", "Разрезная втулка", sleeve(1), lambda t: Pose(offset=(0, 0, 14 * (1 - phase(t, 0, 0.5)))), deform=sleeve, fabrication_shape=sleeve(0), ), Piece( "pin", "Распорный сердечник", pin, lambda t: Pose(offset=(0, 0, 28 * (1 - phase(t, 0.5, 1)))), ), ] if __name__ == "__main__": main(make_parts, DEFAULTS, MODEL_ID, __file__, NOTE, MODE)