Saltar al contenido principal
← CutOptim Engine APIAPI de nesting · POST /v1/optimize/nest

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.

Petición (extracto) · POST /v1/optimize/nest
{
  "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 }
}
Respuesta, dibujada desde sheets[].parts
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 con POST /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
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"]
  }'
Python
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"])
JavaScript
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:

Preguntas frecuentes

¿Hay una API de nesting gratuita?
Puedes construir y probar toda la integración gratis: una clave de prueba no cuesta nada y 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?
Sí. Pon el plano en 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?
Las dos cosas. El motor por defecto lbf responde dentro de la petición, de forma determinista. 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?
Todavía no. Las piezas se anidan por su contorno exterior, así que una pieza pequeña no se coloca en el hueco de otra mayor. Está en nuestra hoja de ruta; mientras tanto, el área de los recortes grandes queda vacía en el layout.
¿Hace corte común o genera código G?
No. La respuesta da la posición y la rotación de cada pieza, la longitud de corte, el número de perforados y el layout en DXF o SVG, que tu CAM o el software de la máquina convierte en un programa de corte.
¿Cuánto cuesta la API de nesting?
Por plan, no por número de piezas: Studio cuesta 49 € al mes por 3000 peticiones y Scale 149 € al mes por 10.000 peticiones, sin impuestos. El límite es un tope mensual fijo por cuenta sin cargos por exceso.
¿La misma petición devuelve siempre el mismo layout?
Con el motor por defecto lbf, sí: la misma entrada da la misma salida, así que puedes cachear y comparar resultados. La búsqueda max asíncrona tiene límite de tiempo y lo indica con deterministic: false en la respuesta.

Benchmarks · Referencia de la Engine API →