Документация API для расчёта раскроя листовых материалов (v3)


Структура запроса
Параметр Тип Обязательный Описание Пример Подписка
sheetWidth integer Ширина листа (мм) 2500
sheetHeight integer Высота листа (мм) 1830
trimming integer Отступ от края (мм) 10
cutType integer Алгоритм (1-4) 3
parts array Массив деталей ["600x400-3-Полка"]
wastes array Исходные остатки (отходы) — массив заготовок, доступных для повторного использования.
Каждый элемент задаётся в формате ШиринаxВысота-Количество (например, 700x400-2).
Сначала раскрой размещается на отходах, затем на новых листах.
Позволяет учесть ваши реальные остатки после предыдущих раскроев.
["800x500-1","600x300-2"]
weight float Вес материала (кг/м²) 0.75
thickness integer Толщина материала (мм) для расчета объема 16
materialCost integer Стоимость детали за кв.м. (руб) 1200
cutCost integer Стоимость реза 1 пог.м. (руб) 10
sheetCost integer Стоимость материала за кв.м. (мм) 1000
kerf integer Ширина реза (мм) 3
allowRotation boolean Разрешить поворот деталей (true/false) true
edgeCost object Стоимость кромки по типам (ключ - тип кромки, значение - стоимость за метр) {"1":10,"2":20}
dxf boolean Запросить генерацию dxf файла true
pdf boolean Запросить генерацию pdf файла true
combineSheets boolean Объединять одинаковые листы в результате.
Если true, одинаковые по своему содержимому листы будут сгруппированы в ответе как один объект с дополнительным полем count (количество таких листов). Если false или параметр не указан — каждый лист в отдельном объекте списка.
Для экспорта и статистики удобно включать, для графических визуализаций/чертежей можно отключать для полного списка.
true
damages array Зоны повреждений (брака) на листах, которые алгоритм должен обходить — детали в эти области не размещаются.
Распил пилы через зону брака разрешён (зона трактуется как препятствие только для размещения деталей, не как граница реза).
Каждый элемент массива — правило вида {"sheets": "all" | [номера листов], "zones": [{"x","y","width","height"}, ...]}.
sheets: "all" — применить ко всем листам, либо массив 1-индексированных номеров листов (например [1], [2,3]).
zones: массив прямоугольников в координатах листа (мм, от левого верхнего угла, до учёта trimming).
Несколько правил для одного листа объединяются. Если деталь не помещается — открывается следующий чистый лист.
Зоны брака возвращаются в каждом листе ответа в поле damages и не учитываются в площади отходов и КПД использования материала.
[{"sheets":"all","zones":[{"x":100,"y":100,"width":200,"height":150}]}]
Формат детали

ШиринаxВысота-Количество[-Маркировка][-КромкаСнизу;КромкаСлева;КромкаСверху;КромкаСправа]
    
Примеры:
  • Базовый:
    600x400-5-Полка
  • С кромкой:
    800x500-2-0;ПВХ;0;Алюминий
  • С кромкой и названием:
    800x500-2-Стенка-0;ПВХ1мм;0;ПВХ0,4мм
Особенности:
  • Максимум 4 кромки через точку с запятой
  • 0 - отсутствие кромки
  • Маркировка без пробелов
Структура ответа

Поле Тип Описание
status string Статус выполнения запроса (например, success).
data object Главный блок с информацией о раскрое, деталях, метриках и т.д.

Каждый объект листа содержит:

Поле Тип Описание
sheetWidth number Ширина листа (мм)
sheetHeight number Высота листа (мм)
parts array of objects Детали, размещённые на листе
waste array of objects Обрезки (отходы) на листе
metrics object Показатели использования материала на листе
cutMetrics object Данные по резам на листе
count number Количество одинаковых листов этого типа.
Присутствует только если был передан combineSheets: true.
Если поле отсутствует — данный лист в ответе один.
damages array of objects Зоны повреждений (брака), фактически применённые к этому листу. Поле возвращается, если в запросе был передан damages.
Каждый элемент: {"x","y","w","h"} — координаты зоны на листе (мм). Эти области исключены из размещения деталей и не учитываются в wasteArea.

Поле Тип Описание
xnumberКоордината X (левый верхний угол размещения на листе, мм)
ynumberКоордината Y (левый верхний угол размещения на листе, мм)
wnumberШирина детали (мм)
hnumberВысота детали (мм)
markingstringМаркировка/наименование детали
rotatedbooleanДеталь повернута (true/false)
sizeIndexnumberИндекс типоразмера детали
originalWnumberОригинальная ширина (до разворота, мм)
originalHnumberОригинальная высота (до разворота, мм)
edgeband array of string Кромка по 4 сторона
edgeband array of string Кромка по 4 сторонам [снизу, справа, сверху, слева], где "1" - есть кромка, "0" - нет кромки
edgebandInfo object Подробная информация о кромках по сторонам (тип и длина для каждой стороны)

Поле Тип Описание
xnumberКоордината X (левый верхний угол, мм)
ynumberКоордината Y (левый верхний угол, мм)
wnumberШирина обрезка (мм)
hnumberВысота обрезка (мм)
areanumberПлощадь обрезка (мм²)

Поле Тип Описание
totalPartsnumberКоличество деталей на листе
usedAreanumberИспользованная площадь (мм²)
wasteAreanumberПлощадь обрезков/отходов (мм²)
materialUsagenumberКПД использования материала, в процентах
detailsobjectСписок наименований деталей с количеством и площадями
guillotineCutsnumberКоличество гильотинных резов на листе
Структура объекта details в метриках листа:
Ключ Значение
Наименование детали
(например, "Стенка-1")
Объект с полями:
  • count: число штук
  • area: суммарная площадь (мм²)

Поле Тип Описание
perimeterCutsnumberКоличество резов по периметру
partCutsnumberКоличество внутренних резов
totalCutsnumberОбщее количество резов

Поле Тип Описание
totalSheetsnumberОбщее количество листов
materialUsagenumberОбщий процент использования материала
totalPartsnumberОбщее количество всех деталей
wasteAreanumberОбщая площадь обрезков (мм²)
usedAreanumberОбщая используемая площадь (мм²)
detailsobjectОбъект метрик по деталям (такой же, как в метриках листа)
cutMetricsobjectОбщие метрики по резам
totalPartsPerimeternumberСуммарный периметр всех деталей (мм)
totalPartsSideWidthnumberСуммарная ширина сторон всех деталей (мм)
totalPartsSideHeightnumberСуммарная высота сторон всех деталей (мм)
totalSheetsWeightnumberСуммарный вес всех листов (кг)
totalPartsWeightnumberСуммарный вес всех деталей (кг)
totalWasteWeightnumberСуммарный вес обрезков (кг)
totalSheetsVolumenumberСуммарный объём листов (м³)
totalPartsVolumenumberСуммарный объём деталей (м³)
totalWasteVolumenumberСуммарный объём обрезков (м³)
totalSheetsMaterialCostnumberОбщая стоимость листов (единицы валюты)
totalCutsCostnumberСтоимость всех резов (единицы валюты)
totalPartsWithCutsCostnumberОбщая стоимость (материал + резы)
costPerM2numberСтоимость за квадратный метр
costPerPartnumberСредняя стоимость детали
edgebandLengthobjectДлина кромок по типам
totalEdgebandCostnumberОбщая стоимость всех кромок
guillotineCutsnumberОбщее количество гильотинных резов
totalPartsMaterialCostnumberСтоимость материала для всех деталей
totalWasteMaterialCostnumberСтоимость материала в обрезках
Структура объекта edgebandLength в общих метриках:
Ключ Значение
Тип кромки
(например, "1")
Общая длина кромки данного типа (мм)
Структура объекта cutMetrics в общих метриках:
Поле Тип Описание
totalPerimeterCutsnumberОбщее количество резов по периметру всех листов
totalPartCutsnumberОбщее количество внутренних резов всех листов
totalTotalCutsnumberСуммарное количество всех резов

Объект edgebandInfo содержит подробную информацию о кромках детали по сторонам:

Ключи Значение Описание
top, bottom, left, right object Объекты, описывающие кромку по соответствующей стороне. Присутствуют только для сторон, на которых есть кромка.
Структура информации по кромке для одной стороны:
Поле Тип Описание
type string Тип кромки (идентификатор)
length number Длина кромки на данной стороне (мм)
Авторизация

Для авторизации необходимо в запросе отправлять заголовок x-api-key с ключом из личного кабинета.

Пример запроса:

curl -X POST https://dx4.ru/cut/api-v3/ \
  -H "Content-Type: application/json" \
  -H "x-api-key: ваш_ключ_api" \
  -d '{
    "sheetWidth": 1000,
    "sheetHeight": 2000,
    "trimming": 10,
    "kerf": 3,
    "cutType": 1,
    "allowRotation": true,
    "parts": ["300x400-2-Стенка-1;2;1;3"],
	"combineSheets": true,
	"wastes": ["800x400-2"],
    "weight": 15,
    "thickness": 16,
    "sheetCost": 1000,
    "cutCost": 10,
	"edgeCost": {"1":10,"2":20,"3":25,"4":30}
  }'
	  
Пример запроса на JavaScript:

fetch('https://dx4.ru/cut/api-v3/', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'x-api-key': 'ваш_ключ_api'
  },
  body: JSON.stringify({
    sheetWidth: 1000,
    sheetHeight: 2000,
    trimming: 10,
    kerf: 3,
    cutType: 1,
    allowRotation: true,
    parts: ["300x400-2-Стенка-1;2;1;3"],
	combineSheets: true,
	wastes: ["800x400-2"],
    weight: 15,
    thickness: 16,
    sheetCost: 1000,
    cutCost: 10,
	edgeCost: {"1":10,"2":20,"3":25,"4":30}
  })
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Ошибка:', error));
	  
Пример полного ответа

{
    "status": "success",
    "data": {
        "sheets": [
            {
                "sheetWidth": 1000,
                "sheetHeight": 2000,
                "parts": [
                    {
                        "x": 10,
                        "y": 10,
                        "w": 300,
                        "h": 400,
                        "marking": "Стенка-1",
                        "rotated": false,
                        "sizeIndex": 1,
                        "originalW": 300,
                        "originalH": 400,
                        "edgeband": [
                            "1",
                            "2",
                            "1",
                            "3"
                        ],
                        "edgebandInfo": {
                            "bottom": {
                                "type": "1",
                                "length": 300
                            },
                            "left": {
                                "type": "2",
                                "length": 400
                            },
                            "top": {
                                "type": "1",
                                "length": 300
                            },
                            "right": {
                                "type": "3",
                                "length": 400
                            }
                        }
                    },
                    {
                        "x": 313,
                        "y": 10,
                        "w": 300,
                        "h": 400,
                        "marking": "Стенка-2",
                        "rotated": false,
                        "sizeIndex": 1,
                        "originalW": 300,
                        "originalH": 400,
                        "edgeband": [
                            "1",
                            "2",
                            "1",
                            "3"
                        ],
                        "edgebandInfo": {
                            "bottom": {
                                "type": "1",
                                "length": 300
                            },
                            "left": {
                                "type": "2",
                                "length": 400
                            },
                            "top": {
                                "type": "1",
                                "length": 300
                            },
                            "right": {
                                "type": "3",
                                "length": 400
                            }
                        }
                    }
                ],
                "waste": [
                    {
                        "x": 10,
                        "y": 413,
                        "w": 980,
                        "h": 1577,
                        "area": 1545460
                    },
                    {
                        "x": 616,
                        "y": 10,
                        "w": 374,
                        "h": 400,
                        "area": 149600
                    }
                ],
                "metrics": {
                    "totalParts": 2,
                    "usedArea": 240000,
                    "wasteArea": 1695060,
                    "materialUsage": 12.402716194846672,
                    "details": {
                        "Стенка-1": {
                            "count": 1,
                            "area": 120000
                        },
                        "Стенка-2": {
                            "count": 1,
                            "area": 120000
                        }
                    }
                },
                "cutMetrics": {
                    "perimeterCuts": 5920,
                    "partCuts": 1400,
                    "totalCuts": 7320
                }
            }
        ],
        "metrics": {
            "totalSheets": 1,
            "materialUsage": 12.402716194846672,
            "totalParts": 2,
            "wasteArea": 1695060,
            "usedArea": 240000,
            "details": {
                "Стенка-1": {
                    "count": 1,
                    "area": 120000
                },
                "Стенка-2": {
                    "count": 1,
                    "area": 120000
                }
            },
            "cutMetrics": {
                "totalPerimeterCuts": 5920,
                "totalPartCuts": 1400,
                "totalTotalCuts": 7320
            },
            "totalPartsPerimeter": 2800,
            "totalPartsSideWidth": 1200,
            "totalPartsSideHeight": 1600,
            "totalSheetsWeight": 30,
            "totalPartsWeight": 3.6,
            "totalWasteWeight": 25.426,
            "totalSheetsVolume": 0.032,
            "totalPartsVolume": 0.00384,
            "totalWasteVolume": 0.027121,
            "totalSheetsMaterialCost": 2000,
            "totalCutsCost": 73.2,
            "totalPartsWithCutsCost": 2073.2,
			"totalEdgebandCost": 642,
			"guillotineCuts": 38,
			"totalPartsMaterialCost": 5640,
			"totalWasteMaterialCost": 2008.22
            "costPerM2": 8638.33,
            "costPerPart": 1036.6,
            "edgebandLength": {
                "1": 1200,
                "2": 800,
                "3": 800
            }
        }
    }
}
    
Обход повреждений (damages)

Параметр damages позволяет указать зоны брака на листах — области, которые алгоритм раскроя должен обходить. Детали в этих областях не размещаются. Распил пилы через зону брака разрешён — то есть зона трактуется как препятствие только для размещения деталей, а не как граница реза.

Функция доступна только на тарифах site и api. Поддерживается алгоритмами 1–4. Алгоритм 5 игнорирует переданные зоны.
Структура поля damages:
  • damages — массив правил.
  • Каждое правило содержит:
    • sheets: "all" (применить ко всем листам) либо массив 1-индексированных номеров листов, например [1], [2,3].
    • zones: массив прямоугольников {"x","y","width","height"} в миллиметрах, в координатах листа от левого верхнего угла (до учёта trimming).
  • Несколько правил для одного листа объединяются (зоны суммируются).
  • Правило "all" применяется к каждому листу дополнительно к адресным правилам.
  • Если деталь не помещается с учётом зон брака, открывается следующий чистый лист (без damages).
Пример 1. Одна зона брака на всех листах:
{
  "sheetWidth": 2500,
  "sheetHeight": 1830,
  "trimming": 10,
  "kerf": 3,
  "cutType": 3,
  "allowRotation": true,
  "parts": ["600x400-5-Полка"],
  "damages": [
    {
      "sheets": "all",
      "zones": [
        { "x": 500, "y": 300, "width": 200, "height": 150 }
      ]
    }
  ]
}
Пример 2. Адресные зоны для конкретных листов:
"damages": [
  { "sheets": [1],   "zones": [{ "x": 100, "y": 100, "width": 300, "height": 200 }] },
  { "sheets": [2,3], "zones": [{ "x": 800, "y": 50,  "width": 150, "height": 150 }] }
]
Пример 3. Комбинация "all" + адресных правил:
"damages": [
  { "sheets": "all", "zones": [{ "x": 0,   "y": 0,   "width": 100, "height": 100 }] },
  { "sheets": [2],   "zones": [{ "x": 500, "y": 500, "width": 200, "height": 200 }] }
]
Возврат в ответе

В каждом объекте листа (data.sheets[]) при использовании damages появляется поле damages — массив фактически применённых к листу зон в формате {"x","y","w","h"} (мм). Это удобно для отрисовки на фронте.

{
  "sheetWidth": 2500,
  "sheetHeight": 1830,
  "parts": [ ... ],
  "waste": [ ... ],
  "damages": [
    { "x": 500, "y": 300, "w": 200, "h": 150 }
  ],
  "metrics": { ... }
}
Учёт в метриках: площадь зон брака не попадает в wasteArea и не искажает materialUsage — КПД считается относительно полезной площади листа за вычетом зон брака.
Ошибки:
  • 403 — функция недоступна на тарифе free.
  • 400 — некорректный формат: отрицательные размеры, нечисловые координаты, пустой zones и т. п.
  • 400 — зоны брака полностью перекрывают полезную область листа.
Совместимость

Запросы без damages работают идентично прежней версии API — поведение не меняется. При combineSheets: true листы с разными зонами брака не объединяются в один.

Генерация DXF-файлов через API

Вы можете автоматически получить DXF-файл с картой раскроя прямо через API. Для этого просто добавьте параметр "dxf": true в тело запроса.
В успешном ответе API появится ссылка data.dxf_url для скачивания файла.

Пример запроса на генерацию DXF:
{
  "sheetWidth": 1000,
  "sheetHeight": 2000,
  "trimming": 10,
  "kerf": 3,
  "cutType": 1,
  "allowRotation": true,
  "parts": ["300x400-2-Стенка-1;2;1;3"],
  "dxf": true
}
Пример ответа с DXF:
{
  "status": "success",
  "data": {
    "sheets": [...],
    "metrics": {...},
    "dxf_url": "https://dx4.ru/cut/api-v3/dxf_results/dx4.ru_cut_20250805_124212_9408d18b.dxf"
  }
}
DXF-файл генерируется сервером как полная электронная карта раскроя (аналогично генерации со страницы).
Открывать файл можно в любой САПР/CAD-системе (например, Компас, AutoCAD и др.).
  • Ссылка dxf_url действительна сразу после расчёта, файл можно скачать напрямую.
  • Слои и структура соответствуют стандарту: детали (слой "0"), надписи ("TEXT"), размеры ("SIZES"), номера ("NUMBERS"), маркировки ("NAMES") и пр.
DXF-файлы хранятся на сервере ограниченный срок и могут быть удалены автоматически.
Скачайте файл сразу после получения ответа.
Генерация PDF-файлов через API

Вы можете автоматически получить PDF-файл с картой раскроя прямо через API. Для этого просто добавьте параметр "pdf": true в тело запроса.
В успешном ответе API появится ссылка data.pdf_url для скачивания файла.

Пример запроса на генерацию PDF:
{
  "sheetWidth": 1000,
  "sheetHeight": 2000,
  "trimming": 10,
  "kerf": 3,
  "cutType": 1,
  "allowRotation": true,
  "parts": ["300x400-2-Стенка-1;2;1;3"],
  "pdf": true
}
Пример ответа с PDF:
{
  "status": "success",
  "data": {
    "sheets": [...],
    "metrics": {...},
    "pdf_url": "https://dx4.ru/cut/api-v3/pdf_results/dx4.ru_cut_20250805_124212_9408d18b.pdf"
  }
}
PDF-файл генерируется сервером как карта раскроя с дополнительными полями с данными.
  • Ссылка pdf_url действительна сразу после расчёта, файл можно скачать напрямую.
PDF-файлы хранятся на сервере ограниченный срок и могут быть удалены автоматически.
Скачайте файл сразу после получения ответа.
Генерация SVG-файлов через API

Вы можете автоматически получить SVG-файл с картой раскроя через API. Для этого добавьте параметр "svg": true в тело запроса.
В успешном ответе появится ссылка data.svg_url для скачивания файла.

Пример запроса на генерацию SVG:
{
  "sheetWidth": 1000,
  "sheetHeight": 2000,
  "trimming": 10,
  "kerf": 3,
  "cutType": 1,
  "allowRotation": true,
  "parts": ["300x400-2-Стенка-1;2;1;3"],
  "svg": true
}
Пример ответа с SVG:
{
  "status": "success",
  "data": {
    "sheets": [...],
    "metrics": {...},
    "svg_url": "https://dx4.ru/cut/api-v3/svg_results/dx4.ru_cut_20250805_124212_9408d18b.svg"
  }
}
SVG-файл — векторная карта раскроя: листы, детали с подписями, размеры, обрезки и зоны брака (damages) при их наличии.
Файл масштабируется без потери качества и подходит для печати, web-просмотра и импорта в векторные редакторы (Inkscape, Illustrator, CorelDRAW и др.).
  • Ссылка svg_url действительна сразу после расчёта, файл можно скачать напрямую.
  • Если в раскрое несколько листов — все они размещаются в одном SVG-файле друг под другом, каждый с заголовком и метриками.
  • Параметр svg можно комбинировать с pdf и dxf в одном запросе — будут возвращены все три ссылки.
SVG-файлы хранятся на сервере ограниченный срок и могут быть удалены автоматически.
Скачайте файл сразу после получения ответа.
Обработка ошибок

{
  "status": "error",
  "error": {
    "code": 400,
    "message": "Неверный формат детали: 600x400-"
  }
}
    
Распространённые ошибки:
  • 400 - ошибка валидации входных данных
  • 403 - доступ запрещён
  • 429 - превышение лимитов тарифа
Лимиты использования API

Для использования API необходима действующая подписка - API доступ.
API недоступно в бесплатном режиме.

Лимиты по тарифам:
Тариф API-запросы в сутки Максимум деталей в одном запросе Максимум размеров деталей в одном запросе Максимум листов в одном раскрое
Бесплатный
С подпиской 1 000 5 000 200 500
Важно: При превышении лимитов вы получите ошибку 429 Too Many Requests.

Для увеличения лимитов свяжитесь с поддержкой.