Industry 4.0 · цифровые двойники станков и промышленной автоматики · отечественная R&D-разработка +7 925 353-56-35 info@synctwin.ru
Документация / Операции реза

Операции реза

Программа реза описывает ДЕТАЛЬ: что снять с болванки и чем. 15 операций ниже — весь словарь: каждая вычитает объём из заготовки и печатает свой кусок G-code. Страница разбирает сквозные правила (они не очевидны и стоили нам дорого), затем каждую операцию — параметры, единицы, ограничения.

Правило 1 · координаты

Программа описывает деталь, а не место на столе

Ноль программы — ближний левый угол болванки. Z = 0 — её верхняя грань, вглубь материала отрицательно. Ни один генератор не прибавляет к координатам ничего: где болванка физически лежит на столе, знает рабочее смещение станка (G54) и цифровой двойник, а не текст программы.

Следствие, ради которого правило и заведено: программа переносима. Та же деталь даёт тот же текст, где бы заготовка ни стояла и на каком бы из ваших станков ни резалась. Смещение применяет стойка — один раз, в G54.

Цена нарушения известна: пока генератор впечатывал место болванки в координаты, стойка складывала смещение второй раз, и программы уходили за предел хода на первой же строке реза. Инвариант теперь держит тест: сдвиг начала заготовки не меняет G-code ни на байт.

Правило 2 · заготовка

Заготовка — вход, обработка — только вычитание

Первый вызов любой программы объявляет болванку: 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 (лежит на столе)
Правило 3 · инструмент

Инструмент — ссылка на слот, а не диаметр

В программе пишется tool: T4, а не tool: 6.8. Число отвечает ровно на один вопрос — «какой диаметр», — а дальше по цепочке спрашивают ещё четыре, и из числа их не достать:

  • профиль кончика (плоский, сфера, конус V) — им режет симуляция, от него зависят гребешок и форма дна;
  • вылет из патрона — его сверяет toolcheck() перед пуском, и он же ограничивает глубину прохода;
  • зубья и материал фрезы — по ним считаются обороты и подача;
  • номер слота — M6 T<n> и G43 H<n> в шапке шага обязаны быть РЕАЛЬНЫМ слотом таблицы инструмента станка.

Ссылка на слот отвечает на все пять сразу и не заводит второй правды: таблица инструмента станка — часть двойника. Слот, которого в таблице нет, объявляется пустым и падает при использовании — со списком того, что в таблице есть.

Молчаливой подстановки нет. Раньше операция без названного инструмента тихо резалась «фрезой Ø6» — это была угроза безопасности: программа выглядела рабочей и уходила на станок с чужим диаметром. Сегодня не назвали tool — работает явный путь «просто диаметр», с пометкой, что профиль и вылет неизвестны. Никто ничего не подставляет за вас.

Правило 4 · шаги

Один шаг — один инструмент

Одинаковые операции одной фрезой — это ОДИН шаг и одна смена инструмента: четыре отверстия Ø3 не превращаются в четыре шага. Разные инструменты — разные шаги. Шапка каждого шага печатает M6 T<n> и G43 H<n>, поэтому порядок шагов и есть порядок смен на станке.

Номера слотов раздаёт тот, кто вызывает генератор, по правилу первого появления, и они обязаны совпадать с таблицей инструмента станка. Программа с двумя фрезами даёт две шапки — по одной на каждый вызов.

Каталог

Каталог: 15 операций реза

«Глагол» — то, что пишет автор программы. «Движок» — идентификатор генератора, который возвращает GET /api/generators вместе со схемой его параметров: по нему интегратор строит вызовы, минуя интерфейс. Таблицы параметров в разборах ниже описывают ГЛАГОЛ — то, что пишет автор в лаборатории. Схему самого движка (ключи API, границы, умолчания) смотрите в порождённом разделе сразу за этой таблицей: умолчания у глагола и у движка могут отличаться, и это нормально — глагол подставляет своё, прежде чем позвать движок.

глаголдвижокоперациячто делаетпарам.
face python_face Торцовка Снять ровный слой со всего верха заготовки, zig-zag. 7
pocket python_pocket Карман прямоугольный / круглый Прямоугольник — zigzag, круг — спираль из центра. 11
pocket 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. На фрезере они недоступны.

Схема API

Параметры движков — как их отдаёт GET /api/generators

Таблицы ниже ПОРОЖДЕНЫ из реестра генераторов платформы (backend/src/aicnc/services/generators_registry.py :: list_generators()) и пересобираются скриптом, а не переписываются руками: разойтись с кодом они не могут. Здесь — инженерный слой: ключи, типы, единицы, умолчания и границы, которые движок принимает по API. Это НЕ то же самое, что параметры глагола в лаборатории: автор программы пишет depth, движок принимает depth_mm. Разборы каждой операции ниже по странице говорят о глаголе; здесь — о движке под ним.

Пустая клетка значит «в источнике не объявлено» — правдоподобное значение сюда не подставляется.

python_face — Торцовка · глагол face

Zig-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 — Сверловка списком точек · глагол drill

Peck-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
Группа 1 · снятие объёма

Торцовка, карманы, зоны

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 — операция откажет, вертикальную стенку этой стратегией не финишируют. Проход идёт до смыкания воронки: у узкого дна он останавливается сам, а не доходит до заданной глубины.

Группа 2 · отверстия и резьба

Сверловка и резьбофрезерование

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
directionclimb | conventionalclimb
strategyhelical (винтовая) | rotary (вращением стола)helical
rotaryAxis / tableRpm / passesтолько при rotary: ось стола A|B|C / обороты стола / проходов по глубине профиля— · об/мин · штA / 20 / 4

Ограничения. Резьба только ВНУТРЕННЯЯ. Стратегия rotary (деталь на поворотном столе, стол медленно вращается, инструмент опускается по Z) требует у станка реальной оси A, B или C — на трёхосевом фрезере она недоступна. Диаметр резьбофрезы должен пройти в отверстие под minor: проверку соответствия фрезы запрошенной резьбе (форма зуба, шаг, глубина) платформа делает перед отправкой и блокирует шаг, если фреза физически такую резьбу не даёт.

Группа 3 · контур и кромка

Контур, фаска, скругление, гравировка

contour — обход полигона

параметрсмыслед.умолчание
polygonточки замкнутого контурамм
offsetoutside — вырезать деталь, inside — паз внутрь, center — по линииoutside
depth / stepDownглубина / врезание за проходмм3 / 1

Ограничение. Контур наружу — это ПОСЛЕДНИЙ шаг программы: после него деталь отделена от болванки и держится только тем, что вы под неё положили. Все отверстия и карманы делаются ДО отрезания контура, иначе деталь двинется под фрезой.

chamfer — фаска V-битом

параметрсмыслед.умолчание
polygonконтур фаски; не задан — внешняя кромка болванкиммкромка болванки
sizeкатет фаски (глубина захода)мм0.5
vbitполный угол V-бита°60
edgetop | bottomtop
edgesиндексы рёбер; пусто — все рёбравсе

Что важно знать честно. Ширина фаски не задаётся — она следует из глубины и угла бита, как на станке. Параметр side (outer/inner) в этой операции только ПОДПИСЫВАЕТ смысл: V-бит ведётся по линиям контура без смещения на радиус фрезы, поэтому на G-code и превью side не влияет. Зенковка круглых отверстий этой операцией не выражается.

fillet — скругление кромки

параметрсмыслед.умолчание
radiusрадиус скругления Rмм3
sideouter — кромка детали, inner — рант карманаouter
scallopцелевой гребешок между проходами по углумм0.02
toolслот сферической фрезыT<n>Ø6

Отличие от фаски. В скруглении side МЕНЯЕТ G-code: генератор считает смещение фрезы по стороне, и знак у наружной кромки и у ранта кармана разный. Операция требует именно сферической фрезы; поддержана только верхняя кромка (edge: 'top'). Число проходов не задаётся — оно выводится из scallop.

engrave — гравировка

параметрсмыслед.умолчание
pathточки ломаной, минимум двемм
depthглубина канавкимм0.5
vbitполный угол V-бита°60

Ограничение. Ширину канавки задать нельзя: у конуса она следует из глубины — глубже значит шире. Это ломаная, а не шрифт: текст надо подать точками пути, векторизации надписи в платформе нет.

Группа 4 · токарные

Точение, отрезка, канавка

Заготовка объявляется прутком: 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 — это позиционирование, а не одновременное движение пяти осей.

Сквозной пример

От параметров до G-code

Витринная программа платформы: глухая резьба 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-симуляция съёма в лаборатории (видно форму и остаточный материал) → предполётная цепочка проверок (ось, зона, шпиндель, фреза, материал, заготовка, программа — каждая с запасом в миллиметрах или об/мин, а не «да/нет») → прогон в режиме симуляции на станке, где стойка исполняет тот же файл без движения приводов.

Границы

Чего платформа не делает — сознательно

  • 3D-обработка произвольных поверхностей. Траектории по STL-модели свободной формы платформа не строит. Ближайшее, что есть, — террасный карман по изолиниям и waterline-финиш наклонной стенки.
  • Непрерывная пятикоординатная обработка. Есть 3+2: развернули, зафиксировали, режем тремя осями.
  • Автоподбор инструмента. Фрезу называет человек — см. справочник инструмента.
  • Управление СОЖ из программы. Каналы охлаждения (заливка, туман, смазка) заводятся как роли обвеса станка и управляются с панели у станка; кодов включения СОЖ генераторы в программу не пишут.
  • Оптимизация порядка обхода. Точки сверловки режутся в том порядке, в котором вы их перечислили: «строка за строкой» — модель оператора, и перестановкой ради экономии холостых ходов платформа её не ломает.

Наша область — параметрическая 2.5D-обработка с полной вертикалью от браузера до сервопривода, а не соревнование с тяжёлым CAM по мощности стратегий.

Дальше: инструмент, фрезы, навесное и материалы.