Программа для фрезера Roland MODELA MDX-40A — одна вместо связки SRP Player + VPanel + сторонних утилит для плат: платы из Gerber и Excellon, 3D-модели из STL и управление станком. Интерфейс на русском. SRP Player, VPanel и драйвер Roland для работы не нужны (см. «Как программа говорит со станком»).
A Windows app for the Roland MDX-40A desktop mill: PCB isolation milling from Gerber/Excellon (single- and double-sided, with alignment pins), 3D milling from STL (including two-sided jobs with supports and an illustrated flip guide), stock preparation and machine control over USB — one program instead of SRP Player + VPanel. The interface is in Russian.
Warning
На настоящем станке проверено только чтение по USB: координаты головки, ноль и прошивка. Движения — джог, ноль, шпиндель, задания, пауза, поворотная ось и переворот на вторую сторону — проверены тестами и в симуляторе. Первое задание прогоните в воздухе — без заготовки или с нулём Z на 10–20 мм выше неё. Подробнее — в разделе «Что проверено, а что нет».
- Скачайте
MillStudio-0.2.0-windows.zipсо страницы Releases. - Распакуйте архив целиком и запустите
MillStudio\MillStudio.exe. Java уже внутри, устанавливать ничего не нужно. Нужна 64-битная Windows 10 или 11. - Если Windows покажет «Windows защитил ваш компьютер», нажмите «Подробнее» → «Выполнить в любом случае»: у программы нет цифровой подписи.
Если на компьютере стоит SRP Player, при первом запуске программа возьмёт из него фрезы, режимы резания и My Tools. Без него — встроенные фрезы ZHS-100/200/400/600, отмеченные ★ «есть у меня»; свои инструменты добавьте и отметьте в разделе «Инструменты».
Станок подключается по USB. На экране «Станок» выберите режим «Станок»: если стоит драйвер Roland, связь пойдёт через принтер «Roland MDX-40A», если нет — напрямую по USB. Без станка всё можно проверить в режиме «Симулятор».
- Плата — Gerber (RS-274X, X1/X2) и Excellon из KiCad, EasyEDA, Eagle, Altium → изоляция дорожек, сверловка, вырезание контура с перемычками. Двусторонний текстолит: верх и сверловка, переворот по штифтам совмещения, низ и контур.
- 3D-модель — STL → ориентация, масштаб, заготовка, черновая послойная и чистовая растровая обработка, обработка с двух сторон с поддержками (как «Cut both sides» в SRP Player) и схемой переворота со стрелками — перевернули не так, как задумано, вторая сторона разворачивается сама, сдвиг модели внутри заготовки (полями или мышью), подготовка неровной заготовки — выравнивание верха и боков и отверстия под болты подложки, симуляция результата.
- Станок — координаты головки прямо со станка, как в VPanel, кнопка VIEW, джог, ноль Z/XY, ноль XY по заготовке (станок сам встаёт над углом заготовки по её месту на столе), шпиндель, очередь заданий с пошаговой сменой инструмента, пауза во время резки как у 3D-принтера, живой 3D-вид «на столе», симулятор станка, отправка готовых RML-файлов.
- Стол как в слайсере — заготовка с моделью лежит на столе 305×305 (сетка, рабочая зона, высота хода). Её можно перетащить мышью. Есть проверка хода станка и досягаемости фрезы при заданном вылете. Столы: обычный, фанерная подложка (по чертежу автора, с креплением заготовки болтами М3) и поворотная ось (4-я ось). С поворотной осью обычный стол снят, показывается только ось вращения.
- Инструменты — библиотека фрез, свёрл и материалов с режимами резания; при первом запуске подхватываются данные Roland из установленного SRP Player. Пока он установлен, программа держит копию его баз в
%APPDATA%\MillStudio\roland-srp, поэтому импорт работает и после удаления SRP Player. Без него и без копии — встроенные фрезы ZHS и рекомендуемые режимы. - Подбор инструментов «Авто» — как My Tools в SRP Player: фрезы и свёрла подбираются только из отмеченных «есть у меня» (★), с пояснением, почему выбран этот инструмент, и подсказкой, если подходящего среди ваших нет (см. «Подбор инструментов»).
Нужна JDK 21 или новее в JAVA_HOME (например, Temurin или JBR из IntelliJ IDEA).
gradlew run — запустить
gradlew test — тесты (платы, 3D, импорт Roland, снимки интерфейса в build\test-out)
gradlew createDistributable — папка с MillStudio.exe (Java внутри): build\compose\binaries\main\app\MillStudio
gradlew releaseZip — архив для Releases: только программа (build\release)
gradlew portableZip — архив для своего второго компьютера: программа и свои настройки (build\dist)
gradlew portableParts — тот же архив частями по 29 МиБ и сценарий сборки (build\dist\parts)
gradlew packageMsi — установщик MSI (нужен WiX Toolset)
Часть тестов берёт Piano.stl и базы установленного SRP Player; без него эти проверки пропускаются.
Настройки и библиотека хранятся в %APPDATA%\MillStudio\ (settings.json, library.json); файлы RML из режима «Только файлы» — в Документы\MillStudio.
На свой второй компьютер. gradlew portableZip собирает build\dist\MillStudio-<версия>-windows.zip. В архиве папка с MillStudio.exe, инструкция packaging\app\Как запустить.txt и data: настройки, библиотека и копия баз SRP Player из %APPDATA%\MillStudio (путь последней папки убирается). Установка не нужна: распаковать и запустить. При первом запуске программа копирует data к себе (AppDirs.importCarried), если своих настроек на том компьютере ещё нет. В архиве для Releases (releaseZip) папки data нет.
Два пути, оба без SRP Player и VPanel:
- Принтер Windows «Roland MDX-40A», если стоит драйвер Roland: RAW-задание через winspool (JNA), так же, как отправляет SRP Player.
- «USB напрямую (без драйвера)» (
machine/UsbPrint.kt). MDX-40A — USB-устройство класса «принтер» (VID 0B75, PID 03DB). Windows сама ставит для него стандартный драйвер «USB Printing Support» (usbprint.sys), программы Roland для этого не нужны. Программа находит устройство через SetupAPI (интерфейсGUID_DEVINTERFACE_USBPRINT) и пишет байты прямо в него (CreateFile + асинхронный WriteFile). У драйвера Roland нет языкового монитора, поэтому станок получает те же байты, что и через очередь печати. Так же, напрямую по USB, со станком работает и сам VPanel. Если принтера станка нет, а станок виден по USB, программа сама переключается на этот путь.
Формат RML-1 повторяет вывод SRP Player:
^IN; ^PA; !RC<об/мин>; !MC1; !VZ<мм/с>; Z x,y,z; … !MC0;, координаты в шагах 0.01 мм.
Особенности:
- координаты головки станок сообщает сам — по служебному каналу (см. ниже). Если канал недоступен, программа считает их сама: XY известны после «Домой» (
H— переезд в ноль XY, записанный в станке), Z — после «Ноль Z здесь» (^PR;!ZO0;— ставит ноль Z в станке на текущей высоте); - ноль XY — программный: он прибавляется ко всем заданиям MillStudio и к готовым RML-файлам (
rml/RmlShift.ktсдвигает их абсолютные координаты X/Y). Его можно поставить джогом или по заготовке (см. «Ноль по заготовке»). Кнопка «Ноль XY самого станка» убирает сдвиг; - станок крутит шпиндель при любом перемещении, пока ему не сказано
!MC0. Поэтому джог, «К нулю», «Поднять» и «Домой» идут с!MC0, если шпиндель не включён кнопкой (на станке шпиндель крутился при «К нулю»); - поворотную ось A можно повернуть вручную (0/90/180/270°) — как в VPanel: шпиндель стоп, фреза вверх,
!ZEA<градусы>; - «Стоп» удаляет задания из очереди Windows, но то, что уже в буфере станка, он доработает. Для мгновенной остановки откройте крышку.
VPanel узнаёт положение головки не командами RML, а управляющими USB-запросами производителя — через тот же стандартный драйвер usbprint.sys (IOCTL_USBPRINT_VENDOR_GET_COMMAND / _SET_COMMAND, bRequest = 1, номер запроса в wValue). Протокол восстановлен по VP_MDX40A.exe (VPanel 1.10) и проверен чтением на MDX-40A с прошивкой V170;B210 (machine/MdxPanel.kt):
- GET
0x100— 32 байта: состояние, X, Y, Z, A головки в координатах станка (int32, старший байт первым, 0.001 мм и 0.001°), обороты шпинделя. Координаты станка: X 0…305 слева направо, Y 0…305 — фреза над столом спереди назад, Z от −105 (низ) до 0 (верх). Чаще ~10 мс станок данные не обновляет и отдаёт одно состояние; - GET
1— состояние: шпиндель вращается, открыта крышка, станок разбирает команду, идёт перемещение, длина ответа на запрос; - запросы (SET без данных → ждать ответ → GET
3):0x30B— ноль RML-1 в координатах станка (точка «Домой» и ноль Z),0x101— прошивка,0x302— пределы хода; - команда
0x500 FFFF— переезд в позицию VIEW (VPanel обрамляет её командами0x3F52/FF и0x11090/FF, станок ждём по биту «перемещение»).
Программа опрашивает станок 4 раза в секунду, в том числе во время задания: RML идёт своим путём, канал ему не мешает. Координаты RML = координаты станка − ноль RML-1. Когда станок стоит, а команд программы в пути нет (3 с после последней, очередь печати доставляет их не сразу), положение программы сверяется со станком. Так она узнаёт о перемещениях без неё: кнопки станка, VPanel, перезапуск станка (при включении он сам уезжает в VIEW). Пропала связь — положение и ноль Z снова неизвестны. После «Ноль Z здесь» ноль перечитывается из станка.
VIEW — кнопка в карточке «Положение»: фреза вверх, стол вперёд. Как и VPanel, при вращающемся шпинделе и открытой крышке станок не едет: шпиндель программа сначала останавливает, про крышку — пишет. В симуляторе VIEW — переезд в верхней точке к середине заднего края стола.
По этому же каналу VPanel делает коррекцию подачи и оборотов на ходу, очистку буфера станка при «Стоп», датчик нуля Z и поиск оснастки поворотной оси — это ещё не повторено.
Принтер «Roland MDX-40A» настроен на «печать после полной буферизации», поэтому одно большое задание нельзя притормозить. Пауза сделана так, как работают хосты 3D-принтеров (OctoPrint и т. п.):
- Программа разбита на блоки с оценкой времени (
rml/RmlStream.kt). Станку уходят небольшие порции, каждая — отдельное RAW-задание в очереди Windows, с запасом не больше «передавать наперёд» (по умолчанию 8 с работы). - Пауза. Подача останавливается в конце текущего прохода, когда фреза уже поднята. Если такого места нет в ближайшие 30 с, подача останавливается сразу. Станок дорабатывает переданное и выполняет вставку: подъём на безопасную высоту плюс 10 мм, отвод к нулю XY (по желанию), остановка шпинделя.
- Продолжить. Шпиндель включается, фреза едет над точкой остановки, быстро опускается до 1 мм над ней, врезается со скоростью врезания и восстанавливает прежнюю скорость. Пока задание идёт или стоит на паузе, ручное управление заблокировано.
- Стоп работает так же: станок дорабатывает переданное, поднимает фрезу и выключает шпиндель. Задания в очереди Windows не удаляются, чтобы не оборвать команду на середине. Мгновенно останавливает только крышка станка.
- Время. Станок не сообщает, где он находится, поэтому прогресс, «осталось» и момент паузы считаются по модели разгона и торможения (
toolpath/Motion.kt). Если станок быстрее модели, он может на долю секунды подождать данных. - Проверка. Тестами проверено, что с паузой посередине и продолжением съём материала тот же, что без паузы (
PauseTest,MachinePauseTest). - По USB напрямую порции пишет отдельный поток, впереди тоже не больше одной порции. Если станок не принимает данные 20 с, программа предупреждает.
machine/Table.kt— модель стола, проверка хода станка и досягаемости фрезы. Данные MDX-40A: стол 305×305, ход 305×305×105, от торца шпинделя до стола до 123 мм, вылет фрезы задаётся.ui/TableScene.kt— 3D-сцена.- Поворотная ось ZCL-40A. Ставится вместо обычного стола. В сцене рисуются только ось вращения (пунктир, засечки на торце патрона и в конце рабочей длины) и габарит хода, корпус оси не рисуется. Чертежей нет, размеры приблизительные (вместимость 270ר120 мм из брошюры) и настраиваются. Сторона 1 — при A = 0°, сторона 2 — при A = 180°. Выбор стола по умолчанию берётся из настройки SRP Player (
rotation_id). - Фанерная подложка (
PlywoodSpec,Plywoodвmachine/Table.kt) — по чертежу КОМПАСstol_frezera.frw. Лист 305×305 из двух слоёв фанеры по 3 мм лежит на столе. В нижнем слое 25 гнёзд под гайки М3 (под ключ 5.6 мм), в верхнем над ними отверстия Ø3.25. Сетка 5×5 с шагом 50 мм по центру листа. Ещё 10 отверстий Ø3.2 (X = центр ± 107.5, Y = центр, ±70, ±140) — крепление подложки к столу, в сцене это красные кольца. Все размеры можно поправить в программе.- Заготовка лежит на подложке (верх подложки — 6 мм над столом). Её прикручивают болтами М3 через отверстия сетки. Программа показывает, какие отверстия под заготовкой свободны от зоны резания, и рисует там головки болтов.
- Проверки: болт некуда поставить или он один; фреза задевает головку болта (переходы ниже головки — нужна бóльшая «Безопасная высота»); фреза уходит в фанеру до слоя с гайками.
- Для двух сторон: кнопка «По сетке отверстий» ставит центр заготовки на узел сетки или между узлами. Тогда после переворота отверстия в заготовке попадают на те же гайки. Программа проверяет это и пишет «встанет на те же болты».
- Формат
.frwзакрытый, КОМПАС на ПК нет. Координаты вынуты из сжатого потокаContents(окружности: центр, оси, полуоси, углы; шестиугольники: центр, вписанный радиус 2.8).
Ноль XY не обязательно искать джогом. Программа знает, где заготовка лежит на столе (раздел «Стол и размещение» у 3D-модели, «Положение на столе» у платы), и какая её точка — ноль задания («Ноль станка» у 3D-модели, «Ноль XY» у платы).
- «Ноль XY по заготовке» — кнопка в карточке «Ноль» экрана «Станок» (и в подготовке шага, если ноль стоит не там). Программный ноль XY встаёт в эту точку, фреза подъезжает к ней. Если положение XY неизвестно (станок не отвечает по служебному каналу, а «Домой» после запуска программы не нажимали), станок сначала идёт «Домой». Перед переездом фреза поднимается: на безопасную высоту, если ноль Z задан, иначе в верхнюю точку (
^PA;!ZM0;, как у SRP Player). - Положите заготовку на станке так же, как на экране, с теми же отступами от краёв стола, — и ноль XY готов. Если фреза встала не точно над углом, подгоните её джогом и нажмите «Ноль XY здесь».
- Привязка стола. Все координаты RML станок считает от своего нуля XY. Этот ноль записан в самом станке: его ставят в VPanel («Set Origin Point»), он сохраняется после выключения и может стоять где угодно. «Домой» (
H) приводит именно в него: на MDX-40A послеHVPanel показывает X 0, Y 0 в системе пользователя. Без привязки программа считает, что этот ноль в левом переднем углу стола. Если это не так, «Ноль XY по заготовке» отправит фрезу не туда. Привязка делается один раз: подвести фрезу джогом точно к левому переднему углу стола (или фанерной подложки), нажать «Фреза над углом стола» (если станок не отвечает по служебному каналу — сначала «Домой»). Программа запомнит, где на столе ноль станка (TableSetup.zeroX/zeroY). Если ноль в станке переставят в VPanel, привязку нужно повторить. - Если ноль после привязки всё равно приходится подгонять на одно и то же расстояние, положите заготовку точно как на экране, подгоните ноль и нажмите «Запомнить как поправку стола».
- Ход станка проверяется по столу (305×305), где бы ни стоял ноль станка. Координаты RML от него могут быть и отрицательными.
- Перед каждым шагом программа пишет, стоит ли ноль XY по заготовке, подогнан ли он джогом или остался от другого задания.
- На второй стороне ноль XY тот же: заготовка после переворота занимает то же место. Так и при перевороте вокруг другой оси — тогда разворачиваются траектории, а не ноль (см. «Обработка с двух сторон»).
- Ноль Z — по-прежнему касанием: высоту кончика фрезы программа не знает.
- Проверка.
StockZeroTest: подъём и переезд в симуляторе, подгонка джогом, ноль вне хода станка, ноль станка у заднего края стола (отрицательные координаты), режим «Только файлы», ход станка по столу.UiSnapshotTest: ноль платы и 3D-модели, на второй стороне тот же, поправка и привязка стола.
Устроено как «Cut both sides» и «Add support to model» в SRP Player (cam3d/Cam3d.kt, раздел 4 экрана «3D-модель»).
- Разъём. Сторона 1 фрезеруется сверху до плоскости разъёма (по умолчанию середина модели) с перекрытием 0.5 мм. Сторона 2 — то же снизу после переворота. Над моделью фреза идёт до её поверхности, даже ниже разъёма, поэтому с каждой стороны снимается всё, что с неё видно. Вокруг модели заготовка прорезается насквозь, рамка за полем обработки остаётся целой.
- Поддержки — бруски толщиной и высотой 5 мм на высоте разъёма, от края заготовки до модели (заходят в неё на 1 мм). Их 2 (слева и справа) или 4 (со всех сторон). Их можно сдвинуть от центра модели. Поддержки не фрезеруются и держат модель в рамке, когда вторая сторона её прорежет. Программа предупреждает, если поддержка не встречает модель или если рамка тоньше 2 мм. Кнопка «По модели + поле и рамка» подбирает заготовку с рамкой.
- Срезка поддержек — последний шаг, пока заготовка ещё лежит второй стороной вверх. Фреза снимает каждый брусок сверху насквозь, на 0.5 мм ниже его низа. Карта инструмента строится по одной модели, поэтому в модель фреза не заходит. Центр фрезы не выходит за зону, которую уже прошли фрезы сторон, и рамку не задевает: у рамки остаётся обрубок поддержки. Под нависающими краями модели могут остаться крохи — их зачищают. По умолчанию режет чистовая фреза, она уже стоит после второй стороны. Можно оставить тонкую перемычку (0.2–0.5 мм) и отломить модель рукой. Программа проверяет, что каждая поддержка перерезана по всему сечению, и предупреждает, если фреза не проходит между моделью и рамкой. Перед шагом станок предупреждает, что модель освободится.
- Обычный стол. Заготовку переворачивают вручную: вокруг X (передний край уходит назад) или вокруг Y. Ноль XY прежний, если заготовку положить на то же место (к тем же упорам или на те же болты). Ноль Z выставляется заново. Толщина заготовки должна совпадать с введённой.
- Как перевернуть — картинкой (
ui/FlipGuide.kt). В разделе «Стороны и поддержки» и перед первым шагом стороны 2 на экране «Станок» — брусок с осью и стрелкой поворота и вид сверху до и после переворота. Передний торец помечен оранжевым, правый — голубым: видно, куда они уйдут, где после переворота окажется модель и что ноль XY остаётся на месте. Если модель стоит не по центру заготовки, программа пишет, в какую сторону и на сколько она переедет. Так и должно быть: вторая сторона рассчитана под это положение (в SRP Player на этом путались). - Перевернули по-другому — вторая сторона подстраивается сама (
JobFlipвjobs/Jobs.kt). Перед стороной 2 станок спрашивает «Как перевернули: вперёд-назад / влево-вправо». Переворот вокруг X и вокруг Y отличаются ровно поворотом на 180° вокруг центра заготовки. Если выбрать не тот, что был задуман, все шаги стороны 2 (и 3D-вид) разворачиваются на 180°, а ноль XY не меняется. Это поворот, а не зеркало: попутное фрезерование остаётся попутным. После начала стороны 2 выбор закрывается. - Поворотная ось. Переворачивать не нужно: перед каждым шагом фреза поднимается в верхнюю точку и ось встаёт в свой угол — как у SRP Player:
!MC0;!ZM0;!ZEA180.00;. Команда!ZEA<градусы>найдена вSRPCore.dllSRP Player. - Проверка.
TwoSidedTest: шар в заготовке на обычном столе (переворот вокруг X и вокруг Y) и на поворотной оси, симуляция обеих сторон. Шар не зарезан, вокруг него сквозной прорез, рамка на месте. Поддержки без срезки на месте, со срезкой перерезаны насквозь (или до перемычки 0.3 мм), обрубки у рамки остались. Шар не по центру заготовки рассчитан под переворот вперёд-назад, а перевернули влево-вправо: с развёрнутой второй стороной зарез 0 мм, без разворота — 10 мм. Результат с двух сторон показывается сплошной деталью в рамке (SoftRenderer.addSlab).
Раздел «Плата и заготовка» экрана «Плата»: «Текстолит — Двусторонний» (pcb/PcbCam.kt).
- Порядок. Сторона 1 (медь верха, F_Cu, как в редакторе): отверстия под штифты, изоляция верха, сверловка. Переворот. Сторона 2 (медь низа, B_Cu, отражённая под переворот): изоляция низа и контур платы — последним, чтобы плата держалась до конца. На превью можно переключать «Сторона 1 — верх / Сторона 2 — низ»: вторая сторона показана так, как её увидит станок.
- Штифты совмещения. Первым шагом в поле заготовки сверлятся два отверстия на оси переворота, по обе стороны платы, насквозь и в подложку (по умолчанию Ø3, на 2.5 мм — на фанерной подложке глубже нельзя: ниже слой с гайками). Поле вокруг платы при этом не меньше диаметра штифта плюс 3 мм. Перед второй стороной в отверстия вставляют штифты (отрезки прутка, хвостовики свёрл) и надевают на них перевёрнутую плату. Стороны совпадут, даже если текстолит отрезан неровно. Отверстия стоят симметрично центру заготовки, поэтому подходят и при перевороте вокруг другой оси; вторая сторона тогда разворачивается, как у 3D-модели. Инструмент — «Авто» из ваших: сверло нужного диаметра или фреза тоньше (отверстие по спирали).
- Ноль. XY — тот же угол или центр заготовки: плата переворачивается вокруг оси через центр заготовки. Z — снова на поверхности меди.
- Переходные отверстия не металлизированы: после фрезеровки их пропаивают проволокой.
- Если в проекте нет меди низа, плата делается с одной стороны, программа об этом пишет.
- Проверка.
PcbTwoSidedTest(плата KiCad с добавленной медью низа; переворот вокруг X и Y; ноль в углу и в центре): порядок шагов; штифты на оси и попадают в свои отверстия при любом перевороте; все металлизированные отверстия после переворота попадают в площадки меди низа (при перевороте не вокруг той оси — ни одно); всё в пределах заготовки.
Раздел 4 экрана «3D-модель» (cam3d/Prep.kt). Шаги встают в начало задания модели или идут отдельным заданием («Только подготовку — в очередь»). В окне «Траектории» они голубые, неровная заготовка до подготовки — голубой каркас.
- Отверстия под болты (только с фанерной подложкой) — первым шагом, пока болтов нет: заготовку держит скотч или прижимы по краям. Сквозные отверстия Ø3.4 над теми отверстиями подложки, где встанут болты, и на 0.3 мм в подложку. Фреза идёт по спирали и кругами изнутри наружу, если она почти равна отверстию — врезается с отскоками. «Утопить головки» добавляет гнёзда Ø(головка + 0.6) на 0.5 мм глубже высоты головки под выровненным верхом.
- Выравнивание верха — змейка плоской фрезой от самой высокой точки на заданную глубину. Если болты стоят и головки не утоплены, фреза обходит их поверху: вокруг остаются невыровненные пятачки, программа предупреждает.
- Выравнивание боков — обход снаружи по часовой (попутное фрезерование) от неровного верха до низа заготовки или заданной глубины. Лишнее («до N мм с каждого бока») снимается кругами снаружи внутрь, последний круг — кромкой точно по размеру X×Y. Углы острые, центр фрезы огибает их по дуге. Каждый слой начинается снаружи за пределами лишнего, то есть врезание в воздухе. Шаг по Z по умолчанию — из режимов фрезы, глубже при узком съёме.
- Ноль Z. У шагов подготовки при нуле «верх» он ставится на самую высокую точку невыровненного верха, у модели — на выровненный верх. Перед первым шагом модели станок об этом напомнит. С нулём «основание» перевыставлять не нужно.
- Проверки: фреза для отверстий не тоньше отверстия; режущая часть короче глубины; цанга упирается в заготовку при заданном вылете; траектории подготовки — в ходе станка.
- Сдвиг модели в заготовке — поля «Сдвиг по X/Y/Z» в разделе 2 или мышью («Мышь двигает: модель в заготовке» внизу окна). Модель не выходит за заготовку, сдвиг упирается в край.
- Проверка:
PrepTest— бока не заходят внутрь размера и снимают всё лишнее до низа; верх обходит головки болтов; отверстия и гнёзда нужного диаметра насквозь; сдвиг модели и упор в края.
Как в SRP Player: в каждом выборе фрезы или сверла первым пунктом стоит «Авто» — подбор только из инструментов, отмеченных «есть у меня» (★, раздел «Инструменты»; при импорте ★ ставятся по My Tools SRP Player). Под выбором — почему подобран этот инструмент; если подходящего среди ваших нет, берётся инструмент из библиотеки, и программа пишет, какой нужен. Правила — library/ToolAdvisor.kt, подбор чистовой по модели — cam3d/ToolFit.kt.
- «Подбор фрез: Детально / Быстро» (раздел «Заготовка») — вопрос «время или качество» SRP Player.
- Черновая — самая крупная из ваших (при «Детально» не крупнее 6 мм, как в SRP Player), лучше та, чья режущая часть достаёт на всю глубину.
- Чистовая — по модели: для каждой вашей шаровой и плоской фрезы (не крупнее черновой) считается карта кончика и огибающая — где фреза оставит материал. Берётся самая крупная, у которой непрорезанного не больше допуска: «Детально» — 0.5 % поверхности глубже 0.15 мм, «Быстро» — 3 % глубже 0.4 мм. Если проходит та же, что черновая, — без смены фрезы. Если не проходит ни одна — самая тонкая и подсказка, сколько поверхности останется. Считается в фоне и при расчёте. Не учитываются сквозные отверстия и щели между частями модели на дне стороны.
- Срезка поддержек — чистовая (она уже стоит), если её режущей части хватает на толщину поддержки, иначе самая тонкая из ваших, что прорежет насквозь.
- Подготовка — выравнивание самой широкой плоской; отверстия под болты — самой крупной не толще 2/3 отверстия (так требует SRP Player), впритык — тоньше хотя бы на 0.3 мм.
- Плата — изоляция: самый тонкий рез из ваших гравёров и фрез до 0.8 мм; контур: ваша плоская 0.8–3.2 мм ближе к 2 мм; отверстия: сверло или фреза того же диаметра → фреза тоньше (отверстие по спирали) → чуть крупнее, до +0.25 мм (отверстие выйдет больше, программа предупреждает). Свой выбор для диаметра хранится отдельно, остальные остаются «Авто». Если инструмент изоляции шире самых узких зазоров между медью, расчёт предупреждает, что дорожки не разделятся.
- Прежние настройки: фрезы, что раньше стояли по умолчанию (ZHS-400, шаровая R1.5, ZHS-600, ZHS-200, гравёр 30°/0.1, плоская Ø1), при первом запуске новой версии становятся «Авто»; выбранные вручную остаются.
- Проверка:
ToolAdvisorTest— только из моих; модель с пазом 1.5 мм — чистовая ZHS-100, гладкий брусок — ZHS-600 без смены фрезы; «Быстро» на мелкой выемке берёт крупную; свёрла для платы; перенос прежних настроек.
Проверено автотестами:
- разбор Gerber/Excellon на реальных платах KiCad 2013/8, Eagle и на файлах формата EasyEDA;
- изоляция, сверловка и контур; рендер плат — в
build\test-out\*.png; - 3D на рельефе и на
Piano.stlиз SRP Player: зарез модели ≤ 0.003 мм, проверено симуляцией; - генерация RML и обратный разбор;
- импорт базы SRP Player: 85 фрез, 1000 режимов MDX-40A, «My Tools»;
- переворот на вторую сторону: модель не по центру и «чужой» переворот (
TwoSidedTest), двусторонняя плата со штифтами (PcbTwoSidedTest).
Проверено на станке: чтение по служебному каналу — координаты головки, ноль RML-1, прошивка, пределы хода (PanelTest разбирает байты, которые прислал станок).
Не проверено на станке: кнопка VIEW (команда взята из VPanel, в тестах — модель станка), сверка положения с движущимся станком, связь «USB напрямую» (проверены поиск устройств и асинхронная запись — в файл, StandaloneTest), джог, «Ноль Z здесь», «Ноль XY по заготовке» с привязкой стола (что «Домой» приводит в ноль XY, записанный в станке, проверено на станке по VPanel), включение шпинделя без движения, отправка заданий, пауза и продолжение (подача порциями через очередь Windows), поворот оси A командой !ZEA и переворот на вторую сторону (у 3D-модели и у двусторонней платы со штифтами), подготовка заготовки (отверстия, выравнивание боков). Первое задание прогоните в воздухе: поднимите ноль Z на 10–20 мм над заготовкой и нажмите «Пауза»/«Продолжить».
Код — в src/main/kotlin/millstudio/, тесты — в src/test/kotlin/millstudio/.
core/ геометрия, хранение настроек
library/ модель инструментов/материалов/режимов, рекомендуемые режимы, подбор «Авто» из моих (ToolAdvisor), импорт из SRP Player
toolpath/ траектории, построитель безопасных подходов, упорядочивание контуров
rml/ генератор RML-1 (как у SRP Player), интерпретатор RML, программа блоками (RmlStream), вставки паузы/возврата
machine/ профиль станка, очередь принтера Windows (JNA), подача порциями с паузой (JobStreamer), контроллер,
служебный канал станка — координаты и VIEW (MdxPanel), виртуальный станок, стол и поворотная ось (Table)
pcb/ Gerber (апертуры, макросы, дуги, регионы, полярность), Excellon, распознавание слоёв, CAM плат
cam3d/ STL, Z-карта модели, карта кончика инструмента и огибающая, черновая/чистовая, подбор чистовой по модели (ToolFit),
подготовка заготовки (Prep), симуляция, 3D-рендер
jobs/ задания и шаги для станка, переворот заготовки перед второй стороной (JobFlip)
ui/ интерфейс Compose: экраны Плата / 3D-модель / Станок / Инструменты, схема переворота (FlipGuide)
Тестовые платы в testdata/: clockblock, mchck, 8bit-mixtape взяты из фикстур проекта tracespace, у каждой своя лицензия (LICENSE в папке). kicad8 и easyeda — синтетические файлы в формате этих программ.
- обработка с 4 сторон на поворотной оси (A = 0/90/180/270°) и цилиндрическая заготовка;
- выборка меди (rub-out) и V-гравировка текста/логотипов на платах;
- сверловка отверстий под штифты для двусторонней 3D-обработки (Hole в SRP Player);
- контурная (Z-level) чистовая, доработка остатков меньшей фрезой, «карандашная» обработка углов (возможности уровня SRP Player Pro);
- коррекция подачи и оборотов на ходу и очистка буфера станка при «Стоп» по служебному каналу, как у VPanel;
- импорт DXF/SVG для 2.5D-гравировки.
Код — MIT. Тестовые платы в testdata/ — под своими лицензиями (файл LICENSE в папке каждой).
Roland, MODELA, SRP Player и VPanel — товарные знаки Roland DG Corporation. MillStudio — независимый проект, с Roland DG не связан.






