"""Винт и гайка имеют настоящую винтовую резьбу с общим шагом. Поворот связан с осевым перемещением. Печатную посадку проверяют коротким образцом.""" 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, hexagon, join, main, params, require, thread MODEL_ID = "printed-thread" DEFAULTS = { "radius": 6, "pitch": 2, "thread_length": 16, "nut_height": 12, "nut_radius": 11, "head_radius": 9, "clearance": 0.25, } NOTE = "Винт и гайка имеют настоящую винтовую резьбу с общим шагом. Поворот связан с осевым перемещением. Печатную посадку проверяют коротким образцом." MODE = "rigid" def make_parts(supplied=None): p = params(DEFAULTS, supplied) r, pitch, l, h, n, head, c = [ p[k] for k in ( "radius", "pitch", "thread_length", "nut_height", "nut_radius", "head_radius", "clearance", ) ] require( l > h and n > r + c + 2 and head > r + 1 and pitch < r, "Thread and walls must fit", ) dz = h + c - l shaft = thread(r, pitch, l).translated(V(0, 0, dz)) screw = join(shaft, hexagon(head, 3, h + c)) tool = thread(r, pitch, l, extra=c).translated(V(0, 0, dz)) nut = hexagon(n, h).cut(tool) travel = l + 6 return [ Piece("nut", "Печатная гайка", nut), Piece( "screw", "Печатный винт", screw, lambda t: Pose( offset=(0, 0, travel * (1 - t)), angle=360 * travel * (1 - t) / pitch ), ), ] if __name__ == "__main__": main(make_parts, DEFAULTS, MODEL_ID, __file__, NOTE, MODE)