API di nesting
L’API di nesting di CutOptim posiziona pezzi di forma irregolare sulle lastre tramite semplice HTTP. Invii i contorni — come coordinate o come file DXF e SVG — e le lastre in JSON a POST /v1/optimize/nest; la risposta contiene posizione e rotazione di ogni pezzo, il numero di lastre, la lunghezza di taglio e gli sfondamenti e, su richiesta, il layout finito in DXF e SVG.
È il motore di nesting a forma reale usato dall’app CutOptim: istantaneo e deterministico per impostazione predefinita, con una ricerca max asincrona quando un’analisi più lunga può far risparmiare una lastra. Le chiavi sono self-service, i prezzi pubblici e POST /v1/validate/nest controlla una richiesta gratis, senza chiave.
Una chiamata reale, disegnata dalla sua risposta
Quattro tipi di pezzo — una staffa a L, un fazzoletto, una piastra con asola e una flangia inviata come file SVG — su una lastra con una zona di bloccaggio che i pezzi devono evitare. Sotto c’è un estratto del body reale; la lastra è disegnata dalle coordinate restituite dal motore.
{
"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 }
}- Pannelli
- 1
- sheetCount
- Riempimento
- 56,32%
- density
- Pezzi piazzati
- 48 / 48
- placed
- Lunghezza di taglio
- 49.463
- cutLength
- Sfondamenti
- 110
- pierces
Pezzi in acciaio tagliati al laser: tre inviati come coordinate, la flangia come file SVG (source). Ogni pezzo resta fuori dalla zona di bloccaggio (exclusions) e mantiene la distanza richiesta (minSeparation).
Cosa fa l’API di nesting
- Nesting a forma reale di poligoni qualsiasi con fori interni, incastrando i pezzi nelle rientranze degli altri — 6 lastre dove gli stessi pezzi per rettangolo d’ingombro ne richiedono 9.
- Pezzi come coordinate o come file: un documento SVG o DXF in
parts[].source, oppure un disegno con molti pezzi suddiviso conPOST /v1/import/nest. Nulla viene salvato. - Rotazione per pezzo: un elenco di angoli consentiti in
allowedRotations, oppure "continuous". - Lastre rettangolari o poligonali, con zone escluse e di qualità inferiore (
stock[].exclusions), distanza tra i pezzi (options.minSeparation) e un margine dal bordo separato (options.edgeClearance). - Più formati di lastra con prezzo: il motore sceglie la combinazione più economica e, con
options.respectStock, a scorta limitata posiziona prima i pezzi obbligatori (parts[].priority). - Attento al materiale: un pezzo con un materiale indicato viene annidato solo sulle lastre dello stesso materiale.
- File di layout nella risposta:
include:["svg","dxf"]restituisce le lastre usate in SVG e in DXF con i layer STOCK, PARTS, HOLES e ZONES.
Istantaneo o approfondito: lbf e max
Il motore predefinito, lbf, risponde all’interno della richiesta HTTP e restituisce sempre lo stesso layout per lo stesso input: il piano dietro il preventivo è il piano dietro l’ordine. Con engine: "max" il lavoro gira in modo asincrono: ricevi un id del job e interroghi GET /v1/jobs/{id}, mentre la ricerca usa options.timeBudgetMs per trovare un layout con meno lastre. Non restituisce mai nulla di peggiore di lbf e segnala deterministic: false, perché una ricerca a tempo può variare tra un’esecuzione e l’altra. Un lavoro con zone escluse o lastre poligonali è servito da lbf, con un avviso.
Coordinate o file CAD
Un pezzo è un contorno: un poligono nell’unità che scegli, con fori opzionali, e ogni coordinata della risposta torna nella stessa unità. Se i pezzi sono nei disegni, invia il disegno: parts[].source accetta un documento SVG o DXF e il server legge contorno e fori con lo stesso parser dell’app CutOptim. Un file con molti pezzi passa prima da POST /v1/import/nest, che restituisce un contorno per pezzo.
Cosa ricevi
Ogni lastra usata elenca i suoi pezzi come trasformazione rigida — name, x, y e rotation — quindi ruoti e trasli il tuo contorno; nulla viene riapprossimato. Accanto al layout arrivano sheetCount, density, placed e total, cutLength e pierces per stimare il tempo macchina, totalPrice quando le lastre hanno un prezzo, stockUsage per formato e unplaced per ciò che non è entrato, con il motivo in warnings. Con include:["svg","dxf"] i disegni arrivano nella stessa risposta.
Piani e limiti
Studio costa 49 € al mese per 3000 richieste, Scale 149 € al mese per 10.000 richieste; prezzi netti. Il limite mensile è un tetto rigido per account senza costi di eccedenza, e la quota residua torna in un header della risposta e da GET /v1/usage. Con una chiave di test gratuita costruisci l’integrazione prima di pagare, e POST /v1/validate/nest controlla qualsiasi richiesta senza chiave e senza consumare quota.
Cosa non fa (ancora)
Preferiamo dirlo qui che in una chiamata commerciale. Il motore annida i pezzi secondo il contorno esterno: non mette pezzi piccoli nei fori di quelli grandi (part-in-part), non unisce i lati in comune in un solo taglio (common-line) e non scrive G-code — ottieni posizioni, lunghezza di taglio, numero di sfondamenti e file DXF o SVG per il tuo CAM. È un servizio web; non c’è una libreria da installare.
Chiamala dal tuo codice
La stessa piccola richiesta in tre linguaggi: due tipi di pezzo, un formato di lastra con prezzo, 5 mm di distanza e il layout in SVG e DXF. Sostituisci la chiave con la tua.
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);Per settore
Lo stesso endpoint, spiegato per due mestieri:
Nesting true-shape di poligoni irregolari, con zone di esclusione.
Nesting true-shape su piastra per laser, plasma o getto d’acqua.
Domande frequenti
Esiste un’API di nesting gratuita?
POST /v1/validate/nest controlla qualsiasi richiesta senza chiave e senza quota. Il traffico in produzione usa un piano a pagamento con prezzo mensile fisso.Posso inviare file DXF o SVG invece delle coordinate?
parts[].source e il server ne legge contorno e fori. Un file con molti pezzi passa da POST /v1/import/nest, che restituisce un contorno per pezzo. I file sono elaborati in memoria e non vengono salvati.L’API di nesting è sincrona o asincrona?
engine: "max" gira come job in background che interroghi con GET /v1/jobs/{id}; usa options.timeBudgetMs per cercare meno lastre e non restituisce mai un layout peggiore di lbf.Supporta il nesting part-in-part?
Fa il taglio common-line o genera G-code?
Come viene tariffata l’API di nesting?
La stessa richiesta restituisce sempre lo stesso layout?
deterministic: false nella risposta.