Sari la conținutul principal
← CutOptim Engine APIAPI de nesting · POST /v1/optimize/nest

API de nesting

API-ul de nesting CutOptim așază piese de formă neregulată pe foi prin HTTP simplu. Trimiți contururile — ca coordonate sau ca fișiere DXF și SVG — și foile în JSON către POST /v1/optimize/nest; răspunsul conține poziția și rotația fiecărei piese, numărul de foi, lungimea de tăiere și numărul de străpungeri și, la cerere, planul final în DXF și SVG.

Este același motor de nesting după forma reală pe care îl folosește aplicația CutOptim: instantaneu și determinist implicit, cu o căutare max asincronă atunci când un calcul mai lung poate economisi o foaie. Cheile se obțin în regim self-service, prețurile sunt publice, iar POST /v1/validate/nest verifică gratuit o cerere, fără cheie.

Un apel real, desenat din răspunsul lui

Patru tipuri de piese — un colțar în L, un guseu, o placă cu gaură alungită și o flanșă trimisă ca fișier SVG — pe o foaie cu o zonă de prindere pe care piesele trebuie s-o evite. Mai jos e un extras din corpul real al cererii; foaia e desenată din coordonatele returnate de motor.

Cerere (extras) · 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ăspuns, desenat din sheets[].parts
Plăci
1
sheetCount
Umplere
56,32 %
density
Piese plasate
48 / 48
placed
Lungime de tăiere
49.463
cutLength
Străpungeri
110
pierces

Piese din oțel tăiate cu laserul: trei trimise ca coordonate, flanșa ca fișier SVG (source). Nicio piesă nu intră în zona de prindere (exclusions) și toate păstrează distanța cerută (minSeparation).

Ce face API-ul de nesting

  • Nesting după forma reală pentru poligoane oarecare cu găuri interioare; piesele intră în golurile concave ale altora — 6 foi acolo unde aceleași piese după dreptunghiul de încadrare cer 9.
  • Piese ca coordonate sau ca fișiere: un document SVG sau DXF în parts[].source, sau un desen cu multe piese împărțit cu POST /v1/import/nest. Nu se stochează nimic.
  • Rotație pe piesă: o listă de unghiuri permise în allowedRotations, sau "continuous".
  • Foi dreptunghiulare sau poligonale, cu zone excluse și de calitate inferioară (stock[].exclusions), distanță între piese (options.minSeparation) și o margine separată față de marginea foii (options.edgeClearance).
  • Mai multe formate de foaie cu preț: motorul alege combinația cea mai ieftină, iar cu options.respectStock, la stoc limitat, plasează întâi piesele obligatorii (parts[].priority).
  • În funcție de material: o piesă marcată cu un material se așază doar pe foi din același material.
  • Fișiere de plan în răspuns: include:["svg","dxf"] returnează foile folosite ca SVG și ca DXF cu straturile STOCK, PARTS, HOLES și ZONES.

Instantaneu sau temeinic: lbf și max

Motorul implicit, lbf, răspunde în cadrul cererii HTTP și returnează mereu același plan pentru aceleași date — planul din ofertă este planul din comandă. Cu engine: "max" lucrarea rulează asincron: primești un id de job și interoghezi GET /v1/jobs/{id}, iar căutarea folosește options.timeBudgetMs pentru a găsi un plan pe mai puține foi. Nu returnează niciodată ceva mai slab decât lbf și raportează deterministic: false, pentru că o căutare limitată în timp poate diferi între rulări. O lucrare cu zone excluse sau foi poligonale este servită de lbf, cu un avertisment.

Trimite coordonate sau fișiere CAD

O piesă este un contur: un poligon în unitatea pe care o alegi, cu găuri opționale, iar fiecare coordonată din răspuns revine în aceeași unitate. Dacă piesele tale sunt în desene, trimite desenul — parts[].source acceptă un document SVG sau DXF, iar serverul citește conturul și găurile cu același parser pe care îl folosește aplicația CutOptim. Un fișier cu multe piese trece mai întâi prin POST /v1/import/nest, care returnează câte un contur pe piesă.

Ce primești înapoi

Fiecare foaie folosită își listează piesele ca transformare rigidă — name, x, y și rotation — deci îți rotești și îți muți propriul contur; nimic nu este reaproximat. Lângă plan vin sheetCount, density, placed și total, cutLength și pierces pentru estimarea timpului de mașină, totalPrice când foile au preț, stockUsage pe format și unplaced pentru ce nu a încăput, cu motivul în warnings. Cu include:["svg","dxf"] desenele vin în același răspuns.

Planuri și limite

Studio costă 49 EUR pe lună pentru 3.000 cereri, Scale 149 EUR pe lună pentru 10.000 cereri; prețuri fără TVA. Limita lunară este un plafon fix pe cont, fără taxe de depășire, iar cota rămasă revine într-un antet al răspunsului și prin GET /v1/usage. Cu o cheie de test gratuită construiești integrarea înainte să plătești, iar POST /v1/validate/nest verifică orice cerere fără cheie și fără să consume cota.

Ce nu face (încă)

Preferăm să spunem asta aici decât într-o discuție de vânzare. Motorul așază piesele după conturul exterior: nu pune piese mici în găurile celor mari (piesă în piesă), nu unește muchiile comune într-o singură tăietură (tăiere pe linie comună) și nu scrie cod G — primești pozițiile, lungimea de tăiere, numărul de străpungeri și fișiere DXF sau SVG pentru propriul CAM. Este un serviciu web; nu există o bibliotecă de instalat.

Apelează-l din codul tău

Aceeași cerere mică în trei limbaje: două tipuri de piese, un format de foaie cu preț, 5 mm distanță și planul înapoi ca SVG și DXF. Înlocuiește cheia cu a ta.

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

Pe industrii

Același endpoint, explicat pentru două meserii:

Întrebări frecvente

Există un API de nesting gratuit?
Poți construi și testa toată integrarea gratuit: o cheie de test nu costă nimic, iar POST /v1/validate/nest verifică orice cerere fără cheie și fără cotă. Traficul de producție rulează pe un plan plătit cu preț lunar fix.
Pot trimite fișiere DXF sau SVG în loc de coordonate?
Da. Pune desenul în parts[].source, iar serverul citește din el conturul și găurile. Un fișier cu multe piese trece prin POST /v1/import/nest, care returnează câte un contur pe piesă. Fișierele sunt procesate în memorie și nu se stochează.
API-ul de nesting este sincron sau asincron?
Ambele. Motorul implicit lbf răspunde în cadrul cererii, determinist. engine: "max" rulează ca job în fundal, pe care îl interoghezi cu GET /v1/jobs/{id}; folosește options.timeBudgetMs pentru a căuta mai puține foi și nu returnează niciodată un plan mai slab decât lbf.
Suportă nesting piesă în piesă?
Încă nu. Piesele sunt așezate după conturul exterior, deci o piesă mică nu ajunge în gaura uneia mai mari. Este în planul nostru de dezvoltare; până atunci, suprafața decupărilor mari rămâne goală în plan.
Face tăiere pe linie comună sau generează cod G?
Nu. Răspunsul dă poziția și rotația fiecărei piese, lungimea de tăiere, numărul de străpungeri și planul în DXF sau SVG, pe care CAM-ul tău sau software-ul mașinii îl transformă într-un program de tăiere.
Cât costă API-ul de nesting?
Pe plan, nu pe număr de piese: Studio costă 49 EUR pe lună pentru 3.000 cereri, iar Scale 149 EUR pe lună pentru 10.000 cereri, fără TVA. Limita este un plafon lunar fix pe cont, fără taxe de depășire.
Aceeași cerere returnează mereu același plan?
Cu motorul implicit lbf, da — aceleași date dau același rezultat, deci poți stoca în cache și compara rezultatele. Căutarea max asincronă este limitată în timp și semnalează asta cu deterministic: false în răspuns.

Benchmarkuri · Documentația Engine API →