Aller au contenu principal
← CutOptim Engine APIAPI d’imbrication · POST /v1/optimize/nest

API d’imbrication (nesting)

L’API d’imbrication de CutOptim place des pièces de forme libre sur des tôles par simple HTTP. Vous envoyez les contours — en coordonnées ou en fichiers DXF et SVG — et vos tôles en JSON à POST /v1/optimize/nest ; la réponse donne la position et la rotation de chaque pièce, le nombre de tôles, la longueur de coupe et les amorçages et, sur demande, le plan d’imbrication terminé en DXF et SVG.

C’est le moteur d’imbrication en forme réelle de l’application CutOptim : instantané et déterministe par défaut, avec une recherche max asynchrone quand un calcul plus long peut économiser une tôle. Les clés sont en libre-service, les prix sont publics, et POST /v1/validate/nest vérifie une requête gratuitement, sans clé.

Un vrai appel, dessiné à partir de sa réponse

Quatre types de pièces — une équerre en L, un gousset, une plaque avec une lumière et une bride envoyée en fichier SVG — sur une tôle avec une zone de bridage à éviter. La requête ci-dessous est un extrait du vrai corps ; la tôle est dessinée à partir des coordonnées renvoyées par le moteur.

Requête (extrait) · 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 }
}
Réponse, dessinée depuis sheets[].parts
Panneaux
1
sheetCount
Remplissage
56,32 %
density
Pièces placées
48 / 48
placed
Longueur de coupe
49 463
cutLength
Perçages
110
pierces

Pièces acier découpées au laser : trois envoyées en coordonnées, la bride en fichier SVG (source). Chaque pièce reste hors de la zone de bridage (exclusions) et garde l'écart demandé (minSeparation).

Ce que fait l’API d’imbrication

  • Imbrication en forme réelle de polygones quelconques avec trous intérieurs, les pièces s’emboîtant dans les creux des autres — 6 tôles là où les mêmes pièces par rectangle englobant en demandent 9.
  • Pièces en coordonnées ou en fichiers : un document SVG ou DXF dans parts[].source, ou un dessin multi-pièces découpé avec POST /v1/import/nest. Rien n’est stocké.
  • Rotation par pièce : une liste d’angles autorisés dans allowedRotations, ou "continuous".
  • Tôles rectangulaires ou polygonales, avec zones exclues ou de moindre qualité (stock[].exclusions), écart entre pièces (options.minSeparation) et marge de bord distincte (options.edgeClearance).
  • Plusieurs formats de tôle avec prix : le moteur choisit la combinaison la moins chère et, avec options.respectStock, un stock limité place d’abord les pièces obligatoires (parts[].priority).
  • Selon la matière : une pièce marquée d’une matière n’est imbriquée que sur les tôles de cette matière.
  • Fichiers de plan dans la réponse : include:["svg","dxf"] renvoie les tôles utilisées en SVG et en DXF avec les calques STOCK, PARTS, HOLES et ZONES.

Instantané ou approfondi : lbf et max

Le moteur par défaut, lbf, répond dans la requête HTTP et renvoie toujours le même plan pour la même entrée : le plan du devis est celui de la commande. Avec engine: "max", le travail s’exécute en asynchrone : vous recevez un identifiant de job et interrogez GET /v1/jobs/{id}, et la recherche utilise options.timeBudgetMs pour trouver un plan sur moins de tôles. Elle ne renvoie jamais pire que lbf et signale deterministic: false, car une recherche limitée dans le temps peut varier d’une exécution à l’autre. Un travail avec zones exclues ou tôles polygonales est servi par lbf, avec un avertissement.

Envoyer des coordonnées ou des fichiers CAO

Une pièce est un contour : un polygone dans l’unité de votre choix, avec trous facultatifs, et chaque coordonnée de la réponse revient dans la même unité. Si vos pièces sont dans des dessins, envoyez le dessin : parts[].source accepte un document SVG ou DXF, et le serveur lit le contour et ses trous avec le même analyseur que l’application CutOptim. Un fichier de plusieurs pièces passe d’abord par POST /v1/import/nest, qui renvoie un contour par pièce.

Ce que vous recevez

Chaque tôle utilisée liste ses pièces sous forme de transformation rigide — name, x, y et rotation — : vous tournez et déplacez votre propre contour, rien n’est réapproximé. Avec le plan arrivent sheetCount, density, placed et total, cutLength et pierces pour estimer le temps machine, totalPrice si les tôles ont un prix, stockUsage par format, et unplaced pour ce qui n’a pas trouvé place, avec la raison dans warnings. Avec include:["svg","dxf"], les dessins arrivent dans la même réponse.

Offres et limites

Studio coûte 49 € par mois pour 3 000 requêtes, Scale 149 € par mois pour 10 000 requêtes ; prix hors taxes. La limite mensuelle est un plafond strict par compte, sans frais de dépassement, et le quota restant revient dans un en-tête de réponse et via GET /v1/usage. Une clé de test gratuite permet de construire l’intégration avant de payer, et POST /v1/validate/nest vérifie toute requête sans clé et sans consommer de quota.

Ce qu’elle ne fait pas (encore)

Nous préférons le dire ici plutôt qu’en rendez-vous commercial. Le moteur imbrique les pièces selon leur contour extérieur : il ne place pas de petites pièces dans les trous des grandes (pièce dans pièce), ne fusionne pas les arêtes communes en une seule coupe (coupe commune) et n’écrit pas de G-code — vous obtenez les positions, la longueur de coupe, le nombre d’amorçages et des fichiers DXF ou SVG pour votre propre FAO. C’est un service web ; il n’y a pas de bibliothèque à installer.

L’appeler depuis votre code

La même petite requête en trois langages : deux types de pièces, un format de tôle avec prix, 5 mm d’écart, et le plan renvoyé en SVG et DXF. Remplacez la clé par la vôtre.

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);

Par secteur

Le même endpoint, expliqué pour deux métiers :

Questions fréquentes

Existe-t-il une API d’imbrication gratuite ?
Vous pouvez construire et tester toute l’intégration gratuitement : une clé de test ne coûte rien, et POST /v1/validate/nest vérifie toute requête sans clé et sans quota. Le trafic de production passe par une offre payante à prix mensuel fixe.
Puis-je envoyer des fichiers DXF ou SVG au lieu de coordonnées ?
Oui. Placez le dessin dans parts[].source et le serveur en lit le contour et les trous. Un fichier de plusieurs pièces passe par POST /v1/import/nest, qui renvoie un contour par pièce. Les fichiers sont traités en mémoire et ne sont pas stockés.
L’API d’imbrication est-elle synchrone ou asynchrone ?
Les deux. Le moteur par défaut lbf répond dans la requête, de façon déterministe. engine: "max" s’exécute en tâche de fond que vous interrogez avec GET /v1/jobs/{id} ; il utilise options.timeBudgetMs pour chercher moins de tôles et ne renvoie jamais un plan pire que lbf.
Gère-t-elle l’imbrication pièce dans pièce ?
Pas encore. Les pièces sont imbriquées selon leur contour extérieur, donc une petite pièce n’est pas placée dans le trou d’une plus grande. C’est dans notre feuille de route ; d’ici là, la surface des grandes découpes reste vide dans le plan.
Fait-elle la coupe commune ou génère-t-elle du G-code ?
Non. La réponse donne la position et la rotation de chaque pièce, la longueur de coupe, le nombre d’amorçages et le plan en DXF ou SVG, que votre FAO ou le logiciel de la machine transforme en programme de découpe.
Comment l’API d’imbrication est-elle facturée ?
Par offre, pas par nombre de pièces : Studio coûte 49 € par mois pour 3 000 requêtes et Scale 149 € par mois pour 10 000 requêtes, hors taxes. La limite est un plafond mensuel strict par compte, sans frais de dépassement.
La même requête renvoie-t-elle toujours le même plan ?
Avec le moteur par défaut lbf, oui : la même entrée donne la même sortie, vous pouvez donc mettre en cache et comparer les résultats. La recherche max asynchrone est limitée dans le temps et l’indique par deterministic: false dans la réponse.

Benchmarks · Documentation de l’Engine API →