Программа реза описывает ДЕТАЛЬ: что снять с болванки и чем. 15 операций ниже — весь словарь: каждая вычитает объём из заготовки и печатает свой кусок G-code. Страница разбирает сквозные правила (они не очевидны и стоили нам дорого), затем каждую операцию — параметры, единицы, ограничения.
Ноль программы — ближний левый угол болванки. Z = 0 — её верхняя грань,
вглубь материала отрицательно. Ни один генератор не прибавляет к координатам ничего:
где болванка физически лежит на столе, знает рабочее смещение станка
(G54) и цифровой двойник, а не текст программы.
Следствие, ради которого правило и заведено: программа переносима. Та же деталь даёт
тот же текст, где бы заготовка ни стояла и на каком бы из ваших станков ни резалась.
Смещение применяет стойка — один раз, в G54.
Цена нарушения известна: пока генератор впечатывал место болванки в координаты, стойка складывала смещение второй раз, и программы уходили за предел хода на первой же строке реза. Инвариант теперь держит тест: сдвиг начала заготовки не меняет G-code ни на байт.
Первый вызов любой программы объявляет болванку: stock(W, H, T, материал)
для фрезерной, bar({ diameter, length }) для токарной. Дальше
операции только снимают материал — ничего не добавляется и не переносится. Модель
детали после каждого шага = заготовка минус все предыдущие съёмы.
У болванки есть параметры установки, которые часто забывают, а они решают судьбу сквозного реза:
// pad — жертвенная подложка под болванкой, through — насколько сквозной
// рез в неё заходит, zOffset — подъём заготовки над столом (тиски, подставки).
stock(200, 100, 50, { material: 'aluminum', pad: 10, through: 0.3, zOffset: 10 }); Без pad сквозной рез честно ограничен толщиной болванки
(thru: true даёт ровно T, а не T с запасом) и рискует уйти в стол.
zOffset поднимает саму заготовку на подклад — иначе подклад пришлось бы
резать ниже хода оси станка.
| параметр | смысл | ед. | умолчание |
|---|---|---|---|
| W, H, T | ширина, глубина, толщина болванки | мм | — |
| material | материал заготовки, влияет на режимы | — | aluminum |
| at | где болванка лежит в рабочей зоне, от её угла | мм | центр зоны станка |
| pad | жертвенная подложка под болванкой | мм | 0 (нет) |
| through | заход в подложку при сквозном резе | мм | 0.2 |
| zOffset | подъём заготовки над столом (тиски, подставки) | мм | 0 (лежит на столе) |
В программе пишется tool: T4, а не tool: 6.8. Число отвечает
ровно на один вопрос — «какой диаметр», — а дальше по цепочке спрашивают ещё четыре, и
из числа их не достать:
toolcheck() перед пуском, и он же
ограничивает глубину прохода;M6 T<n> и G43 H<n> в шапке шага
обязаны быть РЕАЛЬНЫМ слотом таблицы инструмента станка.Ссылка на слот отвечает на все пять сразу и не заводит второй правды: таблица инструмента станка — часть двойника. Слот, которого в таблице нет, объявляется пустым и падает при использовании — со списком того, что в таблице есть.
Молчаливой подстановки нет. Раньше операция без
названного инструмента тихо резалась «фрезой Ø6» — это была угроза безопасности:
программа выглядела рабочей и уходила на станок с чужим диаметром. Сегодня не назвали
tool — работает явный путь «просто диаметр», с пометкой, что профиль и
вылет неизвестны. Никто ничего не подставляет за вас.
Одинаковые операции одной фрезой — это ОДИН шаг и одна смена инструмента: четыре
отверстия Ø3 не превращаются в четыре шага. Разные инструменты — разные шаги. Шапка
каждого шага печатает M6 T<n> и G43 H<n>, поэтому
порядок шагов и есть порядок смен на станке.
Номера слотов раздаёт тот, кто вызывает генератор, по правилу первого появления, и они обязаны совпадать с таблицей инструмента станка. Программа с двумя фрезами даёт две шапки — по одной на каждый вызов.
«Глагол» — то, что пишет автор программы. «Движок» — идентификатор
генератора, который возвращает GET /api/generators вместе со схемой его
параметров: по нему интегратор строит вызовы, минуя интерфейс. Таблицы параметров в
разборах ниже описывают ГЛАГОЛ — то, что пишет автор в лаборатории. Схему самого
движка (ключи API, границы, умолчания) смотрите в
порождённом разделе сразу за этой таблицей:
умолчания у глагола и у движка могут отличаться, и это нормально — глагол
подставляет своё, прежде чем позвать движок.
| глагол | движок | операция | что делает | парам. |
|---|---|---|---|---|
| face | python_face | Торцовка | Снять ровный слой со всего верха заготовки, zig-zag. | 7 |
| python_pocket | Карман прямоугольный / круглый | Прямоугольник — zigzag, круг — спираль из центра. | 11 | |
| python_zone_pocket | Зона (универсальная выборка) | Выборка между внешней границей и островами, с уклоном стенок. | 10 | |
| terrain | python_terrain_pocket | Террасный карман (изолинии) | Несколько контуров на разных глубинах — террасы, режутся кольцами. | 6 |
| wallfinish | python_pocket_wall_finish | Чистовая стенка (waterline) | Финиш наклонной стенки сферической фрезой по Z-уровням. | 8 |
| drill | python_drill | Сверловка списком точек | Peck-сверловка: заглубление шагами с подъёмом на чистку стружки. | 5 |
| thread | python_thread_mill | Резьбофрезерование | Внутренняя резьба винтовой интерполяцией или вращением стола. | 14 |
| contour | python_contour | Контур по полигону | Обход замкнутого контура снаружи, внутри или по центру. | 7 |
| chamfer | python_chamfer | Фаска по рёбрам | Скос рёбер V-битом, ширина следует из глубины и угла. | 7 |
| fillet | python_edge_round | Скругление кромки | Четверть тора вместо острого угла, только сферическая фреза. | 7 |
| engrave | python_engrave | Гравировка V-битом | Ломаная на фиксированной глубине: маркировка, надписи. | 5 |
| turn | python_turn_profile | Точение профиля | Токарная: торцовка + черновые по уровням Ø + чистовой контур. | 8 |
| partOff | python_part_off | Отрезка | Токарная: отрезной резец режет пруток пе́ками в одной плоскости Z. | 7 |
| groove | python_groove | Канавка | Токарная: канавочный резец врезается пе́ками до дна на участке оси. | 8 |
| — | python_tool_change | Смена инструмента | Служебный шаг: ритуал смены берётся у головы станка. | 5 |
Токарные операции (turn,
partOff, groove) требуют токарного станка: они пишут в плоскости
XZ, X — ДИАМЕТР (режим G7, «как в цеху»: Ø40 на чертеже и X40 в программе —
одно число), шпиндель постоянных оборотов G97. На фрезере они недоступны.
GET /api/generatorsТаблицы ниже ПОРОЖДЕНЫ из реестра генераторов платформы
(backend/src/aicnc/services/generators_registry.py :: list_generators()) и пересобираются скриптом, а не переписываются руками:
разойтись с кодом они не могут. Здесь — инженерный слой: ключи, типы, единицы,
умолчания и границы, которые движок принимает по API. Это НЕ то же самое, что
параметры глагола в лаборатории: автор программы пишет depth, движок
принимает depth_mm. Разборы каждой операции ниже по странице говорят о
глаголе; здесь — о движке под ним.
Пустая клетка значит «в источнике не объявлено» — правдоподобное значение сюда не подставляется.
python_face — Торцовка · глагол faceZig-zag торцовка прямоугольной области с переменным step-down. Используется как roughing для снятия лицевого слоя заготовки.
| ключ | подпись в интерфейсе | тип | ед. | умолчание | границы / варианты |
|---|---|---|---|---|---|
| rect | Область [x0,y0,x1,y1] | string | — | [0,0,100,60] | — |
| depth_mm | Глубина | number | мм | 1.5 | 0.1 … 20 |
| step_over | Step-over (% от Ø) | number | % | 70 | 10 … 90 |
| step_down | Step-down | number | мм | 0.6 | 0.05 … 5 |
| tool_diameter | Ø инструмента | number | мм | 10 | 1 … 50 |
| rpm | Обороты | integer | об/мин | 12000 | — |
| feed | Подача | number | мм/мин | 800 | — |
python_pocket — Карман прямоугольный / круглый · глагол pocketКарман с zigzag-стратегией (прямоугольный) или спиральной выборкой из центра (круглый). Контур → внутренние проходы. Подходит для roughing / финишной обработки карманов.
| ключ | подпись в интерфейсе | тип | ед. | умолчание | границы / варианты |
|---|---|---|---|---|---|
| shape | Форма | select | — | rect | rect · circle |
| rect | Карман [x0,y0,x1,y1] | string | — | [20,15,80,45] | — |
| cx | Центр X (круг) | number | мм | 50 | 0 … 1000 |
| cy | Центр Y (круг) | number | мм | 30 | 0 … 1000 |
| diameter_mm | Диаметр (круг) | number | мм | 30 | 1 … 500 |
| depth_mm | Глубина | number | мм | 4 | 0.5 … 30 |
| step_over | Step-over (% от Ø) | number | % | 50 | 10 … 90 |
| step_down | Step-down | number | мм | 1 | 0.1 … 5 |
| tool_diameter | Ø инструмента | number | мм | 6 | 1 … 20 |
| rpm | Обороты | integer | об/мин | 12000 | — |
| feed | Подача | number | мм/мин | 600 | — |
python_zone_pocket — Зона (универсальная выборка) · глагол pocketВыборка материала между внешним и (опц.) внутренним полигоном. Профайл, карман, карман-с-островом — частные случаи. Полигоны трактуются как непересекаемые границы — фреза НЕ выходит за outer и НЕ заходит внутрь inner.
| ключ | подпись в интерфейсе | тип | ед. | умолчание | границы / варианты |
|---|---|---|---|---|---|
| outer | Внешняя граница [[x,y],…] | string | — | [[10,10],[90,10],[90,70],[10,70]] | — |
| inner | Остров (опц.) [[x,y],…] | string | — | — | — |
| islands | Острова (опц.) [[[x,y],…],…] | string | — | — | — |
| taper_deg | Уклон стенок (draft) | number | ° | 0 | 0 … 45 |
| depth_mm | Глубина | number | мм | 3 | 0.1 … 50 |
| step_down | Step-down | number | мм | 1 | 0.1 … 5 |
| step_over | Step-over (% от Ø) | number | % | 50 | 10 … 85 |
| tool_diameter | Ø инструмента | number | мм | 6 | 0.5 … 20 |
| rpm | Обороты | integer | об/мин | 12000 | — |
| feed | Подача | number | мм/мин | 400 | — |
python_terrain_pocket — Террасный карман (изолинии) · глагол terrainКарман с переменной глубиной — несколько контуров на разных Z. Режется террасами: каждый контур снимается концентрическими кольцами (contour-parallel) от глубины предыдущего до своей.
| ключ | подпись в интерфейсе | тип | ед. | умолчание | границы / варианты |
|---|---|---|---|---|---|
| contours | Контуры [{polygon,z_depth}, ...] | string | — | [{"polygon":[[10,10],[90,10],[90,70],[10,70]],"z_depth":2},{"polygon":[[30,25],[70,25],[70,55],[30,55]],"z_depth":6}] | — |
| step_over | Step-over (% от Ø) | number | % | 50 | 10 … 85 |
| step_down | Step-down | number | мм | 1 | 0.1 … 5 |
| tool_diameter | Ø инструмента | number | мм | 6 | 1 … 20 |
| rpm | Обороты | integer | об/мин | 12000 | — |
| feed | Подача | number | мм/мин | 600 | — |
python_pocket_wall_finish — Чистовая стенка (waterline) · глагол wallfinishФиниш наклонной стенки кармана-воронки сферической фрезой. Z-level (waterline): контурный проход стенки на каждом уровне с постоянным ΔZ, подобранным под заданный гребешок (scallop). Только ballnose, требует уклона стенки (taper).
| ключ | подпись в интерфейсе | тип | ед. | умолчание | границы / варианты |
|---|---|---|---|---|---|
| outer | Внешняя граница [[x,y],…] | string | — | [[10,10],[90,10],[90,70],[10,70]] | — |
| islands | Острова (опц.) [[[x,y],…],…] | string | — | — | — |
| taper_deg | Уклон стенки (draft) | number | ° | 30 | 0.5 … 80 |
| scallop_height | Гребешок (scallop) | number | мм | 0.02 | 0.005 … 0.2 |
| step_down | Верхний кап ΔZ | number | мм | 1 | 0.05 … 5 |
| tool_diameter | Ø инструмента | number | мм | 6 | 0.5 … 20 |
| rpm | Обороты | integer | об/мин | 14000 | — |
| feed | Подача | number | мм/мин | 500 | — |
python_drill — Сверловка списком точек · глагол drillPeck-drilling по списку точек: для каждой (x,y) выполняется пошаговое заглубление с подъёмом на чистку стружки.
| ключ | подпись в интерфейсе | тип | ед. | умолчание | границы / варианты |
|---|---|---|---|---|---|
| points | Точки [[x,y], …] | string | — | [[10,10],[90,10],[10,50],[90,50]] | — |
| depth_mm | Глубина | number | мм | 5 | 0.5 … 50 |
| peck_mm | Шаг peck | number | мм | 1.5 | 0.1 … 10 |
| rpm | Обороты | integer | об/мин | 8000 | 1000 … 24000 |
| feed | Подача | number | мм/мин | 200 | 10 … 2000 |
python_thread_mill — Резьбофрезерование · глагол threadВнутренняя резьба резьбовой фрезой по винтовой интерполяции: фреза орбитирует по окружности (G2/G3), опускаясь на один шаг резьбы за оборот, на всю глубину. В конце — фаска на входе. Отверстие под minor bore сверлится/растачивается отдельным шагом.
| ключ | подпись в интерфейсе | тип | ед. | умолчание | границы / варианты |
|---|---|---|---|---|---|
| cx | Центр X | number | мм | 50 | 0 … 1000 |
| cy | Центр Y | number | мм | 30 | 0 … 1000 |
| nominal_diameter_mm | Номинальный Ø резьбы | number | мм | 10 | 2 … 100 |
| pitch_mm | Шаг резьбы | number | мм | 1.5 | 0.2 … 6 |
| depth_mm | Глубина резьбы | number | мм | 12 | 0.5 … 80 |
| tool_diameter | Ø резьбовой фрезы | number | мм | 6 | 0.5 … 50 |
| chamfer_mm | Фаска на входе | number | мм | 0.5 | 0 … 5 |
| direction | Направление | select | — | climb | climb · conventional |
| strategy | Стратегия | select | — | helical | helical · rotary |
| rotary_axis | Ось поворотного стола | select | — | A | A · B · C |
| table_rpm | Обороты стола | number | об/мин | 20 | 0.5 … 200 |
| passes | Проходов по глубине профиля | integer | — | 4 | 1 … 20 |
| rpm | Обороты | integer | об/мин | 8000 | 1000 … 24000 |
| feed | Подача | number | мм/мин | 300 | 10 … 3000 |
python_contour — Контур по полигону · глагол contourОбход замкнутого полигона с учётом радиуса инструмента: смещение наружу (outside), внутрь (inside) или по центру (center).
| ключ | подпись в интерфейсе | тип | ед. | умолчание | границы / варианты |
|---|---|---|---|---|---|
| polygon | Точки полигона [[x,y],…] | string | — | [[10,10],[90,10],[90,50],[10,50]] | — |
| offset | Смещение | select | — | center | inside · outside · center |
| depth_mm | Глубина | number | мм | 3 | 0.1 … 30 |
| step_down | Step-down | number | мм | 1 | 0.1 … 5 |
| tool_diameter | Ø инструмента | number | мм | 3 | 0.5 … 20 |
| feed | Подача | number | мм/мин | 400 | — |
| rpm | Обороты | integer | об/мин | 14000 | — |
python_chamfer — Фаска по рёбрам · глагол chamferСкос рёбер контура V-bit фрезой. Пользователь выбирает какие рёбра обработать; по умолчанию все. Глубина задаётся напрямую, ширина фаски вычисляется по углу V-bit.
| ключ | подпись в интерфейсе | тип | ед. | умолчание | границы / варианты |
|---|---|---|---|---|---|
| polygon | Точки контура [[x,y],…] | string | — | [[10,10],[90,10],[90,70],[10,70]] | — |
| edges | Индексы рёбер (пусто = все) | string | — | — | — |
| depth_mm | Глубина фаски | number | мм | 0.5 | 0.05 … 5 |
| vbit_angle | Угол V-bit | number | ° | 60 | 10 … 120 |
| tool_diameter | Ø инструмента | number | мм | 6 | 1 … 20 |
| rpm | Обороты | integer | об/мин | 16000 | 1000 … 30000 |
| feed | Подача | number | мм/мин | 300 | 10 … 2000 |
python_edge_round — Скругление кромки · глагол filletРадиусное скругление верхней кромки контура шаровой фрезой — четверть тора радиусом R вместо острого угла 90°. 'outer' — наружная кромка детали, 'inner' — рант кармана (знак смещения разный). Проходы по углу θ подобраны под заданный гребешок. Только ballnose.
| ключ | подпись в интерфейсе | тип | ед. | умолчание | границы / варианты |
|---|---|---|---|---|---|
| polygon | Контур [[x,y],…] | string | — | [[10,10],[90,10],[90,70],[10,70]] | — |
| side | Сторона | select | — | outer | outer · inner |
| radius_mm | Радиус скругления R | number | мм | 3 | 0.2 … 20 |
| tool_diameter | Ø инструмента (шаровая) | number | мм | 6 | 0.5 … 20 |
| scallop_mm | Гребешок (scallop) | number | мм | 0.02 | 0.005 … 0.2 |
| rpm | Обороты | integer | об/мин | 14000 | 1000 … 30000 |
| feed | Подача | number | мм/мин | 400 | 10 … 3000 |
python_engrave — Гравировка V-битом · глагол engraveГравировка по последовательности точек V-битом на фиксированную глубину. Для простых надписей, маркировки, контурных рисунков.
| ключ | подпись в интерфейсе | тип | ед. | умолчание | границы / варианты |
|---|---|---|---|---|---|
| path | Путь [[x,y],…] | string | — | [[20,30],[40,30],[40,50],[60,50],[60,30],[80,30]] | — |
| depth_mm | Глубина | number | мм | 0.5 | 0.05 … 5 |
| vbit_angle | Угол V-bit | number | ° | 60 | 10 … 120 |
| feed | Подача | number | мм/мин | 300 | 10 … 2000 |
| rpm | Обороты | integer | об/мин | 16000 | 1000 … 30000 |
python_turn_profile — Точение профиля · глагол turnТочение тела вращения: торцовка торца + черновые осевые проходы по уровням Ø + чистовой контур по профилю (цилиндры/конусы/ступени). Плоскость XZ, X = ДИАМЕТР (G7, «как в цеху» — Ø40 на чертеже и X40 в программе совпадают), шпиндель G97. Профиль (stages) приходит из токарного конструктора.
| ключ | подпись в интерфейсе | тип | ед. | умолчание | границы / варианты |
|---|---|---|---|---|---|
| stages | Профиль детали: ступени Ø от патрона | string | — | [{"length_mm": 30, "diameter_mm": 40}, {"length_mm": 15, "diameter_mm": 25}] | — |
| stock_diameter_mm | Ø прутка (заготовка) | number | мм | 50 | 2 … 400 |
| doc_mm | Глубина резания (радиальная, на сторону) | number | мм | 1 | 0.1 … 5 |
| finish_mm | Припуск на чистовую | number | мм | 0.3 | 0 … 2 |
| rpm | Обороты шпинделя | integer | об/мин | 1500 | 100 … 6000 |
| feed | Подача | number | мм/мин | 150 | 10 … 1000 |
| face | Торцевать торец | select | — | yes | yes · no |
| nose_radius_mm | Радиус при вершине резца | number | мм | 0 | 0 … 3 |
python_part_off — Отрезка · глагол partOffОтрезной резец режет пруток пе́ками с отходом (дробит стружку) в одной плоскости Z — до оси (сплошной пруток) или до уже готового отверстия (труба). Плоскость XZ, X = ДИАМЕТР (G7), шпиндель G97.
| ключ | подпись в интерфейсе | тип | ед. | умолчание | границы / варианты |
|---|---|---|---|---|---|
| z_mm | Z реза (от торца патрона) | number | мм | 40 | 0 … 2000 |
| stock_diameter_mm | Ø прутка в месте реза | number | мм | 50 | 2 … 400 |
| bore_diameter_mm | Ø уже готового отверстия (труба) | number | мм | 0 | 0 … 380 |
| tool_width_mm | Ширина отрезного резца | number | мм | 3 | 0.5 … 10 |
| doc_mm | Глубина пе́ка (радиальная, на сторону) | number | мм | 0.5 | 0.1 … 3 |
| rpm | Обороты шпинделя | integer | об/мин | 800 | 50 … 4000 |
| feed | Подача | number | мм/мин | 40 | 5 … 300 |
python_groove — Канавка · глагол grooveКанавочный резец вреза́ется пе́ками до дна на участке вдоль оси; резец у́же канавки — несколько плунжей внахлёст плюс проход по дну. Плоскость XZ, X = ДИАМЕТР (G7), шпиндель G97.
| ключ | подпись в интерфейсе | тип | ед. | умолчание | границы / варианты |
|---|---|---|---|---|---|
| z_mm | Начало канавки (от торца патрона) | number | мм | 20 | 0 … 2000 |
| width_mm | Ширина канавки вдоль оси | number | мм | 4 | 0.5 … 200 |
| diameter_mm | Ø дна канавки | number | мм | 35 | 0 … 400 |
| stock_diameter_mm | Ø заготовки в месте канавки | number | мм | 50 | 2 … 400 |
| tool_width_mm | Ширина канавочного резца | number | мм | 3 | 0.5 … 50 |
| doc_mm | Глубина пе́ка (радиальная, на сторону) | number | мм | 0.5 | 0.1 … 3 |
| rpm | Обороты шпинделя | integer | об/мин | 900 | 50 … 4000 |
| feed | Подача | number | мм/мин | 60 | 5 … 300 |
python_tool_change — Смена инструментаОтдельный блок программы: сменить инструмент. Тело берётся у ГОЛОВЫ станка — её процедура знает ритуал (подъём, продувка конуса, гнездо магазина или остановка под ручную смену) и получает параметрами, что на что меняем. Головы без своей процедуры дают канонический M6/G43 (+пауза для ручной смены).
| ключ | подпись в интерфейсе | тип | ед. | умолчание | границы / варианты |
|---|---|---|---|---|---|
| tool_number | Слот нового инструмента | integer | — | 1 | 1 … 99 |
| tool_name | Что ставим | string | — | — | — |
| tool_diameter | Ø нового инструмента | number | мм | 0 | 0 … 100 |
| tool_type | Тип инструмента | string | — | — | — |
| prev_tool_number | Слот снимаемого | integer | — | 0 | 0 … 99 |
face — торцовкаЗачем. Пилёная или литая болванка никогда не плоская настолько, чтобы доверять её верху как нулю детали. Торцовка — почти всегда шаг номер один: она делает Z0 настоящим. Пример: плита 200×100, ским 0.3 мм перед сверловкой.
| параметр | смысл | ед. | умолчание |
|---|---|---|---|
| depth | сколько снять с верха | мм | 1.5 |
| stepOver | перекрытие проходов от Ø фрезы | % | 70 |
| step_down | врезание за проход | мм | 0.6 |
| tool | слот станка (Ø, профиль и вылет — оттуда) | T<n> | Ø12 числом |
| rpm / feed | обороты / подача | об/мин · мм/мин | 12000 / 800 |
Ограничение. Торцует ВЕСЬ верх болванки — площадь берётся
из размера заготовки, а не задаётся прямоугольником. Торцевание участка — это карман
нулевой глубины стенки, то есть pocket. Типичная ошибка: слишком большой
stepOver при малом числе зубьев — фреза грузится и оставляет гребёнку.
pocket — карман и зонаЗачем. Выбрать материал внутри границы: гнездо под подшипник, окно под плату, посадочное место. Три формы задания — прямоугольник, круг, произвольный полигон; полигон уходит на движок зоны, который умеет острова и уклон стенок.
| параметр | смысл | ед. | умолчание |
|---|---|---|---|
| rect | прямоугольный карман [x0,y0,x1,y1] | мм | — |
| cx, cy, diameter | круглый карман: центр и Ø | мм | — |
| polygon | зона произвольной формы [[x,y],…] | мм | — |
| islands | острова — материал, который НЕ срезается | мм | нет |
| taper | уклон стенок от вертикали (только зона) | ° | 0 (вертикально) |
| depth | глубина кармана | мм | 3–4 |
| stepDown / stepOver | врезание за проход / перекрытие | мм · % | 1 / 50 |
Ограничения. Фреза не выходит за внешнюю границу и не
заходит внутрь острова — границы непересекаемы, поэтому острова уже фрезы просто
останутся необработанными, без предупреждения о «слишком узко». Уклон стенок в 3D-превью
показан вертикальным: наклон живёт в траектории, а не в предпросмотре. Круглый карман
диаметром меньше двух диаметров фрезы вырождается в одно сверление — проверьте
diameter против Ø инструмента: круглый карман режется спиралью от центра
к стенке, и на диаметре, сравнимом с диаметром фрезы, спирали просто не остаётся.
terrain — террасный карманЗачем. Карман переменной глубины, заданный изолиниями: несколько вложенных контуров, каждый на своей глубине. Так описываются ступенчатые гнёзда, посадочные места с заплечиком, «горы и озёра» рельефа.
| параметр | смысл | ед. | умолчание |
|---|---|---|---|
| contours | список {polygon, z} — контур и ЕГО глубина | мм | — |
| stepOver / stepDown | перекрытие / врезание за проход | % · мм | 50 / 1 |
| smooth | лофт слоёв в плавный склон вместо ступеней | да/нет | нет |
| tolerance | допуск гребешка при smooth | мм | 0.1 |
Ограничение. Контуры обязаны быть вложены строго: каждый
более глубокий целиком внутри предыдущего. Это не придирка, а физика трёх осей —
поднутрение фрезой не режется, и генератор такой набор контуров отклонит.
smooth меняет ТОЛЬКО траекторию (сплайн вместо ступеней), геометрия модели
остаётся ступенчатой.
wallfinish — чистовая стенкаЗачем. После чернового кармана с уклоном стенка остаётся ступенчатой. Этот проход ведёт сферическую фрезу по контуру стенки на каждом Z-уровне, а вертикальный шаг подобран так, чтобы остаточный гребешок не превысил заданного.
| параметр | смысл | ед. | умолчание |
|---|---|---|---|
| polygon | внешний контур стенки | мм | — |
| taper | уклон стенки от вертикали, ОБЯЗАТЕЛЕН и > 0 | ° | 30 |
| scallop | целевой гребешок между уровнями | мм | 0.02 |
| islands | острова — их стенки финишируются тоже | мм | нет |
| stepDown | верхний предел вертикального шага | мм | 1 |
Ограничения. Только сферическая фреза и только наклонная
стенка: taper = 0 — операция откажет, вертикальную стенку этой стратегией
не финишируют. Проход идёт до смыкания воронки: у узкого дна он останавливается сам,
а не доходит до заданной глубины.
drill — сверловка списком точекЗачем. Все отверстия одного диаметра — одним шагом и одной сменой инструмента. Сверление идёт пе́ками: заглубление шагами с подъёмом на чистку стружки. Пример из витрины: сетка 3×2 отверстий Ø6.8 насквозь через плиту 50 мм.
| параметр | смысл | ед. | умолчание |
|---|---|---|---|
| points | список [[x,y],…] или одна точка x, y | мм | — |
| d | Ø отверстия — ЗАМЫСЕЛ; со сверлом из tool обязан совпасть | мм | 6 |
| depth / thru | глубина явно, либо thru: true насквозь | мм | 5 |
| peck_mm | шаг пе́ка (заглубление до подъёма) | мм | 1.5 |
| rpm / feed | обороты / подача | об/мин · мм/мин | 8000 / 200 |
Ограничения. Глубина ограничена рабочей длиной сверла:
Ø3 с рабочей частью 14.5 мм через 50 мм плиты не пройдёт — соответствие глубины вылету
и длине инструмента проверяет предполётная цепочка, а не генератор.
thru: true даёт ровно толщину болванки — запас на выход берётся
из through, объявленного в stock(), и только если объявлен
pad. Зенковка отверстий отдельной операции не имеет: chamfer
снимает фаску вдоль рёбер полигона, а не вокруг круглых отверстий.
thread — резьбофрезерованиеЗачем. Внутренняя резьба без метчика: фреза орбитирует по окружности, опускаясь на один шаг резьбы за оборот. Отверстие под резьбу сверлится ОТДЕЛЬНЫМ шагом — как на станке. Фаску входа резьбофреза снимает сама в конце прохода.
| параметр | смысл | ед. | умолчание |
|---|---|---|---|
| x, y | центр отверстия | мм | центр заготовки |
| d | номинальный Ø резьбы (M10 → 10) | мм | 10 |
| pitch | шаг резьбы | мм | 1.5 |
| depth | глубина резьбы | мм | вся толщина |
| chamfer | фаска на входе, снимается тем же проходом | мм | 0.5 |
| direction | climb | conventional | — | climb |
| strategy | helical (винтовая) | rotary (вращением стола) | — | helical |
| rotaryAxis / tableRpm / passes | только при rotary: ось стола A|B|C / обороты стола / проходов по глубине профиля | — · об/мин · шт | A / 20 / 4 |
Ограничения. Резьба только ВНУТРЕННЯЯ. Стратегия
rotary (деталь на поворотном столе, стол медленно вращается, инструмент
опускается по Z) требует у станка реальной оси A, B или C — на трёхосевом фрезере она
недоступна. Диаметр резьбофрезы должен пройти в отверстие под minor: проверку
соответствия фрезы запрошенной резьбе (форма зуба, шаг, глубина) платформа делает перед
отправкой и блокирует шаг, если фреза физически такую резьбу не даёт.
contour — обход полигона| параметр | смысл | ед. | умолчание |
|---|---|---|---|
| polygon | точки замкнутого контура | мм | — |
| offset | outside — вырезать деталь, inside — паз внутрь, center — по линии | — | outside |
| depth / stepDown | глубина / врезание за проход | мм | 3 / 1 |
Ограничение. Контур наружу — это ПОСЛЕДНИЙ шаг программы: после него деталь отделена от болванки и держится только тем, что вы под неё положили. Все отверстия и карманы делаются ДО отрезания контура, иначе деталь двинется под фрезой.
chamfer — фаска V-битом| параметр | смысл | ед. | умолчание |
|---|---|---|---|
| polygon | контур фаски; не задан — внешняя кромка болванки | мм | кромка болванки |
| size | катет фаски (глубина захода) | мм | 0.5 |
| vbit | полный угол V-бита | ° | 60 |
| edge | top | bottom | — | top |
| edges | индексы рёбер; пусто — все рёбра | — | все |
Что важно знать честно. Ширина фаски не задаётся — она
следует из глубины и угла бита, как на станке. Параметр side
(outer/inner) в этой операции только ПОДПИСЫВАЕТ смысл: V-бит
ведётся по линиям контура без смещения на радиус фрезы, поэтому на G-code и превью
side не влияет. Зенковка круглых отверстий этой операцией не выражается.
fillet — скругление кромки| параметр | смысл | ед. | умолчание |
|---|---|---|---|
| radius | радиус скругления R | мм | 3 |
| side | outer — кромка детали, inner — рант кармана | — | outer |
| scallop | целевой гребешок между проходами по углу | мм | 0.02 |
| tool | слот сферической фрезы | T<n> | Ø6 |
Отличие от фаски. В скруглении side МЕНЯЕТ
G-code: генератор считает смещение фрезы по стороне, и знак у наружной кромки и у ранта
кармана разный. Операция требует именно сферической фрезы; поддержана только верхняя
кромка (edge: 'top'). Число проходов не задаётся — оно выводится из
scallop.
engrave — гравировка| параметр | смысл | ед. | умолчание |
|---|---|---|---|
| path | точки ломаной, минимум две | мм | — |
| depth | глубина канавки | мм | 0.5 |
| vbit | полный угол V-бита | ° | 60 |
Ограничение. Ширину канавки задать нельзя: у конуса она следует из глубины — глубже значит шире. Это ломаная, а не шрифт: текст надо подать точками пути, векторизации надписи в платформе нет.
Заготовка объявляется прутком: bar({ diameter, length }).
Ноль — торец патрона, +Z к свободному концу, length — вылет из патрона.
Программа пишется в плоскости XZ с X в диаметрах.
turn — точение профиля| параметр | смысл | ед. | умолчание |
|---|---|---|---|
| stages | ступени ОТ ПАТРОНА наружу: length, diameter, diameterEnd (отличается ⇒ конус) | мм | — |
| doc | глубина резания НА СТОРОНУ; Ø за проход уменьшается на 2×doc | мм | 1.0 |
| finish | припуск под чистовую | мм | 0.3 |
| face | торцевать свободный конец | да/нет | да |
| noseRadius | радиус при вершине резца; 0 — резец считается точечным | мм | 0 |
Компенсация вершины резца — ЧАСТИЧНАЯ, и это важно знать до
реза. При noseRadius > 0 поправка вносится по X (для чистого
цилиндра точно, для конуса — приближение, ошибка растёт с углом уклона). По Z поправки
НЕТ: настоящая компенсация требует знать ориентацию вершины резца, а карточка каталога
её сегодня не хранит. Практическое следствие: на уступах останется угол, скруглённый
радиусом вершины — это физика круглой вершины, а не дефект. noseRadius = 0
выключает компенсацию целиком.
| операция | параметры | ед. | чем ограничена |
|---|---|---|---|
| partOff | z — Z реза от торца патрона; boreDiameter — Ø готового отверстия (труба), 0 = сплошной пруток до оси; toolWidth; doc — пе́к на сторону | мм | Ширина резца на траекторию НЕ влияет (режет одной плоскостью) — припуск на пропил закладывайте в длину прутка сами |
| groove | z — начало канавки; width — ширина вдоль оси; diameter — Ø дна; toolWidth; doc | мм | Ø дна обязан быть МЕНЬШЕ Ø заготовки в этом месте; резец у́же канавки — несколько плунжей внахлёст плюс проход по дну |
index — развернуть стол и писать дальше по новой граниОбработка 3+2: поворотный стол встаёт в позу и СТОИТ, дальше координаты отсчитываются
по той грани, что смотрит вверх. Поза абсолютная и модальная — index({ b, c })
с прямыми углами (0 / ±90 / 180). Своего шага операция не даёт: поза уезжает в шапку
следующих режущих шагов, а кадр разворота станок делает сам — отведёт фрезу, повернёт
стол и встанет на паузу между гранями.
Пятикоординатная непрерывная обработка сложных поверхностей — не наша
область и в платформе её нет. index — это позиционирование, а не
одновременное движение пяти осей.
Витринная программа платформы: глухая резьба M8×1.25 в центре плиты 200×100×50 из алюминия. Два инструмента — значит два шага и две смены.
Программа:
// Плита 200×100×50 из алюминия. Резьба M8 ГЛУХАЯ, в центре плиты.
stock(200, 100, 50, 'aluminum');
// Отверстие под резьбу M8×1.25: minor Ø6.8 (слот стола T4), глухое на 14 мм.
drill({ x: 100, y: 50, tool: T4, depth: 14, rpm: 11700, feed: 702 });
// Резьбофреза M8×1.25 Ø6 (слот T8) — винтовая интерполяция, глубина резьбы
// 12 мм = 1.5×D. Фаска входа встроена в сам проход резьбофрезы.
thread({
x: 100, y: 50, d: 8, pitch: 1.25, depth: 12, tool: T8, chamfer: 0.5,
rpm: 13250, feed: 795,
}); Отверстие сверлится на 14 мм — на 2 мм глубже резьбы: чтобы было куда падать стружке и
где закончить проход, не упираясь в дно. Глубина резьбы 12 мм = 1.5×D — норма полного
зацепления в алюминии. Фаска входа отдельным шагом не идёт: её снимает сама резьбофреза
параметром chamfer.
Первый шаг в G-code (эталонный вывод платформы, начало файла):
( Generator: python_drill ) ( Coords: PART frame - zero at the near-left corner of the stock, top face is the zero of Z, down is negative. Where the part sits on the table lives in G54, not here. ) ( 1 holes, depth 14.0mm, peck 1.5mm ) G21 G90 G17 G94 G54 M6 T4 G43 H4 G0 Z5.000 M3 S11700 ( hole 1/1 ) G0 Z5.000 G0 X100.000 Y50.000 G1 Z-1.500 F702 G0 Z1.000 G1 Z-3.000 F702 ...
Читается по строкам: комментарий называет систему координат прямым текстом
(ноль у ближнего левого угла болванки, верх — ноль Z); G54 берёт
рабочее смещение станка; M6 T4 ставит слот 4, G43 H4 применяет
его вылет из таблицы станка; M3 S11700 пускает шпиндель; дальше пе́ки по
1.5 мм с подъёмом на Z1.
Как проверить результат. Три уровня, по возрастанию цены ошибки: 3D-симуляция съёма в лаборатории (видно форму и остаточный материал) → предполётная цепочка проверок (ось, зона, шпиндель, фреза, материал, заготовка, программа — каждая с запасом в миллиметрах или об/мин, а не «да/нет») → прогон в режиме симуляции на станке, где стойка исполняет тот же файл без движения приводов.
Наша область — параметрическая 2.5D-обработка с полной вертикалью от браузера до сервопривода, а не соревнование с тяжёлым CAM по мощности стратегий.