"""Накладка надевается на прямой штырь. Нагретый инструмент формует его конец в шляпку. Объём формуемого участка сохраняется. Для печати экспортирован прямой штырь.""" 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, box, cyl, join, main, params, phase, require MODEL_ID = "heat-rivet" DEFAULTS = { "width": 28, "base_thickness": 3, "panel_thickness": 3, "post_radius": 2.5, "head_radius": 4.5, "clearance": 0.25, } NOTE = "Накладка надевается на прямой штырь. Нагретый инструмент формует его конец в шляпку. Объём формуемого участка сохраняется. Для печати экспортирован прямой штырь." MODE = "forming" def make_parts(supplied=None): p = params(DEFAULTS, supplied) w, b, panel, r, head, c = [ p[k] for k in ( "width", "base_thickness", "panel_thickness", "post_radius", "head_radius", "clearance", ) ] require( head > r + c and w > 2 * head + 6 and panel > 1, "Head must overlap the panel opening", ) seat = b + 3 + panel + c blank_top = seat + 4 blank = join(box(-w / 2, -w / 2, 0, w, w, b), cyl(r, blank_top - b, (0, 0, b))) def rivet(t): spread = phase(t, 0.4, 0.9) radius = r + (head - r) * spread height = 4 * r * r / (radius * radius) return join( box(-w / 2, -w / 2, 0, w, w, b), cyl(r, seat - b, (0, 0, b)), cyl(radius, height, (0, 0, seat)), ) plate = box(-w / 2, -w / 2, b + 3, w, w, panel).cut( cyl(r + c, panel + 2, (0, 0, b + 2)) ) tool = cyl(head + 2, 8, (0, 0, blank_top + 18)) def tool_pose(t): press = phase(t, 0.25, 0.45) * (1 - phase(t, 0.9, 1)) radius = r + (head - r) * phase(t, 0.4, 0.9) top = seat + 4 * r * r / (radius * radius) return Pose(offset=(0, 0, (top - blank_top - 18) * press)) return [ Piece( "base", "Основание со штырём", rivet(1), deform=rivet, fabrication_shape=blank, ), Piece( "panel", "Закрепляемая накладка", plate, lambda t: Pose(offset=(0, 0, 15 * (1 - phase(t, 0, 0.4)))), ), Piece("tool", "Формующий наконечник", tool, tool_pose, role="tool"), ] if __name__ == "__main__": main(make_parts, DEFAULTS, MODEL_ID, __file__, NOTE, MODE)