"""Конусная обойма сжимает четыре разрезных лепестка. Геометрия сжатия задаётся параметром preload, трение и усилие зажима требуют проверки.""" 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 = "collet" DEFAULTS = { "rod_radius": 4, "root_radius": 10, "tip_radius": 7, "length": 22, "wall": 3, "slit": 0.8, "preload": 0.15, "clearance": 0.2, } NOTE = "Конусная обойма сжимает четыре разрезных лепестка. Геометрия сжатия задаётся параметром preload, трение и усилие зажима требуют проверки." MODE = "elastic-fit" def make_parts(supplied=None): p = params(DEFAULTS, supplied) r, root, tip, l, w, slot, pre, c = [ p[k] for k in ( "rod_radius", "root_radius", "tip_radius", "length", "wall", "slit", "preload", "clearance", ) ] require( root > tip > r + c + w / 2 and pre < tip - r - 1 and l > 8 and slot < r, "Leave material in the fingers", ) def collet(t): squeeze = pre * phase(t, 0.2, 1) outside = cone(root, tip - squeeze, l, V(0, 0, 3)) inside = cone(r + c, r + c - squeeze, l + 1, V(0, 0, 3)) body = join(ring(root + 2, r + c, 3), outside.cut(inside)) for angle in (0, 90): body = body.cut( box(-slot / 2, -root - 1, 6, slot, 2 * root + 2, l + 2).rotated( V(), V(0, 0, 1), angle ) ) return body sleeve = cyl(root + w, l, (0, 0, 3)).cut( cone(root + c, tip - pre + c, l, (V(0, 0, 3))) ) rod = cyl(r, l + 16, (0, 0, 0)) return [ Piece( "collet", "Разрезная цанга", collet(1), deform=collet, fabrication_shape=collet(0), ), Piece( "sleeve", "Коническая прижимная обойма", sleeve, lambda t: Pose(offset=(0, 0, (l + 5) * (1 - t))), ), Piece("rod", "Зажимаемый стержень", rod, role="hardware"), ] if __name__ == "__main__": main(make_parts, DEFAULTS, MODEL_ID, __file__, NOTE, MODE)