Files
kompas-plugin/plugin/skills/kompas-fdm-design/SKILL.md
T

26 KiB
Raw Blame History

name, description
name description
kompas-fdm-design Методика проектирования деталей под FDM/FFF 3D-печать в КОМПАС-3D через MCP-сервер плагина: правила DFM (нависания и угол θ_max, толщины стенок n·w, отверстия и teardrop, посадки/зазоры, ориентация под прочность, elephant foot, бобышки/инсёрты/защёлки) ПЛЮС лёгкая самопроверка геометрии инструментами осмотра. Используй, когда задача — спроектировать или ДОВЕСТИ деталь, чтобы она хорошо ПЕЧАТАЛАСЬ на FDM. Триггеры: «сделай деталь печатнопригодной / под FDM», «спроектируй … под печать», «напечатается ли без поддержек?», «подбери зазоры для печатной посадки», «как ориентировать деталь под печать», «почему деталь плохо печатается / где будут нависания», «доведи деталь под FDM». Строит через навык kompas-3d. НЕ для: механики построения через MCP (это kompas-3d); слайсинга/нарезки/g-code (вне границ).

kompas-fdm-design — проектирование деталей под FDM-печать

Что это (и чем НЕ является)

Методический слой поверх навыка kompas-3d. Отвечает на вопрос «как спроектировать, чтобы напечаталось на FDM», а не «чем строить».

  • kompas-3d = чем и как строить через MCP (эскиз→операция→осмотр→проверка построения). Этот навык опирается на него для механики.
  • Этот навык = какие правила геометрии соблюдать, чтобы FDM-печать удалась.
  • Слайсинг — вне границ. Навык не нарезает и не оценивает g-code.

Когда применять / когда НЕ применять

Применять: «сделай печатнопригодным / под FDM», «спроектируй … под печать», «напечатается без поддержек?», «подбери зазоры печатной посадки», «как ориентировать под печать», «почему плохо печатается», «доведи деталь под печать».

НЕ применять: чистая механика построения (→ kompas-3d); слайсинг/нарезка/g-code (вне границ).

Калибровка (выполни первым шагом)

Все правила масштабируются от трёх параметров (часть значений — абсолютные эмпирические мм, помечены «калибровать тестом»):

  • w = ширина линии ≈ диаметр сопла. Дефолт: сопло 0.4 → w ≈ 0.40.45 мм. → стенки n·w.
  • h = высота слоя. Дефолт h ≈ 0.5·сопло (0.2 мм); структурная печать 0.2–0.25.
  • θ_max = предельный угол самонесущей поверхности ОТ ВЕРТИКАЛИ. θ_max ≈ arctan(w/2h) (≈45° при w=0.4, h=0.2). Дефолт 45° (PLA, хороший обдув); 40° для PETG/ABS (эмпирическая поправка на провис, не вывод формулы) или для толстого слоя (h≥0.3 → формула даёт ~34°). Нависания, teardrop, фаски, зенковки берут угол из θ_max.
  • Материал (PLA / PETG / ABS) — модификатор зазоров/мостов/коробления/θ_max. См. references/fdm-rules.md.

Если сопло/слой/материал не заданы — прими дефолты (сопло 0.4, h=0.2, PLA) и скажи об этом.

Два правила (соблюдай всегда)

1. Ориентация печати — первое проектное решение.

  • Путь нагрузки и косметические грани из геометрии не выводятся — их задаёт задача. Спроси пользователя, если есть кого спрашивать; работаешь автономно (субагент, пакетный прогон) — выведи из постановки: что деталь держит, куда смотрит рабочая поверхность, чем она крепится. Выведенное — запиши допущением в ответ («принято: нагрузка — вес камеры 150 г вниз на плече 53 мм; косметика не задана»), чтобы человек увидел, что именно ты предположил. Молчаливое «спросить некого» — не повод пропустить решение об ориентации: без него все дальнейшие правила повисают.
  • Реши постановку на стол (ось Z = рост слоёв). От неё зависит: где нависания; куда смотрят отверстия (вертикальные → компенсация Ø; горизонтальные → teardrop); путь нагрузки (держи в XY; Z-сжатие можно, Z-растяжение/срез — нет); плоскости сопряжения (на XY-гранях); «лесенка» на наклонных функциональных поверхностях; если поддержки неизбежны — чтобы опорные грани были некритичными/скрытыми.
  • Зафиксируй ориентацию и проектируй под неё.

2. Чек-лист печатнопригодности перед выдачей (ниже). Сначала валидность построения (её дописывает к ответу каждая операция, см. kompas-3d; вручную — describe_model(sections=errors,bodies,mass)), затем FDM-чек-лист (деталь печатнопригодна) — разные проверки. Гео-аудит эвристический и не доказывает печатнопригодность (не ловит путь нагрузки/анизотропию).

Ориентация: когда три требования не сходятся

У консольной детали (кронштейн, полка, держатель) требования правила 1 — нагрузка в XY, нависания ≤ θ_max, опорная площадка — одновременно невыполнимы. Постоянного приоритета у них нет: он решается ЧИСЛОМ, и число считается за две минуты.

Прикидка «прочность против ориентации». Напряжение в корневом сечении против межслойной прочности — то есть против той самой величины, ради которой требуют «нагрузку в XY»:

  1. M = F·L — момент в корне: F = m·g (Н), L — плечо до корневого сечения (мм) → Н·мм.
  2. W = b·h²/6 — момент сопротивления прямоугольного сечения (h — размер В ПЛОСКОСТИ изгиба), мм³. Размеры сечения бери describe_model(sections="box") или measure по граням, а не из головы.
  3. σ = M/W (Н/мм² = МПа).
  4. Порог — межслойная прочность: доля от XY-прочности по §6 fdm-rules.md, для PLA ~2030 МПа (PETG ~1525, ABS ~815).

Точность прикидки — ПОРЯДОК, и в узкой полосе этого мало. W = b·h²/6 — это сплошное сечение, а печатная деталь сплошной не бывает: тот же навык требует стенки n·w и оставляет заполнение по умолчанию, так что настоящий момент сопротивления корневого сечения заметно ниже габаритного (у оболочки в три периметра на сечении 34×24 — примерно вдвое). Пока запас идёт порядками, это не мешает; в полосе <3×, где число и решает, погрешность метода равна ширине полосы. Поэтому: при запасе <3× пересчитайте W по фактическому сечению (оболочка n·w + заполнение) либо просто возьмите W вдвое меньше габаритного и посмотрите, в какой строке таблицы окажетесь.

Запас σ_меж/σ Что делать
< 3× «Нагрузка в XY» — жёсткое требование, ориентацию выбирает оно; нависания лечим поддержками, площадку — фланцем, вплоть до разбиения детали (§13)
310× Держать XY, если это не стоит поддержек на функциональных гранях; несущее сечение поднять (§6: ×2 при неизбежной Z-нагрузке)
≥ 10× Требование СНИМАЕТСЯ — «слои на отрыв» здесь не размерный случай. Ориентацию выбирай по печати: сначала нависания, затем опорная площадка и устойчивость

Замер (кронштейн камеры): 150 г на плече 53 мм → M = 0.150·9.81·53 ≈ 78 Н·мм; корневое сечение 34×24 → W = 34·24²/6 ≈ 3.3·10³ мм³; σ ≈ 24 кПа против ~30 МПа межслойной PLA — запас три порядка. Слои здесь не решают ничего, и постановка выбрана по нависаниям, а не по прочности. Без этой прикидки правило «нагрузка в XY» читается как запрет и уводит в худшую по печати ориентацию.

Постановки перебирают по граням габарита, их немного: у плоско-изогнутой детали — две «плашмя» (широкой гранью вниз, посадочной гранью вниз) и одна «стоя» (корневым торцом вниз). Выпиши для каждой три числа — площадь нависающих граней, площадь опорного пятна и σ — и выбор перестанет быть спором вкусов. «Стоя» обычно выигрывает по нависаниям и проигрывает по устойчивости; её проверяют отдельно (гео-аудит, проверка центра масс).

Рабочий цикл

  1. Калибровка: сопло→w; слой→hθ_max; материал→поправки.
  2. Ориентация (правило 1 + §«когда три требования не сходятся»): нагрузка/косметика — опросом или допущением → перебор постановок с числами → ось слоёв, сопряжения, «лесенка», поддержки.
  3. Правила эскиза/операции (строй через kompas-3d): стенки n·w; нависания → скос под θ_max; горизонтальные отверстия → teardrop (полная капля; усечённая касательная, если клюв мешает виду; мягкий колпачок, если по отверстию идёт посадка — выбор и формулы в references/fdm-rules.md §3), причём у МЕЛКОГО отверстия форму выбирают по ПРОЛЁТУ крыши, а не по углу боковин; вертикальные → компенсация Ø; фаска у основания; зазоры посадок (со знаком); заходные фаски; мин. элементы/текст; бобышки/инсёрты/защёлки. Числа — в references/fdm-rules.md.
  4. Гео-аудит (references/geometry-audit.md) — инструментами осмотра.
  5. Предусловия выдачи: единое тело/манифолд (boolean_union при необходимости) → построение чистое.
  6. Чек-лист → выдача. Обменный файл кладите только если о нём попросили: модель самоценна, а нарезает её человек сам. Попросили — export_model (.stl — двоичная сетка для слайсера, .step — для передачи модели в другую САПР).

Чек-лист печатнопригодности

  • Направление нагрузки и косметические грани получены от пользователя или выведены из постановки и записаны допущением; ориентация выбрана числом (запас σ_меж/σ), а не по умолчанию; нагрузка в XY (или Z только на сжатие, или запас ≥10×); сопряжения на XY-гранях.
  • Стенки кратны w (≥2·w; несущие ≥3·w, т.е. 3 периметра); нет «не кратных w» (кроме функциональных).
  • Нет 90°-полок; нависания ≤θ_max или заменены скосами — отбор ровно в той форме, что в §«Гео-аудит»: list_faces(normal="0,0,-1", normalTolerance=90−θ_max, minZ=<Zmin+0.1>) (дефолтный допуск 15° ловит только почти горизонтальные потолки, а без minZ в улов попадает опорное пятно, без minArea — микрогрань, которая нависанием быть не может); пролёт каждого моста замерен measure, а не прикинут, и укладывается в references/fdm-rules.md §2 по короткой стороне; внутренним поддержкам — доступ.
  • Горизонтальные отверстия — teardrop/D (геометрия из θ_max), усечённая касательная там, где клюв мешает виду, либо мягкий колпачок там, где отверстие несёт посадку, и тогда компромисс назван вслух; у формы положе θ_max пролёт крыши посчитан и укладывается в норму моста; вертикальные — компенсация Ø; глухие — дно ≥2–3 мм.
  • Фаска у основания (elephant foot); внутренние углы ≥R0.5; опорная площадка есть, и для высокой детали проверена устойчивость по §«Гео-аудит»: очертание пятна — list_edges(minZ=<Zmin0.1>, maxZ=<Zmin+0.1>), проекция ЦМ (describe_model(sections="mass")) внутри этого прямоугольника, высота ЦМ над столом ≲3× полуширины пятна в узком направлении.
  • Посадки по таблице со знаком (натяг — вычесть); допуск ±0.2 НЕ прибавлен к зазору; заходные фаски на сопряжениях.
  • Мин. элементы/текст ≥ порогов (у надписи проверен ШТРИХ, а не кегль: чертёжный шрифт даёт h/14 и порога не берёт — references/fdm-rules.md §7); сторона грани под надпись выбрана так, чтобы она не вышла зеркальной (§10); аспект тонких выступов ≤4–5×.
  • Бобышки/инсёрты (бор отверстия ≤ OD инсёрта, ставить с Z-грани)/резьба/защёлки (изгиб в XY) по правилам.
  • Полости — дренаж/вент; критичные поверхности не под «лесенкой»/поддержкой.
  • Предусловия экспорта: единое тело/манифолд; построение чистое.

Гео-аудит (кратко)

Лёгкая самопроверка построенной модели существующими инструментами осмотра MCP — вызовами, а не пожеланиями:

  • Нависания одним отбором: list_faces(normal="0,0,-1", normalTolerance=90−θ_max, minZ=<Zmin+0.1>) — всё вернувшееся кандидаты в нависания, и тем хуже, чем ближе нормаль к чистому −Z (горизонтальный потолок). При дефолтном θ_max=45° допуск равен 45 — это совпадение чисел, а не тождество: для PETG с θ_max=40° допуск 50. minZ тут не украшение, а условие правильности. Отбор по нормали ЗНАКОВЫЙ, а у грани, лежащей на столе, внешняя нормаль равна ровно (0, 0, −1) — она проходит при ЛЮБОМ допуске и выглядит САМЫМ страшным нависанием, хотя это опорное пятно. Замер на кронштейне: тот же отбор без minZ (допуск 45°) вернул девять граней, и наибольшая из них — 515.44 мм² с центром ровно на Zmin (−50.50) — была пятном первого слоя. Первый слой печатается по столу и нависанием не бывает: отсекайте его окном, Zmin берите из describe_model(sections="box"). minArea — вторая половина того же отбора. Угол наклона грани — критерий для ПРОТЯЖЁННОГО нависания; на грани в единицы мм² он не значит ничего, потому что перекрыть надо не угол, а пролёт. Замер: крыша отверстия Ø6, срезанная касательными под 22.5° к горизонтали, приходит в улов как нарушение (нависание 67.5° при пороге 45°) — при площади 2.84 мм² и пролёте 2.30 мм, который печатается заведомо. Ставьте minArea порядка 5–10 мм², а всё мелкое, что всё же хотите проверить, судите пролётом (measure), а не углом: иначе аудит гонит на редизайн там, где всё в порядке. Дальше list_faces(index=N) по подозрительным; цилиндр с горизонтальной осью → нужен teardrop.

  • Пролёт моста меряют, а не считают по эскизу: measure(kind1="face", index1=…, kind2="face", index2=…) между ВНУТРЕННИМИ гранями опор (замер: 49.0 мм между стойками). Сравнивать с §2 fdm-rules.md: 49 мм при потолке PLA 15–25 мм — это редизайн, а не «как-нибудь напечатается».

  • Устойчивость высокой печати — самая дешёвая проверка из всех и единственная, которой нет больше нигде, но стоит она ТРЁХ вызовов, а не одного, и площади пятна для неё НЕ хватает: list_faces отдаёт по грани площадь, нормаль и центр — ни границ, ни полуширины из них не выводится. Очертание пятна даёт list_edges: он печатает координаты концов рёбер, а окно по Z оставляет только рёбра первого слоя.

    1. describe_model(sections="box")Zmin.
    2. describe_model(sections="mass") → центр масс в мировых координатах (даром).
    3. list_edges(minZ=<Zmin0.1>, maxZ=<Zmin+0.1>) → концы рёбер пятна; их разброс по X и по Y и есть прямоугольник пятна, а половина меньшей стороны — полуширина в узком направлении. У КРУГЛОГО пятна так не выйдет: у замкнутой окружности концы совпадают, разброс схлопывается в точку. Тогда полуширина — радиус, и берут его list_faces(index=N) (у грани печатается радиус) или из длины ребра (πD).

    Проверок две: проекция ЦМ (x, y) обязана лежать внутри этого прямоугольника (у консольной детали «стоя» она легко уходит за него — деталь падает недопечатанной), и высота ЦМ над столом (z_ЦМ Zmin) ≲3× полуширины (эвристика; выше — интегральный фланец §5 или разбиение §13). Замер (кронштейн «стоя»): габарит Z 50.50…180.00, ЦМ (0.00, 4.93, 56.61); list_edges(minZ=51, maxZ=50) вернул четыре ребра — X 50.50…50.50, Y 0.00…8.00, то есть пятно 101 × 8 мм. Проекция ЦМ (0.00, 4.93) внутри прямоугольника — первая проверка пройдена; высота ЦМ над столом 56.61 − (50.50) = 107.1 мм при полуширине узкого направления 4 мм, это 27× при пороге 3× — вторая провалена. Сработало именно второе число, и без очертания пятна взять его было неоткуда.

  • Тело, габарит, номиналы: describe_model(sections="bodies") + чистое построение (единое тело), describe_model(sections="box") (как ось слоёв соотносится с габаритом), measure.

Границы и методика — references/geometry-audit.md. Аудит эвристический; истинная мин. толщина стенки и полный детект криволинейных нависаний не решаются — это не приговор и не доказательство печатнопригодности.

Просвет канала и толщину перемычки спрашивают, а не считают. measure(kind1="body", index1=0, kind2="body", index2=1) даёт минимальное расстояние между телами целиком — не нужно угадывать, какие именно стенки сближаются. Ответ включает координаты двух ближайших точек, то есть показывает, где узко. Сравнивайте с 2·w (два прохода сопла): канал уже этого не пропечатается, а найти его арифметикой по эскизу — значит найти его случайно. То же для двух конкретных стенок: kind=face с индексом из list_faces или с точкой на грани (x1,y1,z1).

Связанное