API de nesting
La API de nesting de CutOptim coloca piezas de forma irregular sobre chapas mediante HTTP simple. Envías los contornos —como coordenadas o como archivos DXF y SVG— y tus chapas en JSON a POST /v1/optimize/nest; la respuesta incluye la posición y la rotación de cada pieza, el número de chapas, la longitud de corte y los perforados y, si lo pides, el layout terminado en DXF y SVG.
Es el motor de nesting de forma real que usa la app CutOptim: instantáneo y determinista por defecto, con una búsqueda max asíncrona cuando un cálculo más largo puede ahorrar una chapa. Las claves son de autoservicio, los precios son públicos y POST /v1/validate/nest comprueba una petición gratis y sin clave.
Una llamada real, dibujada a partir de su respuesta
Cuatro tipos de pieza —una escuadra en L, una cartela, una placa con colisa y una brida enviada como archivo SVG— sobre una chapa con una zona de amarre que las piezas deben evitar. Abajo hay un extracto del cuerpo real; la chapa está dibujada con las coordenadas que devolvió el motor.
{
"parts": [
{ "name": "bracket", "polygon": […], "qty": 12, … },
{ "name": "gusset", "polygon": […], "qty": 14, … },
{ "name": "plate", "polygon": […], "holes": […], "qty": 12, … },
{ "name": "flange", "source": { … }, "qty": 10, … }
],
"stock": [{ "w": 2500, "h": 1250, "exclusions": […], … }],
"options": { "minSeparation": 5, "edgeClearance": 10 }
}- Tableros
- 1
- sheetCount
- Ocupación
- 56,32 %
- density
- Piezas colocadas
- 48 / 48
- placed
- Longitud de corte
- 49.463
- cutLength
- Perforaciones
- 110
- pierces
Piezas de acero cortadas por láser: tres enviadas como coordenadas, la brida como archivo SVG (source). Ninguna pieza entra en la zona de sujeción (exclusions) y todas mantienen la separación pedida (minSeparation).
Qué hace la API de nesting
- Nesting de forma real de polígonos cualesquiera con huecos interiores, encajando las piezas en los entrantes de otras — 6 chapas donde las mismas piezas por rectángulo envolvente necesitan 9.
- Piezas como coordenadas o como archivos: un documento SVG o DXF en
parts[].source, o un dibujo con muchas piezas dividido conPOST /v1/import/nest. No se guarda nada. - Rotación por pieza: una lista de ángulos permitidos en
allowedRotations, o "continuous". - Chapas rectangulares o poligonales, con zonas excluidas y de menor calidad (
stock[].exclusions), separación entre piezas (options.minSeparation) y un margen de borde aparte (options.edgeClearance). - Varios formatos de chapa con precio: el motor elige la combinación más barata y, con
options.respectStock, con existencias limitadas coloca primero las piezas obligatorias (parts[].priority). - Por material: una pieza marcada con un material solo se anida en chapas de ese material.
- Archivos de layout en la respuesta:
include:["svg","dxf"]devuelve las chapas usadas en SVG y en DXF con las capas STOCK, PARTS, HOLES y ZONES.
Al instante o a fondo: lbf y max
El motor por defecto, lbf, responde dentro de la petición HTTP y devuelve siempre el mismo layout para la misma entrada: el plan del presupuesto es el plan del pedido. Con engine: "max" el trabajo se ejecuta de forma asíncrona: recibes un id de job y consultas GET /v1/jobs/{id}, y la búsqueda dedica options.timeBudgetMs a encontrar un layout con menos chapas. Nunca devuelve nada peor que lbf e indica deterministic: false, porque una búsqueda con límite de tiempo puede variar entre ejecuciones. Un trabajo con zonas excluidas o chapas poligonales lo atiende lbf, con un aviso.
Envía coordenadas o archivos CAD
Una pieza es un contorno: un polígono en la unidad que elijas, con huecos opcionales, y cada coordenada de la respuesta vuelve en esa misma unidad. Si tus piezas están en planos, envía el plano: parts[].source acepta un documento SVG o DXF y el servidor lee el contorno y sus huecos con el mismo lector que usa la app CutOptim. Un archivo con muchas piezas pasa antes por POST /v1/import/nest, que devuelve un contorno por pieza.
Qué recibes
Cada chapa usada enumera sus piezas como una transformación rígida —name, x, y y rotation—, así que giras y desplazas tu propio contorno; nada se vuelve a aproximar. Junto al layout llegan sheetCount, density, placed y total, cutLength y pierces para estimar el tiempo de máquina, totalPrice cuando las chapas tienen precio, stockUsage por formato y unplaced para lo que no cupo, con el motivo en warnings. Con include:["svg","dxf"] los dibujos llegan en la misma respuesta.
Planes y límites
Studio cuesta 49 € al mes por 3000 peticiones y Scale 149 € al mes por 10.000 peticiones; precios sin impuestos. El límite mensual es un tope fijo por cuenta sin cargos por exceso, y la cuota restante vuelve en una cabecera de la respuesta y en GET /v1/usage. Con una clave de prueba gratuita construyes la integración antes de pagar, y POST /v1/validate/nest comprueba cualquier petición sin clave y sin gastar cuota.
Lo que (aún) no hace
Preferimos decirlo aquí que en una llamada comercial. El motor anida las piezas por su contorno exterior: no coloca piezas pequeñas dentro de los huecos de las grandes (pieza en pieza), no une las aristas compartidas en un solo corte (corte común) y no genera código G: obtienes posiciones, longitud de corte, número de perforados y archivos DXF o SVG para tu propio CAM. Es un servicio web; no hay ninguna biblioteca que instalar.
Llámala desde tu código
La misma petición pequeña en tres lenguajes: dos tipos de pieza, un formato de chapa con precio, 5 mm de separación y el layout de vuelta en SVG y DXF. Sustituye la clave por la tuya.
curl https://api.cutoptim.com/v1/optimize/nest \
-H "Authorization: Bearer co_live_…" \
-H "Content-Type: application/json" \
-d '{
"parts": [
{ "name": "bracket", "polygon": [[0,0],[300,0],[300,100],[100,100],[100,300],[0,300]], "qty": 12, "allowedRotations": [0,90,180,270] },
{ "name": "plate", "polygon": [[0,0],[240,0],[240,160],[0,160]], "holes": [[[60,65],[180,65],[180,95],[60,95]]], "qty": 8 }
],
"stock": [{ "w": 2500, "h": 1250, "price": 96 }],
"options": { "minSeparation": 5 },
"include": ["svg", "dxf"]
}'import requests
body = {
"parts": [
{ "name": "bracket", "polygon": [[0,0],[300,0],[300,100],[100,100],[100,300],[0,300]], "qty": 12, "allowedRotations": [0,90,180,270] },
{ "name": "plate", "polygon": [[0,0],[240,0],[240,160],[0,160]], "holes": [[[60,65],[180,65],[180,95],[60,95]]], "qty": 8 }
],
"stock": [{ "w": 2500, "h": 1250, "price": 96 }],
"options": { "minSeparation": 5 },
"include": ["svg", "dxf"]
}
r = requests.post("https://api.cutoptim.com/v1/optimize/nest",
headers={"Authorization": "Bearer co_live_…"}, json=body, timeout=30)
plan = r.json()
print(plan["metrics"]["sheetCount"], len(plan["sheets"]))
open("nest.dxf", "w").write(plan["dxf"])const body = {
"parts": [
{ "name": "bracket", "polygon": [[0,0],[300,0],[300,100],[100,100],[100,300],[0,300]], "qty": 12, "allowedRotations": [0,90,180,270] },
{ "name": "plate", "polygon": [[0,0],[240,0],[240,160],[0,160]], "holes": [[[60,65],[180,65],[180,95],[60,95]]], "qty": 8 }
],
"stock": [{ "w": 2500, "h": 1250, "price": 96 }],
"options": { "minSeparation": 5 },
"include": ["svg", "dxf"]
};
const r = await fetch("https://api.cutoptim.com/v1/optimize/nest", {
method: "POST",
headers: { "Authorization": "Bearer co_live_…", "Content-Type": "application/json" },
body: JSON.stringify(body),
});
const plan = await r.json();
console.log(plan.metrics.sheetCount, plan.sheets.length);Por sector
El mismo endpoint, explicado para dos oficios:
Anidado de forma real de polígonos irregulares, con zonas de exclusión.
Anidado de forma real sobre plancha para láser, plasma o chorro de agua.
Preguntas frecuentes
¿Hay una API de nesting gratuita?
POST /v1/validate/nest comprueba cualquier petición sin clave y sin cuota. El tráfico de producción va en un plan de pago con precio mensual fijo.¿Puedo enviar archivos DXF o SVG en lugar de coordenadas?
parts[].source y el servidor lee de él el contorno y los huecos. Un archivo con muchas piezas pasa por POST /v1/import/nest, que devuelve un contorno por pieza. Los archivos se procesan en memoria y no se guardan.¿La API de nesting es síncrona o asíncrona?
engine: "max" se ejecuta como trabajo en segundo plano que consultas con GET /v1/jobs/{id}; dedica options.timeBudgetMs a buscar menos chapas y nunca devuelve un layout peor que lbf.¿Admite nesting de pieza en pieza?
¿Hace corte común o genera código G?
¿Cuánto cuesta la API de nesting?
¿La misma petición devuelve siempre el mismo layout?
deterministic: false en la respuesta.