"""Бортик ограничивает боковой сдвиг, четыре пары магнитов создают прижим. Карманы имеют зазор под фиксацию магнитов. Полярность проверяют перед установкой.""" 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, require MODEL_ID = "magnets" DEFAULTS = { "width": 50, "depth": 36, "base_thickness": 5, "lid_thickness": 4, "magnet_radius": 3, "magnet_height": 2, "border": 2, "clearance": 0.3, } NOTE = "Бортик ограничивает боковой сдвиг, четыре пары магнитов создают прижим. Карманы имеют зазор под фиксацию магнитов. Полярность проверяют перед установкой." MODE = "rigid" def make_parts(supplied=None): p = params(DEFAULTS, supplied) w, d, b, l, r, m, border, c = [ p[k] for k in ( "width", "depth", "base_thickness", "lid_thickness", "magnet_radius", "magnet_height", "border", "clearance", ) ] require( w > 8 * r and d > 6 * r and b > m and l > m and border > c, "Pockets need surrounding material", ) base = box(-w / 2, -d / 2, 0, w, d, b) rim = box(-w / 2, -d / 2, b, w, d, 3).cut( box(-w / 2 + border, -d / 2 + border, b - 1, w - 2 * border, d - 2 * border, 5) ) base = join(base, rim) lid = box( -w / 2 + border + c, -d / 2 + border + c, b + c, w - 2 * (border + c), d - 2 * (border + c), l, ) magnets = [] for j, (x, y) in enumerate( [ (-w / 2 + 7, -d / 2 + 7), (-w / 2 + 7, d / 2 - 7), (w / 2 - 7, -d / 2 + 7), (w / 2 - 7, d / 2 - 7), ] ): base = base.cut(cyl(r + 0.1, m + 0.1, (x, y, b - m))) lid = lid.cut(cyl(r + 0.1, m + 0.1, (x, y, b + c))) magnets += [ Piece( f"lower{j}", "Нижний магнит", cyl(r, m, (x, y, b - m)), role="hardware" ), Piece( f"upper{j}", "Верхний магнит", cyl(r, m, (x, y, b + c)), lambda t: Pose(offset=(0, 0, 24 * (1 - t))), role="hardware", ), ] return [ Piece("receiver", "Основание с бортиком", base), Piece( "lid", "Съёмная крышка", lid, lambda t: Pose(offset=(0, 0, 24 * (1 - t))) ), *magnets, ] if __name__ == "__main__": main(make_parts, DEFAULTS, MODEL_ID, __file__, NOTE, MODE)