Универсальный постпроцессор для CAM-систем с поддержкой Python-макросов
Генерирует G-код из APT/CL файлов для любого оборудования: 3-5 осевые фрезерные станки, токарные, многозадачные обрабатывающие центры с ЧПУ Siemens, Fanuc, Heidenhain, Haas
- Что это?
- Возможности
- Быстрый старт
- Поддерживаемое оборудование
- Примеры использования
- Создание макросов
- Документация
- Установка
- Требования
- Статус проекта
PostProcessor — это универсальный постпроцессор, который преобразует управляющие программы из формата APT/CL (из CAM-систем CATIA, NX, Mastercam, Fusion 360) в G-код для конкретных станков с ЧПУ.
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ CAM-система │ │ PostProcessor │ │ Станок ЧПУ │
│ (CATIA, NX) │───▶│ + Python макросы │────▶│ (Siemens, │
│ APT/CL файл │ │ │ │ Fanuc...) │
└─────────────────┘ └──────────────────┘ └─────────────────┘
Архитектура на Python-макросах позволяет добавлять поддержку любого оборудования без перекомпиляции основного кода. Просто создайте Python-файл с логикой обработки команд для вашего станка!
| Возможность | Описание |
|---|---|
| 🌍 Универсальность | Поддержка любого оборудования через конфигурации и макросы |
| 🧩 Модульность | Python макросы без перекомпиляции основного кода |
| ⚙️ 4 контроллера | Siemens, Fanuc, Heidenhain, Haas — готовые конфигурации |
| 🏭 8+ профилей | DMG Mori, Haas, Romi, Mecof — готовые профили станков |
| 🐍 Python 3.8-3.12 | Полноценный Python для логики постпроцессора |
| 🔄 3-5 осей | 3-осевая и 5-осевая обработка (RTCP, CYCLE800) |
| 🛠️ Токарная | TURRET, CHUCK, TAILSTK — токарные макросы |
| 🛡️ Безопасность | Проверка ограничений станка перед выводом |
| 📝 Модальность | Оптимизированный вывод G-кода |
| 💾 StateCache | Кэш состояний LAST_* (IMSPost-style) для модальных переменных |
| 🔄 CycleCache | Кэширование параметров циклов — автоматический выбор полного определения или вызова |
| 🔢 NumericNCWord | Форматирование числовых NC-слов из конфига контроллера |
| 🔣 SequenceNCWord | Нумерация блоков (N10, N20...) из конфига |
| 📝 TextNCWord | Комментарии со стилем из конфига (parentheses/semicolon) |
| ✅ 169 тестов | Unit-тесты для ядра, макросов и интеграционные тесты |
| 📖 ~16,000 строк | Полная документация и код на C# |
Кэширование LAST_* переменных для модального вывода:
- LAST_FEED, LAST_TOOL, LAST_CS...
- Автоматическая проверка изменений
- Оптимизация вывода G-кода
Автоматический выбор: полное определение или вызов:
; Первый вызов (полное определение)
CYCLE800(MODE=1, TABLE="TABLE1", X=100.000, ...)
; Второй вызов (те же параметры - только вызов)
CYCLE800()Все параметры форматирования в JSON-конфигах:
- Нумерация блоков (N10, N20...)
- Стиль комментариев (parentheses/semicolon)
- Форматы координат (decimals, leadingZeros)
- Форматы подачи и шпинделя
Числовые NC-слова с паттернами формата:
- Паттерны:
X{-#####!###} - Форматирование из конфига контроллера
- Автоматическая модальность
Текстовые NC-слова для комментариев:
- Стили: parentheses
(Comment), semicolon; Comment, both - Транслитерация кириллицы
- Ограничение длины
Новые методы в Python-макросах:
context.cacheGet("LAST_FEED", 0.0)
context.cacheSet("LAST_FEED", 500.0)
context.cycleWriteIfDifferent("CYCLE800", params)
context.setNumericValue('X', 100.5)
context.getFormattedValue('F')
context.comment("Привет") # Стиль из конфига# Клонируйте репозиторий
git clone https://github.com/rybakov25/PostProcessor.git
cd PostProcessor
# Сборка
dotnet build# Обработка APT файла
dotnet run --project src/PostProcessor.CLI/PostProcessor.CLI.csproj \
-- -i input.apt -o output.nc -c siemens -m mmillСоздайте файл macros/python/user/hello.py:
# -*- coding: ascii -*-
def execute(context, command):
context.comment("=== Привет от Python! ===")
context.write("G0 X0 Y0 Z50")Результат в output.nc:
(=== Привет от Python! ===)
N1 G0 X0. Y0. Z50.📖 Подробнее: QUICKSTART.md — первый макрос за 10 минут
| Контроллер | Семейства | Макросы | Статус |
|---|---|---|---|
| Siemens | 840D / 840D sl | 9 базовых + mmill | ✅ Полная поддержка конфигов |
| Fanuc | 31i / 32i / 35i | 11 (фрезерные + токарные) | ✅ Полная поддержка конфигов |
| Heidenhain | TNC 640 / TNC 620 | 9 (уникальный синтаксис) | ✅ Полная поддержка конфигов |
| Haas | NGC / Next Gen | 9 (с % маркером) | ✅ Полная поддержка конфигов |
| Тип | Примеры | Поддержка |
|---|---|---|
| 3-осевые фрезерные | DMG Mori DMU50, Haas VF-2 | ✅ |
| 5-осевые | DMG Mori DMU50 5-axis, Haas UMC | ✅ (RTCP, CYCLE800) |
| Токарные | Mori Seiki NLX2500, Romi GL250 | ✅ (TURRET, CHUCK, TAILSTK) |
| Многозадачные | Mazak Integrex | 🔄 В разработке |
📖 Полный список: SUPPORTED_EQUIPMENT.md
dotnet run -- -i part.apt -o part.nc \
-c siemens \
--machine-profile mmilldotnet run -- -i impeller.apt -o impeller.nc \
-c fanuc \
--machine-profile dmg_mori_dmu50_5axisdotnet run -- -i shaft.apt -o shaft.nc \
-c haas \
--machine-profile romi_gl250dotnet run -- -i part.apt -o /dev/null \
-c siemens \
--validate-only# -*- coding: ascii -*-
# MACRO_NAME - Описание
def execute(context, command):
"""
Обработка APT команды
Args:
context: Объект контекста постпроцессора
command: Объект APT команды
"""
# Проверка параметров
if not command.numeric:
return
# Получение значений
x = command.numeric[0]
# Обновление регистров
context.registers.x = x
# Вывод G-кода
context.write(f"G01 X{x:.3f}")# -*- coding: ascii -*-
def execute(context, command):
if not command.numeric:
return
x = command.numeric[0] if len(command.numeric) > 0 else 0
y = command.numeric[1] if len(command.numeric) > 1 else 0
z = command.numeric[2] if len(command.numeric) > 2 else 0
context.registers.x = x
context.registers.y = y
context.registers.z = z
# Проверка на быстрое перемещение
if context.system.MOTION == 'RAPID':
context.write(f"G0 X{x:.3f} Y{y:.3f} Z{z:.3f}")
else:
context.write(f"G1 X{x:.3f} Y{y:.3f} Z{z:.3f}")
# Модальная подача с использованием StateCache
if context.registers.f > 0:
last_feed = context.cacheGet("LAST_FEED", 0.0)
if last_feed != context.registers.f:
context.write(f"F{context.registers.f:.1f}")
context.cacheSet("LAST_FEED", context.registers.f)# -*- coding: ascii -*-
def execute(context, command):
# Получение RPM
if command.numeric:
context.registers.spindle_rpm = command.numeric[0]
# Обработка ключевых слов
spindle_state = 'OFF'
if command.minorWords:
for word in command.minorWords:
if word.upper() in ['ON', 'CLW']:
spindle_state = 'CW'
elif word.upper() in ['CCLW', 'CCW']:
spindle_state = 'CCW'
elif word.upper() == 'OFF':
spindle_state = 'OFF'
# Вывод M-кода
if spindle_state == 'CW':
context.write("M3")
if context.registers.spindle_rpm > 0:
context.write(f"S{int(context.registers.spindle_rpm)}")
elif spindle_state == 'CCW':
context.write("M4")
if context.registers.spindle_rpm > 0:
context.write(f"S{int(context.registers.spindle_rpm)}")
else:
context.write("M5")# -*- coding: ascii -*-
def execute(context, command):
# Сбор параметров цикла
params = {
"MODE": command.numeric[0] if len(command.numeric) > 0 else 1,
"TABLE": command.string if command.string else "TABLE1",
"X": context.registers.x,
"Y": context.registers.y,
"Z": context.registers.z
}
# Автоматический выбор: полное определение или вызов
context.cycleWriteIfDifferent("CYCLE800", params)# -*- coding: ascii -*-
def execute(context, command):
# Стиль комментария берётся из конфига контроллера
# Siemens: (Comment), Haas: ; Comment
context.comment("Начало обработки")
context.comment("Привет мир") # Транслитерация кириллицы📖 Полное руководство: PYTHON_MACROS_GUIDE.md
| Документ | Описание |
|---|---|
| 🚀 QUICKSTART | Первый макрос за 10 минут |
| 📚 PYTHON_MACROS_GUIDE | Полное API макросов (1400+ строк) |
| 🏗️ ARCHITECTURE | Архитектура для разработчиков |
| ⚙️ CUSTOMIZATION | Настройка контроллеров и станков |
| 🌍 SUPPORTED_EQUIPMENT | Поддерживаемое оборудование |
| 🔄 IMSPOST_TO_PYTHON | Миграция с IMSpost |
| 📊 COMPLETION_REPORT | Статус и план развития |
# Клонирование
git clone https://github.com/rybakov25/PostProcessor.git
cd PostProcessor
# Сборка
dotnet build
# Запуск
dotnet run --project src/PostProcessor.CLI/PostProcessor.CLI.csproj \
-- -i input.apt -o output.nc -c siemensСкачайте с страницы релизов:
- Windows:
PostProcessor-1.1.0-win-x64.zip - Linux:
PostProcessor-1.1.0-linux-x64.zip
Предыдущие версии:
- v1.0.0:
PostProcessor-v1.0.0-win-x64.zip,PostProcessor-v1.0.0-linux-x64.zip
| Параметр | Короткий | Описание | Default |
|---|---|---|---|
--input |
-i |
Входной APT файл | Обязательно |
--output |
-o |
Выходной NC файл | Обязательно |
--controller |
-c |
Тип контроллера | siemens |
--machine-profile |
-mp |
Профиль станка | Нет |
--debug |
-d |
Режим отладки | false |
Пример configs/controllers/siemens/840d.json:
{
"name": "Siemens Sinumerik 840D sl",
"machineType": "Milling",
"formatting": {
"coordinates": {
"decimals": 3,
"trailingZeros": false
},
"sequenceNumbers": {
"enabled": true,
"prefix": "N",
"increment": 10
},
"comments": {
"style": "parentheses",
"transliterate": true
}
},
"gcode": {
"rapid": "G0",
"linear": "G1"
},
"mcode": {
"spindleCW": "M3",
"coolantOn": "M8"
},
"fiveAxis": {
"tcpOn": "RTCPON",
"tcpOff": "RTCPOF"
}
}| Компонент | Версия | Примечание |
|---|---|---|
| .NET SDK | 8.0+ | Для сборки |
| Python | 3.8-3.12 | Для макросов |
| CAM-система | Любая | Генерирующая APT/CL |
- ✅ CATIA
- ✅ Siemens NX
- ✅ Mastercam
- ✅ Fusion 360
- ✅ SolidCAM
- ✅ HyperMill
- ✅ Другие (с экспортом в APT/CL)
| Метрика | Значение |
|---|---|
| Строк кода | ~10,000 (C#) |
| C# файлы | 50+ |
| Python макросы | 65 |
| Unit-тесты | 169 ✅ |
| Документация | ~8,000 строк |
| Конфигурации | 4 контроллера + 7 профилей |
✅ Готов для:
- 3-5 осевых фрезерных станков
- Токарных станков (базовая обработка)
- Станков с Siemens, Fanuc, Heidenhain, Haas
- Форматирования из JSON-конфигов
- Кэширования состояний и циклов
- Токарные циклы G71-G76
- Mill-Turn поддержка (приводной инструмент)
- Расширенные профили (Mazak, Okuma)
- Графический интерфейс (GUI)
📋 План развития: COMPLETION_REPORT.md
- Fork репозитория
- Создайте ветку (
git checkout -b feature/amazing-feature) - Закоммитьте изменения (
git commit -m 'Add amazing feature') - Отправьте в ветку (
git push origin feature/amazing-feature) - Откройте Pull Request
📖 Подробнее: CONTRIBUTING.md (в разработке)
MIT License — см. файл LICENSE
- Репозиторий: https://github.com/rybakov25/PostProcessor
- Issues: https://github.com/rybakov25/PostProcessor/issues
- Releases: https://github.com/rybakov25/PostProcessor/releases
- Actions: https://github.com/rybakov25/PostProcessor/actions
- IMSpost — за вдохновение архитектурой
- pythonnet — за Python интеграцию
- xUnit — за фреймворк тестирования
- ПАО "Корпорация ВСМПО-АВИСМА" и Солдатову Вячеславу, ведущему инженеру-программисту станков с ЧПУ — за вдохновение на разработку
- QWEN AI — за помощь в реализации проекта
PostProcessor — Универсальный постпроцессор для CNC