# Fastening Lab Параметрическая библиотека 33 соединений для 3D-печати: . На странице каждого механизма есть вращаемая CAD-модель, анимация сборки, редактор размеров, печатный пробник, описание устройства и полный Python-генератор с подсветкой. Вкладка «Исходники» содержит generator.py, общий common.py, текущие параметры JSON и пример повторного использования. Код можно копировать и скачивать. ## Работа с моделью Левая кнопка мыши вращает вид, колесо меняет масштаб, нажатие выбирает деталь. Стрелки и Home управляют камерой с клавиатуры. Ползунок показывает ход механизма; детали можно скрывать по отдельности. Изменение чисел автоматически ставит CAD-задачу в очередь. До успешного расчёта сохраняется предыдущая корректная геометрия. «Пробник для печати» использует текущие значения и обновляет тот же 3D-вид и файлы. STEP, FCStd, STL и JSON доступны из рабочей области. Все 33 исходных пробника подготовлены для Bambu Lab P2S, сопла 0,4 мм, PETG и слоя 0,20 мм. Поддержки подбираются автоматически. Новые пробники учитывают положение до формования: плоский гибкий шарнир, разжатую цангу и прямую заклёпку. Print-in-place сохраняет взаимное положение деталей. Металлический крепёж, клей и инструмент не входят в STL, они перечислены отдельно. ## API, MCP и skill - Читаемая документация и примеры: `/api.html`. - OpenAPI 3.1: `/openapi.json`. - Каталог и параметры: `GET /api/models`, `GET /api/models/{id}`. - CAD: `POST /api/generate/{id}`; пробник: `POST /api/probe/{id}`. Тело: `{"parameters":{"clearance":0.3}}`. - Задачи: `GET /api/jobs/{job_id}`. HTTP 202 означает принятую задачу, а не готовый результат. Ждите `status: completed` или `failed`; учитывайте `retryAfter` и HTTP 429. - MCP Streamable HTTP: `/mcp`, версии 2026-07-28 и 2025-11-25 / 2025-06-18 / 2025-03-26. Современные запросы передают метаданные; прежние клиенты используют initialize. - Готовый пакет агента: `/skills/fastening-lab.zip`. В нём SKILL.md и клиент Python на стандартной библиотеке. MCP-инструменты: list_fasteners, get_fastener, generate_model, generate_probe и get_job. Есть ресурсы каталога, skill и исходников. MCP возвращает компактные ссылки, а REST-просмотр получает настоящие сетки CAD. Ни один запрос не запускает физическую печать. Публичный сервис принимает только числовые параметры известных генераторов. Произвольный Python не принимается. ## Docker ```sh docker compose up --build -d ``` По умолчанию контейнер публикует сайт на `127.0.0.1:8765`, предназначенном для внешнего TLS reverse proxy. Задайте `PUBLIC_URL` перед запуском при другом домене. Постоянный volume fastening-data хранит результаты. Приложение работает от uid 10001 с файловой системой только для чтения, временным /tmp и ограничениями CPU/памяти. Docker-образ использует Debian 13 и нативный FreeCAD. На amd64 включён официальный Bambu Studio 2.9.1 с проверкой SHA-256; нарезка запускается в Xvfb без GPU. `WITH_SLICER=0` при сборке отключает его. На ARM64 официальный Bambu CLI недоступен: создаётся полноценный 3MF с тем же профилем, который нужно нарезать в Bambu Studio. ARM64 не входит в проверенное серверное окружение этой публикации. Читайте поле `print` результата: `status: passed` означает успешную серверную нарезку; `status: project_ready, sliced: false` означает, что 3MF подготовлен и требует нарезки на клиенте. В проекте сохраняется полный производственный G-код. Упрощённый завершающий G-код используется только во временной копии проверки. Основные настройки окружения: PUBLIC_URL, PORT, BIND_HOST, CACHE_DIR, CAD_PYTHON, CAD_LIB. MAX_CACHE_MB ограничивает кэш (по умолчанию 1024 МиБ); неактивные результаты также удаляются через семь дней. Сохраняйте нужные артефакты локально. Bambu-команда может быть задана через BAMBU_COMMAND. В домашнем Swarm используется отдельный стек fastening, его описание находится в deploy/fastening.drs. Шаблон nginx и выпуск отдельного сертификата расположены рядом. Деплой зарегистрирован в существующем home_server/deploy.sh; задайте FASTENING_SOURCE_DIR на эту папку. Для fastening используется установленный на Mac dry-stack: его SSH видит домашнюю сеть, недоступную Docker Desktop runner. Другие стеки не пересоздаются. Временный /tmp задан явным tmpfs-монтированием для Swarm. ## Локальный просмотр Откройте start.command двойным щелчком для запуска на этом Mac. Он использует установленный FreeCAD и локальный Bambu-инструмент. Окно Terminal должно оставаться открытым. Без сервера index.html работает как офлайн-каталог: доступны описания, исходники, 3D-вращение и сохранённые файлы. Для изменения геометрии нужен работающий сервер. ## Структура - data.js, catalog.json, descriptions/, images/ — описания, метаданные и схемы. - models//generator.py, parameters.json, README.md — отдельные генераторы и API повторного использования. - models//generated/ — сборка, детали, пробник, CAD-сетки и рендеры. - models/common.py, probe.py, project.py — общие CAD-примитивы, ориентация печати и переносимая упаковка 3MF. - styles.css, workspace.css, viewer3d.js, kinematics.js — общий интерфейс и просмотр без UI-фреймворка. - syntax.js, workspace.js — экранированная подсветка кода, вкладки и копирование. - serve.py, service.py, mcp_api.py — HTTP, ограниченная очередь задач, кэш и MCP. - Dockerfile, compose.yaml, deploy/ — контейнер и развёртывание. Генераторы обычно возвращают `make_parts(parameters)`: список Piece с полями shape, at(t) и необязательным fabrication_shape. Ласточкин хвост сохраняет прежний API Parameters / make_receiver / make_slider / make_cutter. Для переноса крепления применяйте одинаковый Placement к сопряжённым телам, затем fuse или cut. ## Сборка страниц и проверки ```sh node models/build_pages.cjs node build.cjs node test_syntax.cjs node models/test_kinematics.cjs python3 test_service.py python3 test_jobs.py ``` При изменении Swarm-конфигурации выполните `ruby test_stack.rb` с установленным dry-stack и проверьте результат `docker stack config`. Работающий сайт проверяет `python3 check_deployment.py https://fastening.home.mivx.ru --probe`: запрос строит пробник с изменёнными параметрами и проверяет серверную нарезку и размеры скачанного 3MF. CAD-тесты `models/test_models.py`, `models/test_geometry_checks.py` и `models/dovetail/test_generator.py` запускаются Python из FreeCAD, в Docker — `/usr/bin/python3`. Для read-only контейнера задайте `PARAMETER_REPORT=/tmp/parameter-checks.json`. Проверки браузера: `node models/render_catalog.cjs --ui`; редактор и пробник: `--live`. Требуются установленный Chrome и запущенный сайт. Генерация всех файлов: models/generate_all.py, models/generate_probes.py, models/prepare_probes.py. Уже подготовленные результаты включены; пересчитывать всю библиотеку для запуска сайта не требуется. ## Границы проверки Подробности — в CHECKS.md. Валидность тел, обратное чтение STEP, контрольные положения и нарезка не подтверждают физическое удержание, усилия и ресурс. Деформации и нагрев показаны заданными состояниями, без расчёта напряжений и температуры. Y-Zipper экспериментальный; часть металлического крепежа показана габаритными моделями. Сначала проверяйте печатный образец. Используемые инструменты: [FreeCAD](https://www.freecad.org/) и [Bambu Studio](https://github.com/bambulab/BambuStudio). Новые Python/JS-пакеты приложению не требуются.