kompas 0.3.0 (из fcedb44f5661313ffd0570e3808a5309f6ae8cb7)

This commit is contained in:
gitea-actions
2026-08-16 10:02:12 +00:00
parent c62794b415
commit 94e044bd03
21 changed files with 762 additions and 433 deletions
+131 -22
View File
@@ -51,8 +51,13 @@ description: >
## Два правила (соблюдай всегда)
**1. Ориентация печати — первое проектное решение.**
- **Спроси у пользователя** (если не задано): главное направление рабочей нагрузки и
косметические/критичные грани. **Путь нагрузки из геометрии не выводится** — его задаёт задача.
- **Путь нагрузки и косметические грани из геометрии не выводятся** — их задаёт задача. Спроси
пользователя, **если есть кого спрашивать**; работаешь автономно (субагент, пакетный прогон) —
выведи из постановки: что деталь держит, куда смотрит рабочая поверхность, чем она крепится.
Выведенное — **запиши допущением** в ответ («принято: нагрузка — вес камеры 150 г вниз на плече
53 мм; косметика не задана»), чтобы человек увидел, что именно ты предположил. Молчаливое
«спросить некого» — не повод пропустить решение об ориентации: без него все дальнейшие правила
повисают.
- Реши постановку на стол (ось Z = рост слоёв). От неё зависит: где нависания; куда смотрят
отверстия (вертикальные → компенсация Ø; горизонтальные → teardrop); путь нагрузки (**держи в
XY**; Z-сжатие можно, Z-растяжение/срез — нет); плоскости сопряжения (на XY-гранях); «лесенка» на
@@ -65,47 +70,151 @@ description: >
**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): опрос (нагрузка/косметика) → постановка, ось слоёв, сопряжения,
«лесенка», поддержки.
2. **Ориентация** (правило 1 + §«когда три требования не сходятся»): нагрузка/косметика — опросом
или допущением → перебор постановок с числами → ось слоёв, сопряжения, «лесенка», поддержки.
3. **Правила эскиза/операции** (строй через `kompas-3d`): стенки `n·w`; нависания → скос под
`θ_max`; горизонтальные отверстия → teardrop; вертикальные → компенсация Ø; фаска у основания;
`θ_max`; горизонтальные отверстия → teardrop (полная капля; усечённая касательная, если клюв
мешает виду; мягкий колпачок, если по отверстию идёт посадка — выбор и формулы в
`references/fdm-rules.md` §3), причём у МЕЛКОГО отверстия форму выбирают по ПРОЛЁТУ крыши,
а не по углу боковин; вертикальные → компенсация Ø; фаска у основания;
зазоры посадок (со знаком); заходные фаски; мин. элементы/текст; бобышки/инсёрты/защёлки.
Числа — в `references/fdm-rules.md`.
4. **Гео-аудит** (`references/geometry-audit.md`) — инструментами осмотра.
5. **Предусловия экспорта**: единое тело/манифолд (`boolean_union` при необходимости) →
5. **Предусловия выдачи**: единое тело/манифолд (`boolean_union` при необходимости) →
построение чистое.
6. **Чек-лист**экспорт **через `export_model`**: слайсеру нужен `.stl`
(`export_model(path="…​.stl")` — двоичная сетка), а `.step` остаётся для передачи модели в САПР.
6. **Чек-лист**выдача. Обменный файл кладите **только если о нём попросили**: модель самоценна,
а нарезает её человек сам. Попросили — `export_model` (`.stl` — двоичная сетка для слайсера,
`.step` — для передачи модели в другую САПР).
## Чек-лист печатнопригодности
- [ ] Направление нагрузки и косметические грани **получены от пользователя**; ориентация
зафиксирована; нагрузка в XY (или Z только на сжатие); сопряжения на XY-гранях.
- [ ] Направление нагрузки и косметические грани **получены от пользователя или выведены из
постановки и записаны допущением**; ориентация выбрана числом (запас `σ_меж/σ`), а не по
умолчанию; нагрузка в XY (или Z только на сжатие, или запас ≥10×); сопряжения на XY-гранях.
- [ ] Стенки кратны `w` (≥2·w; несущие ≥3·w, т.е. 3 периметра); нет «не кратных `w`» (кроме
функциональных).
- [ ] Нет 90°-полок; нависания ≤`θ_max` или заменены скосами; мосты в пределах пролёта по короткой
стороне (числа — `references/fdm-rules.md`); внутренним поддержкам — доступ.
- [ ] Горизонтальные отверстия — teardrop/D (геометрия из `θ_max`); вертикальные — компенсация Ø;
глухие — дно ≥2–3 мм.
- [ ] Фаска у основания (elephant foot); внутренние углы ≥R0.5; опорная площадка есть.
- [ ] Нет 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 **НЕ** прибавлен к зазору;
заходные фаски на сопряжениях.
- [ ] Мин. элементы/текст ≥ порогов; аспект тонких выступов ≤4–5×.
- [ ] Мин. элементы/текст ≥ порогов (у надписи проверен ШТРИХ, а не кегль: чертёжный шрифт даёт
`h/14` и порога не берёт — `references/fdm-rules.md` §7); сторона грани под надпись выбрана
так, чтобы она не вышла зеркальной (§10); аспект тонких выступов ≤4–5×.
- [ ] Бобышки/инсёрты (бор отверстия ≤ OD инсёрта, ставить с Z-грани)/резьба/защёлки (изгиб в XY) по правилам.
- [ ] Полости — дренаж/вент; критичные поверхности не под «лесенкой»/поддержкой.
- [ ] Предусловия экспорта: единое тело/манифолд; построение чистое.
## Гео-аудит (кратко)
Лёгкая самопроверка построенной модели **существующими** инструментами осмотра MCP:
`describe_model` / `list_faces` / `list_faces(index=N)` (нависания по нормалям нижних граней; цилиндры с
горизонтальной осью → нужен teardrop), `describe_model(sections="box")` (как ось слоёв соотносится с габаритом),
`measure` (номиналы/зазоры), `describe_model(sections="bodies")` + чистое построение (единое тело). **Границы и методика —
`references/geometry-audit.md`.** Аудит эвристический; истинная мин. толщина стенки и полный детект
криволинейных нависаний не решаются — это **не приговор и не доказательство печатнопригодности**.
Лёгкая самопроверка построенной модели **существующими** инструментами осмотра 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)` даёт минимальное расстояние между телами целиком — не нужно угадывать, какие
@@ -38,10 +38,46 @@
критичные — рассверливать.
- **Горизонтальные (ось в XY)** → **teardrop** или **D-отверстие** (плоский верх). Мин. Ø **2 мм**.
Круглая часть тоже печатается уже → **+0.10.2 мм** к её Ø.
- **Геометрия teardrop:** боковины касательны окружности под углом `θ_max` к вертикали (с двух
сторон), сходятся в вершине на вертикальной оси. Высота вершины над центром = **`r / sin θ_max`**;
включённый угол при вершине = **`2·θ_max`**. При `θ_max`=45° → `r/sin45° = √2·r ≈ 1.414·r` над
центром (= **0.414·r над верхом окружности**), угол 90°. Низ — оставшаяся дуга окружности.
- **Геометрия teardrop (полная капля):** боковины касательны окружности под углом `θ_max` к вертикали
(с двух сторон), сходятся в вершине на вертикальной оси. Высота вершины над центром =
**`r / sin θ_max`**; включённый угол при вершине = **`2·θ_max`**. При `θ_max`=45° →
`r/sin45° = √2·r ≈ 1.414·r` над центром (= **0.414·r над верхом окружности**), угол 90°.
Низ — оставшаяся дуга окружности. Это единственная форма, у которой ВСЯ крыша самонесущая по
критерию `θ_max`; платой идёт максимальное искажение круга (при `θ_max`=45° некруглыми становятся
90° дуги из 360°).
- **Усечённая касательная капля — когда клюв мешает глазу.** Полная капля при `θ_max`=45° выступает
на 0.414·r, и на мелком отверстии это заметно. Та же конструкция, но с точкой касания на `±φ` от
макушки при `φ < θ_max`: боковины остаются КАСАТЕЛЬНЫМИ (контур гладкий, излома на стыке с дугой
нет, круг не срезается вовсе), а
- вершина над центром = **`r / cos φ`**, то есть выступ над окружностью = **`r·(1/cos φ 1)`**;
- боковины наклонены к вертикали на **`90° φ`** — тем положе, чем короче клюв;
- перекрываемый пролёт = **`2r·sin φ`**.
**Судить эту форму по углу боковин бесполезно — судите по пролёту.** У маленького отверстия
`2r·sin φ` укладывается в единицы миллиметров, а мост такой длины FDM печатает не задумываясь:
`θ_max` — критерий для ПРОТЯЖЁННЫХ нависаний, а не для перемычки в пару миллиметров.
Замер (Ø6, `φ`=22.5°): выступ **0.247 мм** против 1.243 у полной капли, пролёт **2.30 мм**,
боковины 67.5° от вертикали — печатается без поддержек, крыша отверстия чистая.
- **Мягкий колпачок — когда круглость важнее, чем полная самонесущесть.** Посадка вала, подшипник,
штифт: полная капля съедает верхнюю четверть окружности, и сопряжение по ней уже не работает.
Тогда заменяют не сектор `±(90−θ_max)`, а УЗКИЙ сектор `±φ` у самой макушки, подняв вершину на
`k` слоёв (`k·h`) над окружностью:
- точки стыка — на `±φ` от макушки, вершина — на оси, на `r + k·h` над центром;
- включённый угол при вершине = **`2·arctan( r·sin φ / (r + k·h r·cos φ) )`**;
- **угол остаётся ТУПЫМ, пока `r·(sin φ + cos φ 1) > k·h`** — это и есть связь между шириной
сектора и подъёмом: ужимая `φ`, синхронно снижайте `k`, иначе колпачок вырождается в шпиль.
- Замер (Ø8, `φ`=12°, `k`=2 при `h`=0.2, т.е. подъём 0.4 мм): круглыми остаются **336° из 360°**,
стык отходит от оси на **±0.83 мм**, угол при вершине **119°**, боковины — 59.6° от вертикали.
- **Честная граница приёма:** у чистой окружности зона нависания — сектор `±(90−θ_max)` от макушки
(при 45° это ±45°, ширина `2r·sin45°`≈1.41·r). Колпачок `±12°` снимает только самую макушку —
участок от 12° до 45° остаётся нависанием. То есть это НЕ решение по `θ_max`, а замена плоского
потолка на микро-мост шириной ~`2r·sin φ` за `k` слоёв. Берите его осознанно: круглость в обмен
на частичное улучшение печати, а не на полное.
- **Точки касания задавайте с ПОЛНОЙ точностью — округление рвёт контур.** Дуга плюс две касательные
замыкаются у КОМПАС по допуску жёстче обычного округления: те же координаты, срезанные до 6 знаков
(16.668356 вместо 16.6683532), дали «код 19: контур должен быть замкнут», и вырез развалился.
Коварство в том, что `sketch_update` отчитался габаритом как об успехе — невалидность вылезла
только предупреждением «2 операц. в ошибке». Считайте `r·sin φ`/`r·cos φ` и подставляйте все знаки.
- **Глухое отверстие:** дно = внутренний мост → **толщина дна ≥2–3 мм** или купольное/
вентилируемое. Сквозные предпочтительнее.
- **Отступ от края** — через остаточную перемычку: стенка между отверстием и краем **≥23·w**
@@ -73,6 +109,9 @@
## 6. Ориентация и прочность
- **Z (межслойная) прочность от XY:** PLA ~4055%, PETG ~3550%, **ABS ~2035% (выброс)**. Несущую
нагрузку — в **XY (вдоль слоёв)**.
- **В абсолютных числах** (нужны, чтобы посчитать запас — SKILL.md §«Ориентация: когда три
требования не сходятся»): XY на разрыв PLA ~5060 МПа, PETG ~4550, ABS ~3540 ⇒ межслойная
**PLA ~2030, PETG ~1525, ABS ~815 МПа**. Порядок величины, не паспорт конкретного филамента.
- **Z-сжатие допустимо** (слои в сжатии не расслаиваются); избегать **Z-растяжения и Z-среза**.
- Изгиб: слои в растяжении/сжатии, не на срез по линии слоя.
- Z-нагрузка неизбежна → **увеличить несущее сечение** ~×2 относительно XY-расчёта.
@@ -84,6 +123,13 @@
- **Выпуклый** текст: штрих **≥0.5 мм**, высота **≥2·h (~0.4 мм)**, sans-serif bold.
- **Гравированный** текст: штрих **≥2·w (~0.80.9 мм)** (нужно ≥2 периметра; 0.6 мм не влезает),
глубина **≥2·h (~0.4 мм)**. (pt не используем — геометрия в мм.)
- **Штрих задаёт ШРИФТ, а не кегль, и чертёжные шрифты под печать не годятся.** По ГОСТ 2.304
толщина линии чертёжного шрифта равна `h/14`: кегль 8 даёт 0.57 мм — полторы ширины сопла, то
есть ниже порога 2·w. Такой шрифт берёт порог только с кегля ~13 мм, а уверенно читаемые 3·w —
с ~18 мм. У жирного гротеска штрих ≈ `h/4.5` (Arial Black при кегле 10 → ~2.2 мм), и порог
выполняется с запасом уже на кегле 4–5 мм. Замер: «2» кеглем 8 шрифтом GOST type A на
вертикальной стенке не читается вовсе; тот же символ кеглем 10 шрифтом Arial Black читается
издалека. Маркировку набирайте жирным sans-serif и проверяйте штрих, а не высоту.
## 8. «Лесенка» (staircase) — критерий ориентации
- Наклонные/криволинейные поверхности дают ступени: глубина ≈ **`h / tan(α)`** (α — угол от
@@ -107,6 +153,13 @@
верхнего слоя (там видны швы и «лесенка»). Тогда деталь и моделируют в этой ориентации — лицом
к XOY, — а несимметричный рисунок (логотип, текст) **зеркалят**: на лицевую грань смотрят
со стороны −Z. Проверка — снимок со стороны лица (`model_snapshot(view=rear)` для эскиза на XOY).
- **Зеркалит не только лицо на столе — зеркалит ЛЮБАЯ грань, обращённая против нормали эскиза.**
Надпись читается с той стороны, куда смотрит нормаль плоскости: XOY → **+Z**, XOZ → **+Y**,
YOZ → **−X** (нормаль YOZ уходит в МИНУС X — тот же замер, что разворачивает на ней выдавливание).
Значит гравировка по эскизу на YOZ, положенная на щеку с бОльшим X, выйдет зеркальной, а на
щеку X=0 — правильной. Замер: цифра на щеке X=20.4 читалась зеркально при ЛЮБОМ `angle`; тот же
эскиз, перенесённый на X=0, встал верно. **Поворотом это не лечится**`angle` вращает, а не
отражает; лечится выбором грани (или зеркальным контуром).
- **Фаска по лицевому контуру — это ещё и размер первого слоя.** При 45° она сжимает силуэт лица
на катет `c` по всему периметру, поэтому её потолок задаёт не эстетика, а то, что останется:
`ширина_штриха − 2c ≥ 2·w`. У широкого рисунка (штрих ~10 мм) ограничением становится толщина
@@ -118,24 +171,19 @@
вписанную окружность, узкое место с координатами и таблицу «офсет `c` → на сколько кусков
распалось лицо» — ничего не строя.
- **Узкое место зависит от СОСТОЯНИЯ контура, поэтому порядок такой: чистка → замер чищеного →
катет.** Замеры на обводке логотипа шириной 105 мм (штрих по наибольшей вписанной 11.5 мм):
| контур | узкое место | лицо распадается при |
|---|---|---|
| исходный, 54 примитива | 1.98 мм | c = 0.99 |
| чищеный порогом 0.5, 34 примитива | **1.82 мм** | **c = 0.91** |
Чистка (`minSegment`) заменяет скругления острыми углами: в выпуклом углу это добавляет материал,
в вогнутом — срезает, а перемычки между штрихами образованы как раз вогнутыми углами. То есть
операция, которую делают РАДИ фаски, уменьшает допустимый катет. Мерьте после неё.
- **Норматив катета — `c = stroke_min/2 w`**, где `stroke_min` узкое место, `w` — ширина нити.
Он и есть решение неравенства `ширина 2c ≥ 2w`. На том же логотипе: `1.82/2 0.4 = 0.51`,
и в узком месте остаётся ровно 0.80 мм — два прохода сопла.
**Осторожно с «эталонными» значениями из прошлых работ:** принятая когда-то на этом логотипе
фаска 0.8 собственному правилу НЕ удовлетворяет (`1.82 1.6 = 0.22 мм` против нужных 0.8; даже
по нечищеному контуру `1.98 1.6 = 0.38`). Она оставляет в узком месте одну нить экструзии —
тело там сплошное, рвётся косметика лицевой грани, а это как раз та поверхность, ради которой
деталь и кладут лицом на стол.
катет.** Чистка (`minSegment`) заменяет скругления острыми углами: в выпуклом углу это добавляет
материал, в вогнутом — срезает, а перемычки между штрихами образованы как раз вогнутыми углами.
То есть операция, которую делают РАДИ фаски, уменьшает допустимый катет — на обводке логотипа это
единицы процентов, и хватает, чтобы катет перестал проходить свой же критерий. Мерьте после неё,
тем же порогом, каким будете строить.
- **Норматив катета — `c = stroke_min/2 w`**, где `stroke_min` — узкое место ЧИЩЕНОГО силуэта,
`w` — ширина нити. Он и есть решение неравенства `ширина 2c ≥ 2w`: в узком месте остаётся
ровно `2w`, два прохода сопла. Считайте его на своём контуре — величина принадлежит рисунку.
**Осторожно с «эталонными» значениями из прошлых работ:** катет, принятый когда-то на похожем
знаке, своему же правилу обычно не удовлетворяет — он подбирался под другой рисунок, другой порог
чистки или вовсе на глаз. Катет вдвое сверх норматива оставляет в узком месте одну нить экструзии:
тело там сплошное, рвётся косметика лицевой грани — та самая поверхность, ради которой деталь и
кладут лицом на стол. Сверьте нормативом, а не воспоминанием.
- **Верхние рёбра — скругление** (R0.5–2.0); **но** радиус **> ~½ толщины стенки** сам даёт
нависание > `θ_max` → тогда фаска/ступень.
- **Внутренние углы — всегда скругление ≥R0.5**.
@@ -7,18 +7,45 @@
| Проверка | Как | Статус |
|---|---|---|
| Нависания (приближённо) | `list_faces`, затем `list_faces(index=N)`: для **нижних** граней угол поверхности от вертикали; > `θ_max` → флаг | ✅ плоские; ⚠️ криволинейные грубо |
| Нависания (приближённо) | `list_faces(normal="0,0,-1", normalTolerance=90−θ_max, minZ=<Zmin+0.1>)` — весь улов кандидаты; подробности `list_faces(index=N)` | ✅ плоские; ⚠️ криволинейные грубо |
| Ориентация (геом. прокси) | `describe_model(sections="box")`: как ось слоёв соотносится с габаритом | ⚠️ длинная ось ≠ путь нагрузки |
| Горизонтальные круглые отверстия | `list_faces(index=N)`: цилиндр с горизонтальной осью → «нужен teardrop» | ✅ |
| Пролёт моста | `measure(kind1="face", index1=…, kind2="face", index2=…)` между внутренними гранями опор | ✅ |
| Устойчивость высокой печати | `describe_model(sections="mass")` — центр масс; `list_edges(minZ=<Zmin0.1>, maxZ=<Zmin+0.1>)` — очертание опорного пятна по концам рёбер (площадь пятна из `list_faces` для этого не годится) | ✅ проекция ЦМ; ⚠️ порог по высоте — эвристика |
| Номиналы / зазоры / габариты | `measure` между гранями; `describe_model(sections="box")` | ✅ |
| Тело / манифолд перед выдачей | `describe_model(sections="bodies")` (одно тело?), итог проверки построения в ответе операции | ✅ |
**Почему допуск отбора нависаний равен `90−θ_max`.** `θ_max` меряют от вертикали, а отбор идёт по
НОРМАЛИ: у поверхности, наклонённой на `θ` от вертикали, нормаль отстоит от −Z на `90−θ`. Значит
нависание (`θ > θ_max`) — это в точности «нормаль ближе `90−θ_max` к −Z». При дефолтном `θ_max`=45°
допуск численно равен 45, и это совпадение сбивает: для PETG с `θ_max`=40° правильный допуск **50**,
а не 40.
**И почему у отбора нависаний обязано быть `minZ`.** Отбор по нормали ЗНАКОВЫЙ: грань проходит,
если её нормаль отклонилась от заданного направления не более чем на допуск. У грани, лежащей на
столе, внешняя нормаль равна ровно (0, 0, −1) — отклонение нулевое, значит она проходит при ЛЮБОМ
допуске и по описанному критерию («тем хуже, чем ближе к чистому −Z») выглядит худшим нависанием
детали. Замер: тот же отбор без `minZ` (допуск 45°) на кронштейне вернул девять граней, наибольшая —
515.44 мм² с центром ровно на `Zmin` (−50.50) — и это опорное пятно, а не нависание.
Нижняя граница окна (`minZ = Zmin + 0.1`, `Zmin` из `describe_model(sections="box")`) убирает
первый слой из улова.
**Пролёт и пятно — числа, а не впечатления.** Замеры на кронштейне камеры: пролёт между стойками
**49.0 мм** (потолок PLA по §2 `fdm-rules.md` — 15–25 мм, то есть редизайн); опорное пятно
«стоя» — `list_edges(minZ=51, maxZ=50)` дал четыре ребра, `X 50.50…50.50`, `Y 0.00…8.00`, то
есть **101 × 8 мм**, а ЦМ из `sections="mass"``(0.00, 4.93, 56.61)`: проекция внутри пятна, но
высота ЦМ над столом **107.1 мм** против полуширины **4 мм** — 27× при пороге 3×. Ни то, ни другое
не выводится из эскиза арифметикой — оба стоят одного вызова.
## Граница честности
- **Угол нависания** мерить в **той же конвенции, что fdm-rules.md** (от вертикали; нижняя грань с
поверхностью > `θ_max` от вертикали = нависание) — не путать с углом нормали от горизонтали.
- **Путь нагрузки агент НЕ выводит из габарита** — берёт из задачи/опроса (правило 1). Длинная ось
≠ несущая.
- **Путь нагрузки агент НЕ выводит из габарита** — берёт из задачи, из опроса, а работая автономно
— из постановки, и тогда записывает допущением (правило 1). Длинная ось ≠ несущая.
- **«Нагрузка в XY» — требование с порогом, а не догма.** Обязательность ориентации решает запас
`σ_меж/σ` (SKILL.md, §«Ориентация: когда три требования не сходятся»); при запасе ≥10× выбор
делают нависания и устойчивость, а не слои.
- **Истинная мин. толщина стенки и полный детект криволинейных нависаний — не решаются** (нет
thickness/overhang-солвера).
- **Аудит эвристический и НЕ доказывает печатнопригодность** (не ловит анизотропию/путь нагрузки).
@@ -29,5 +56,7 @@
1. После построения, убедившись что оно чистое, — пройти таблицу выше сверху вниз.
2. Каждый флаг — сверить с соответствующим правилом `fdm-rules.md` и решить: исправить геометрию
или принять осознанно.
3. Путь нагрузки и косметические грани взять из ответа пользователя (правило 1), не из габарита.
4. Затем — чек-лист печатнопригодности (SKILL.md) → экспорт через `export_model` (`.stl` в слайсер).
3. Путь нагрузки и косметические грани взять из ответа пользователя или из постановки (правило 1),
не из габарита; ориентацию закрыть прикидкой `σ_меж/σ`.
4. Затем — чек-лист печатнопригодности (SKILL.md) → выдача; обменный файл (`export_model`) —
только если о нём просили.