Salta al contenuto principale
← CutOptim Engine APIAPI di nesting · POST /v1/optimize/nest

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.

Richiesta (estratto) · 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 }
}
Risposta, disegnata da sheets[].parts
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 con POST /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
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);

Per settore

Lo stesso endpoint, spiegato per due mestieri:

Domande frequenti

Esiste un’API di nesting gratuita?
Puoi costruire e provare tutta l’integrazione gratis: la chiave di test non costa nulla e 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?
Sì. Metti il disegno in 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?
Entrambe. Il motore predefinito lbf risponde nella richiesta, in modo deterministico. 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?
Non ancora. I pezzi sono annidati secondo il contorno esterno, quindi un pezzo piccolo non finisce nel foro di uno più grande. È nella nostra roadmap; fino ad allora l’area dei grandi fori resta vuota nel layout.
Fa il taglio common-line o genera G-code?
No. La risposta fornisce posizione e rotazione di ogni pezzo, la lunghezza di taglio, il numero di sfondamenti e il layout in DXF o SVG, che il tuo CAM o il software della macchina trasforma in un programma di taglio.
Come viene tariffata l’API di nesting?
Per piano, non per numero di pezzi: Studio costa 49 € al mese per 3000 richieste e Scale 149 € al mese per 10.000 richieste, netti. Il limite è un tetto mensile rigido per account senza costi di eccedenza.
La stessa richiesta restituisce sempre lo stesso layout?
Con il motore predefinito lbf sì: lo stesso input dà lo stesso output, quindi puoi mettere in cache e confrontare i risultati. La ricerca max asincrona è a tempo e lo segnala con deterministic: false nella risposta.

Benchmark · Leggi il riferimento API →