Skip to content

Repository files navigation

PCB Registration Tool

Браузерный инструмент для совмещения двух сторон печатной платы при двустороннем фрезеровании на ЧПУ.

Открывается напрямую как index.html — сборка и сервер не нужны, всё на чистом JS.

Второй инструмент в этом репозитории — test-generator/: генератор тестовых паттернов для калибровки V-фрезы (глубина/гистерезис, kerf, минимальная дорожка), тоже без сборки, открывается напрямую.

Что делает

  1. Загружаете DXF/SVG (или готовую УП — см. ниже) первой (базовой) стороны платы, кликаете по замкнутым фигурам (окружность, дуга, контур) — программа вычисляет их геометрический центр.
  2. Отмечаете нужные фигуры как реперные точки (минимум 3, не на одной прямой — этого достаточно для однозначного восстановления аффинного преобразования: поворот + смещение + растяжение/сдвиг по двум осям, 6 параметров). Номер каждой точки показывается рядом с её меткой на чертеже; клик по строке в таблице реперных точек подсвечивает точку на чертеже кольцом.
  3. Загружаете DXF/SVG/УП второй стороны — можно сразу несколько файлов (пакетно, или перетаскиванием), например отдельно контур/изоляцию/сверловку. Все они отображаются поверх первой стороны (которая автоматически становится полупрозрачной) и к ним при экспорте применяется одно и то же преобразование.
  4. После фрезеровки, переворота и закрепления платы измеряете фрезой станка фактические координаты тех же реперных отверстий и вписываете их в таблицу.
  5. Программа считает аффинное преобразование методом наименьших квадратов (компенсирует кривизну станка и неточность закрепления), показывает разложение (угол, масштаб, обнаруженный сдвиг/отражение) и невязку по каждой точке. Для случая, когда нужно просто сдвинуть слой 2 по X/Y без поворота и масштаба (например, пробное грубое совмещение по одному отверстию) — выберите точку кликом по строке в таблице и нажмите «Сместить по выбранной точке (без поворота)».
  6. Преобразование визуально накладывается на второй слой и может быть сохранено — каждый загруженный в слой 2 файл экспортируется отдельно, в своём исходном формате:
    • для DXF/SVG — как скорректированный DXF, окружности/дуги, попавшие под сдвиг, корректно превращаются в DXF ELLIPSE (точный аналитический пересчёт через SVD, не аппроксимация);
    • для готовой УП (.nc/.gcode/...) — как тот же G-code с пересчитанными координатами X/Y всех перемещений, дуг и циклов сверления; всё остальное (F/S/M/T, Z, комментарии) остаётся без изменений.

Несколько файлов в слое 2 (пакетная обработка)

Кнопка «+ Добавить файл(ы)…» и перетаскивание на холст принимают сразу несколько файлов. Каждый из них хранится и экспортируется как отдельный файл (список с именами и кнопкой ✕ для удаления показан под кнопкой загрузки), но реперные точки и рассчитанное преобразование — общие на весь слой 2. Повторный выбор файла с уже загруженным именем обновляет его содержимое на месте (не создаёт дубликат). Добавление/удаление файлов из слоя 2 не сбрасывает уже посчитанное преобразование.

Слой 2 из готовой УП (.nc/.gcode)

Если для второй стороны уже есть постпроцессированная управляющая программа (из FlatCAM/pycam/CopperCAM/ЧПУ-CAM и т.п.), её можно загрузить в слой 2 напрямую — конвертировать обратно в DXF не нужно. Поддерживаемые расширения: .nc, .gcode, .ngc, .tap, .cnc, .din.

  • Перемещения G0/G1, дуги G2/G3 (формат I/J или R) и циклы сверления G81/G82/G83 распознаются и отображаются на холсте (точки сверления — как кликабельные точки для реперных меток, полные окружности G2/G3 — как окружности с центром, так же как в DXF).
  • Вертикальные перемещения (строка с Z, но без X/Y — заглубление или отвод фрезы) тоже считаются сверловкой и добавляются как кликабельная точка — это покрывает файлы, где отверстия сделаны без канонических циклов G81/82/83, просто позиционированием и движением по Z. Заглубление и отвод в одной точке дают одну и ту же реперную точку (без дублей).
  • При экспорте, если преобразование — подобие (поворот + одинаковый масштаб, без сдвига), дуги пересчитываются точно (новый центр/радиус/направление). Если преобразование включает сдвиг/неравномерный масштаб (компенсация кривизны станка), дугу нельзя выразить точным G2/G3 в новых координатах — такая дуга заменяется короткой последовательностью G1, повторяющей истинную (эллиптическую) траекторию.
  • Предполагается, что I/J всегда заданы относительно начала дуги (типичный режим по умолчанию), а перемещения — в плоскости XY (G17). Раскрытие подпрограмм/циклов (M98/M97) и абсолютный режим IJK (G90.1/G91.1) не поддерживаются.

Станок по COM + карта высот

Раздел «Станок (COM)» подключается к контроллеру (GRBL/grblHAL) напрямую из браузера через Web Serial API — работает только в Chrome/Edge (в Firefox/Safari панель показывает понятное сообщение вместо мёртвой кнопки), сборка/сервер не нужны. Даёт: подключение/отключение по COM с выбором скорости, джог по осям, консоль отправленных/полученных строк, ручной ввод команд, кнопку аварийного СТОП (soft-reset).

Раздел «Карта высот» строит и снимает карту высот платы силами самого приложения (не через встроенный пробер ioSender):

  1. Контур платы определяется автоматически (самая большая по площади замкнутая фигура слоя — окружность или замкнутая полилиния) либо назначается вручную кликом по фигуре на чертеже. Вырезы/отверстия, которые нужно исключить из сканирования, выделяются одной кнопкой («все окружности слоя») и дополняются вручную (для пазов/вырезов произвольной формы) — оба списка можно скорректировать.
  2. Сетка точек сканирования строится в координатах чертежа (той же системе, где определён контур), а не в осях станка — это значит, что при сканировании она физически поворачивается и растягивается вместе с платой согласно уже посчитанному аффинному преобразованию слоя 2. Шаг сетки авто-подгоняется под размер платы (как в ioSender: желаемый шаг округляется так, чтобы сетка легла на площадь платы без обрезанного края), точки на вырезах/за контуром/с недостаточным отступом от края в сканирование не попадают.
  3. Сама процедура прожима — не отвод на полную безопасную высоту после каждой точки (как это делает штатный пробер ioSender), а быстрый «относительный подскок»: после касания щуп поднимается на небольшую заданную высоту (например 0.3 мм) относительно только что измеренной точки, и следующая точка ищется на том же диапазоне — симметрично вверх и вниз, — а не с нуля от общей стартовой высоты. Резко сокращает время скана на плотной сетке.
  4. Карта применяется не через .map-файл в ioSender (у этого формата нет понятия поворота, а его билинейная интерполяция там же падает на пропущенных точках) — а сразу в браузере: при экспорте УП слоя 2 к каждому резу добавляется Z-коррекция, посчитанная методом IDW (обратно-взвешенное расстояние) по облаку реальных измерений, с разбиением длинных перемещений на короткие отрезки. Экспорт .map тоже есть — но только как вспомогательный файл для просмотра карты в ioSender, не для применения там.

Файлы

  • geometry.js — линейная алгебра: аффинный МНК-фит, SVD 2×2, bulge-дуги DXF, точные трансформации примитивов, point-in-polygon/дистанция до полигона.
  • dxf-parser.js / dxf-writer.js — чтение и запись ASCII DXF (LINE, CIRCLE, ARC, LWPOLYLINE/POLYLINE, ELLIPSE, POINT).
  • svg-parser.js — чтение SVG (transform-цепочки, path с кривыми/дугами, circle/ellipse/rect/poly*).
  • gcode-parser.js — чтение G-code (.nc/.gcode/...) в ту же внутреннюю модель сущностей, плюс построчное разложение на слова (и модальные X/Y/Z) для точной пересборки при экспорте.
  • gcode-writer.js — применяет аффинное преобразование и/или компенсацию по карте высот к G-code (координаты X/Y, дуги, циклы сверления, Z) и пересобирает файл, не трогая остальные команды.
  • serial.js — драйвер Web Serial + построчный протокол grblHAL (статус, результат щупа, джог).
  • heightmap.js — контур/вырезы, генерация сетки сканирования, сама процедура скана по COM, IDW-интерполяция, опциональный экспорт .map.
  • render.js — рендер сущностей в SVG, пан/зум, хит-тестинг кликов, оверлей карты высот.
  • app.js — состояние приложения и связка UI.

Ограничения

  • INSERT/BLOCK в DXF не разворачиваются — только сущности напрямую в ENTITIES.
  • Кривые Безье и эллиптические дуги SVG <path> аппроксимируются полилинией (точные <circle>/<ellipse> — без аппроксимации).
  • В G-code не поддерживаются: раскрытие подпрограмм (M97/M98), абсолютный режим IJK (G90.1/G91.1), плоскости, отличные от G17 (XY). Excellon-формат сверловки (.drl) не является G-code и не читается этим парсером.

About

Browser tool for double-sided PCB milling alignment via fiducial points (DXF/SVG viewer + least-squares affine registration)

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages