📐

Расчёт развёртки картонной коробки по FEFCO

библиотека на C++ и калькулятор для производителя картонной упаковки

Библиотека на C++17 для производителя картонной упаковки: по внутренним размерам коробки и толщине картона считает размер заготовки для FEFCO 0200, 0201 и 0203, объёмы и раскладку заготовок на листе гофрокартона.

ЗавершёнNDA
3 стиля FEFCO
0200, 0201 и 0203 считаются по одной структуре данных, а не по отдельным таблицам
77,7 %
использования листа 2000×1200 мм — 5 заготовок с поворотом для коробки 300×200×150
0 зависимостей
только компилятор C++17 и CMake — библиотека встраивается в софт производства

Задача

Производитель картонной упаковки получает заказ в виде внутренних размеров коробки: длина, ширина, высота. Чтобы вырезать заготовку, нужны размеры плоской развёртки с учётом толщины картона, клапана склейки и припусков на сгибы. Чтобы посчитать расход материала, нужно знать, сколько таких заготовок выйдет с одного листа гофрокартона.

Развёртка (заготовка) — плоский лист, из которого после резки и биговки складывается коробка. Биговка — продавленная линия сгиба. Гофрокартон — многослойный картон с волнистым слоем внутри. FEFCO — европейский каталог типовых конструкций коробок, где у каждого стиля есть код: 0201, 0203 и так далее.

Расчёт в таблицах давал ошибки: толщину картона легко не учесть, у каждого стиля своя формула, а раскладку на лист прикидывали на глаз. Ошибка обнаруживалась уже на резке. Нужно было ядро, которое считает по правилам каталога и которое можно встроить в программное обеспечение производства.

Решение

Библиотека packaging на C++17 и консольный калькулятор packaging_calc к ней. Что реализовано:

  • Три стиля коробок FEFCO: 0200 (клапаны только сверху), 0201 (стандартный ящик, клапаны встык с зазором), 0203 (полное перекрытие клапанов).
  • Размеры заготовки: длина как 2L + 2W + клапан склейки + припуски на биговку, ширина как высота + клапаны + припуски, высота клапана.
  • Наружные габариты и два объёма: внутренний и габаритный.
  • Раскладка заготовок на листе картона с учётом поворота на 90° и долей использованной площади.
  • Проверка входных данных: положительные размеры, толщина картона в диапазоне до 20 мм, корректный зазор клапанов. Ошибка даёт сообщение и код возврата 1.
  • Тесты формул, раскладки, валидации и разбора кода стиля, подключены через CTest.
  • Внешних зависимостей нет: только компилятор C++17 и CMake 3.14 и новее. Собирается на Linux, macOS и Windows.

Как это устроено

Развёртка FEFCO 0201: формула заготовки

Программа заполняет структуру BoxSpec (внутренние размеры, толщина, клапан склейки, зазор) и вызывает calculate() с кодом стиля. В ответ приходит заготовка: длина, ширина, высота клапана и площадь. Для 0201 ширина заготовки считается по зазору между клапанами, а не по фиксированной ширине коробки, как было в прототипе. Контрольный пример из README: коробка 300×200×150 мм, картон 3 мм, стиль 0201 — заготовка 1047,0×356,0 мм, клапан 98,5 мм, площадь 372 732 мм².

Припуск на биговку и толщина картона

Толщина картона участвует в расчёте дважды: как припуск на каждую линию сгиба и как добавка к наружным габаритам. Та же коробка снаружи получается 306×206×156 мм, внутренний объём 9,00 л, габаритный объём считается отдельно по наружным размерам. Припуск на биговку принят равным толщине картона: это приближение, и у конкретного производителя он может отличаться, поэтому формулы требуют сверки с оснасткой предприятия.

Раскладка заготовок на листе гофрокартона

Функция nest_on_sheet() принимает заготовку и размер листа, пробует сеточное размещение в исходной ориентации и с поворотом на 90° и возвращает число заготовок и долю использованной площади. На листе 2000×1200 мм контрольная заготовка укладывается 5 раз с поворотом, использование около 77,7 %. Раскладка сеточная, ширина ножа пока не учитывается.

Библиотека и консольный калькулятор

Расчёт подключается к другому проекту как обычная CMake-библиотека: подключить заголовок packaging/box.hpp, заполнить BoxSpec, вызвать calculate() и при необходимости nest_on_sheet(). Для ручной проверки есть утилита packaging_calc с параметрами стиля, размеров, толщины, клапана склейки, зазора и листа; справка по --help. Тесты запускаются командой ctest.

Результат

  • Три стиля FEFCO считаются по одному описанию конструкции, а не по отдельным таблицам.
  • Заготовка, наружные габариты и объёмы для контрольной коробки сходятся с ожидаемыми значениями из README; проверено сборкой и тестами.
  • Раскладка на лист даёт число заготовок и долю использованной площади: для листа 2000×1200 мм — 5 штук и около 77,7 %.
  • Ошибочные данные отклоняются с понятным сообщением, а не дают неверный чертёж.
  • Библиотека без внешних зависимостей встраивается в программное обеспечение производства.

Технологии: что и зачем

  • C++17 — быстрые вычисления и возможность встроить код в софт линии или отдельный сервис.
  • CMake — сборка библиотеки, утилиты и тестов одной командой на любой платформе.
  • CTest — запуск тестов формул, раскладки и валидации.
  • FEFCO — общий язык описания конструкций коробок между заказчиком и программой.

Статус

Версия 0.2.0 от 30.09.2026. Из прототипа на одном файле (0.1.0, февраль 2026) проект вырос в библиотеку, утилиту и тесты; толщина картона теперь реально участвует в расчёте, а ширина заготовки 0201 считается по зазору клапанов.

Что дальше по плану README: остальные типы FEFCO, включая 0427 и самосборные коробки; профили гофрокартона и направление гофры при раскладке; учёт ширины ножа; вывод развёртки в DXF или SVG; расчёт стоимости. Другие детали заказчика не раскрываются.

Вопросы по проекту

Как рассчитать размер заготовки по внутренним размерам коробки?
Задаются длина, ширина, высота коробки, толщина картона, клапан склейки и зазор клапанов. Библиотека возвращает длину и ширину заготовки, высоту клапана, площадь, наружные габариты и объёмы. Для коробки 300×200×150 мм из картона 3 мм по FEFCO 0201 заготовка выходит 1047×356 мм.
Какие стили FEFCO поддерживаются?
Три стиля каталога FEFCO: 0200 (клапаны только сверху), 0201 (стандартный ящик, клапаны встык с зазором) и 0203 (полное перекрытие клапанов). Другие типы, включая 0427 и самосборные коробки, пока не реализованы и стоят в плане.
Сколько коробок выйдет с одного листа гофрокартона?
Функция раскладки принимает заготовку и размер листа, проверяет размещение с поворотом на 90° и возвращает число заготовок и долю использованной площади. На листе 2000×1200 мм заготовка 0201 для коробки 300×200×150 укладывается 5 раз с использованием около 77,7 %.
Как учитывается толщина картона?
Толщина входит в припуски на биговку и в наружные габариты: коробка 300×200×150 из картона 3 мм снаружи получается 306×206×156 мм. Припуск на биговку принят равным толщине картона, это приближение, и его нужно сверить с оснасткой конкретного производства.
Нужен ли для расчёта сервер или таблицы?
Нет. Это обычная библиотека на C++17 без внешних зависимостей, собирается CMake и подключается к софту производства напрямую. Для ручных расчётов есть консольный калькулятор packaging_calc с теми же параметрами.
Как проверить, что расчёт верный?
В репозитории есть тесты формул, раскладки, проверки данных и разбора стиля, они запускаются через CTest. Контрольные значения для коробки 300×200×150 мм приведены в README и сверены запуском.

Нужно похожее?

Расскажите о задаче — покажем, как решали такое, и прикинем объём работ.