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.
{
"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 }
}- 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é avecPOST /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 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);Par secteur
Le même endpoint, expliqué pour deux métiers :
Nesting à forme réelle de polygones irréguliers, avec zones d’exclusion.
Nesting à forme réelle sur tôle pour laser, plasma ou jet d’eau.
Questions fréquentes
Existe-t-il une API d’imbrication gratuite ?
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 ?
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 ?
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 ?
Fait-elle la coupe commune ou génère-t-elle du G-code ?
Comment l’API d’imbrication est-elle facturée ?
La même requête renvoie-t-elle toujours le même plan ?
deterministic: false dans la réponse.