Engine API
Ha csak lapot vágsz, erre az oldalra nincs szükséged. A CutOptimban futó optimalizáló már mindent megtesz, amit itt leírunk. Az Engine API ugyanaz a motor, csak képernyő nélkül — arra az esetre, ha más szoftvernek van szüksége vágástervre anélkül, hogy bárki megnyitná az appot.
Mindaz, amit a CutOptim a böngésződben végez, egyetlen számításból indul ki: adott ez a darablista és ez az alapanyag — mi a legjobb módja felszabni őket? Az Engine API pontosan ezt a számítást teszi elérhetővé az interneten, hogy egy másik program is feltehesse a kérdést, és megkapja rá a választ — böngésző nélkül, kattintás nélkül, bejelentkezett felhasználó nélkül.
Ez a teljes lényeg. Nem új optimalizáló, nem jobb optimalizáló, és nem is egy nagyobb csomag. Ugyanaz a motor, amelyet ember helyett szoftver ér el.
Nekem szól ez?
A CutOptim felhasználóinak elsöprő többségénél az őszinte válasz: nem. Ha a munkanapod abból áll, hogy megnyitod a CutOptimot, beírod a darabokat és az alapanyagot, majd kinyomtatod vagy exportálod a tervet, akkor az app maga a termék, és ez az oldal nem érint téged.
Az Engine API egyetlen helyzetre szól: a vágástervnek egy olyan szoftverben kell megjelennie, amelyet már használsz, anélkül hogy bárki felkeresné a CutOptimot. A gyakorlatban ez kétféle embert jelent:
- Már használsz olyan szoftvert, amelybe a vágásterv tartozik. Egy ERP-t, amely a megrendeléseidet tartja nyilván, egy árazó eszközt, amely a munkákat kalkulálja, vagy magának a gépnek a szoftverét. Ahelyett, hogy egy kezelő újra begépelné ugyanazt a darablistát a CutOptimba, az a program közvetlenül a motort kérdezi meg, és ott mutatja a tervet, ahol a munka egyébként is zajlik.
- Szoftvert fejlesztetsz magadnak. Házon belüli fejlesztővel, egy helyi szoftvercéggel vagy a géped beszállítójával. Az Engine API az, amihez ők csatlakoznak.
Az Engine API használata azt jelenti, hogy valaki szoftvert ír rá. Nincs hozzá felület, nincs kitöltendő táblázat, és nincs mit telepíteni — ez programoknak szóló szolgáltatás, és a munkát az végzi, aki azt a programot írja. Ha a te oldaladon senki nem ír kódot, akkor az app az, amire szükséged van.
Ha nem vagy biztos benne, melyik oldalon állsz, itt egy jó próba: megjelenhet-e a terv anélkül, hogy bárki kérné? Ha igen, akkor az API szóba jöhet. Ha mindig egy ember dönt úgy, hogy vágástervet készít, akkor az app már most is a megfelelő eszköz.
Mit ad
A szoftvered ugyanazt a két dolgot küldi be JSON formában, amit az appba is beírnál: a darabok listáját és az alapanyag listáját. A motor pedig teljes választ ad vissza:
- A teljes elrendezést. Minden darab a saját helyén, egy konkrét táblán vagy rúdon, azzal együtt, hogy el kellett-e forgatni.
- A vágástervet. Nem csak téglalapok képét: a tényleges guillotine vágási sorrendet, lépésenként, hogy a terv panelfűrészen végrehajtható legyen.
- A számokat. Hány táblát vagy rudat visz el a munka, mennyi a kihasználás százalékban, hány vágás kell hozzá, és mennyi a felhasznált anyag teljes ára. Lapoknál megkapod a kétféle őszinte vágásszámot is — a vágásvonalakat, amelyek összevonják az egy ütköző-beállításba eső vágásokat, és a fűrészeléseket, amelyek minden áthaladást számolnak —, valamint a teljes vágáshosszt.
- Opcionálisan a rajzot. Kérj
include: ["svg","csv","dxf"]értéket, és a válasz kész fájlként is viszi az elrendezést — önálló 2D SVG rajzot, R12/AC1009 DXF-et vagy CSV vágásjegyzéket —, a JSON-ba ágyazva, tárolás és második hívás nélkül. (Az SVG csak 2D.) 2D-kérésnél kérhető még alabels(darabonkénti címkeadat), aplanHash(a terv ujjlenyomata), apdf(a vágási terv PDF-je) és alabelsPdf(a címke-PDF) is — a PDF-ek base64-kódolva, ugyanazzal a kóddal rajzolva, mint az appban. - A saját azonosítóidat, visszaadva. Csatolj egy
metaobjektumot — egy cikkszámot, egy rendelés-sort, egy vevői hivatkozást — bármelyik darab- vagy alapanyag-sorhoz, és változatlanul visszakapod minden elhelyezett darabon és minden táblán vagy rúdon, így a terv egyezik a saját rendszereddel. Ezt a mezőt használd akkor is, ha az összes tábládat beküldöd, mindegyiket a saját kódoddal jelölöd meg, és vissza akarod olvasni, melyik táblát választotta az optimalizáló — tedd a kódot astock[].metamezőbe, és asheets[].metamezőn kapod vissza. Az elhelyezést soha nem befolyásolja. Azonosításra ne amaterialmezőt használd: amaterialkemény szétválasztás — egy darab kizárólag azonosmaterialértékű alapanyagból vágódik ki —, így ha minden alapanyag-sort megjelölsz vele, de a darabokat nem, akkor minden darabunmatchedstátusszal jön vissza, az eredmény pedig üres lesz.
Négy számítás van, és mind a négy az app egy-egy módjának felel meg — egy a 2D lapokra, egy az 1D lineáris anyagra (rúd, profil, cső), egy a faanyagra, amelynek keresztmetszete van, és egy a true-shape neszelésre (POST /v1/optimize/nest), amely tetszőleges poligonokat illeszt össze lézer-, plazma- és vízsugárvágáshoz. Minden optimalizáló végponthoz tartozik egy ingyenes ellenőrző végpont is, amely megoldás nélkül ellenőrzi a kérést (lásd lentebb).
Végpontok
Az alap-URL a https://api.cutoptim.com. Az optimalizáló és a usage végpont egy kulcsot visz az Authorization: Bearer <key> fejlécben; a validate és a health végponthoz nem kell kulcs.
| Végpont | Mit tesz |
|---|---|
POST /v1/optimize/2d |
2D lapoptimalizálás |
POST /v1/optimize/1d |
1D / lineáris optimalizálás — rúd, profil, cső |
POST /v1/optimize/wood |
Faanyag-optimalizálás — 1D keresztmetszet-párosítással |
POST /v1/optimize/nest |
Valódi alakú nesting — szabálytalan poligonok lézer-, plazma- és vízsugárvágáshoz |
POST /v1/validate/2d · /1d · /wood · /nest |
Kérés ellenőrzése megoldás nélkül — ingyenes, nincs kulcs, nincs kvóta |
GET /v1/jobs/{id} |
Egy aszinkron max motoros feladat lekérdezése — csak a saját feladataid, nincs kvóta |
POST /v1/import/nest |
Darab-kontúrok kiolvasása SVG- vagy DXF-fájlból — kulcs kell hozzá, kvótát nem fogyaszt |
GET /v1/usage |
A FIÓK aktuális hónapra eső felhasználása és kvótája (minden kulcs ugyanazon osztozik) |
GET /v1/health |
Életjel — nem kell hozzá kulcs |
A legtöbb hívásra közvetlenül a kész eredmény a válasz. Az egyetlen kivétel az aszinkron max motor (lásd lentebb a Három motor szakaszt): egy max beküldés egy feladatazonosítót ad vissza, amelyet a GET /v1/jobs/{id} végponttal kérdezel le, amíg a terv el nem készül.
A validate végpontok ugyanazt a törzset veszik át, mint a hozzájuk tartozó optimalizáló végpont, és a megoldás lefuttatása nélkül ellenőrzik: egy hibás kérés 400-zal tér vissza, megnevezve a pontos hibás mezőt, egy jól formázott pedig valid: true értéket ad, plusz megvalósíthatósági figyelmeztetéseket (például egy darab, amely egyetlen alapanyagba sem fér bele). Semmibe nem kerülnek, és nem kell hozzájuk kulcs, tehát az integráció fejlesztése közben — még mielőtt egyáltalán kulcsod lenne — ellenőrizheted a törzseidet, és megbizonyosodhatsz róla, hogy egy kérést nem utasítunk el, anélkül hogy elköltenél egy havi hívást.
Szálirány lapoknál
A rétegelt lemeznek és a furnérozott tábláknak szálirányuk van, és egy látszó darabot úgy kell kivágni, hogy ez a megfelelő irányba fusson. A POST /v1/optimize/2d hívásban küldj grain mezőt egy alapanyag-soron — "w" vagy "h", a lap azon oldala, amely mentén a szálirány fut —, és egy darabon is: a darab azon oldala, amely mentén a szálnak futnia kell. Minden ilyen darab úgy kerül elhelyezésre, hogy a szála a lapjának szálával párhuzamos legyen: szükség esetén 90°-kal elfordítva (rotated: true az elhelyezésen, mint bármely elforgatásnál), a rotatable mezőt pedig ilyenkor figyelmen kívül hagyja. A grain nélküli darab továbbra is szabadon forog, a grain nélküli alapanyag-soron (MDF, melamin) is; egy grain-nel megadott darab viszont ilyen soron is megtartja azt az irányt, amit a szálas sorok adnak neki — a szálas és sima lapokat a material választja szét. Ha egy darab csak a szál ellenére, 90°-kal elforgatva férne el, az unplaced a küldött méretében adja vissza, egy warnings sor megnevezi, és a POST /v1/validate/2d már hívás előtt jelzi.
Az eltérő irányba futó szálú alapanyag-sorok egy kérésben is szerepelhetnek — egy 2440 × 1220-as "w"-vel és egy 1220 × 2440-es "h"-val —, és minden lap a saját sora irányával jön vissza, a grain mezővel megismételve a sheets[] elemein. A material megadásakor a darab csak akkor kötött szálirányhoz, ha a saját anyagának van szálirányos lapja. Ha egy darab grain mezejéhez nincs szálirányos alapanyag a kérésben, annak nincs hatása, és a warnings egy sora ezt jelzi. Az options.trim és a kényszerített options.firstCut minden lapra a saját sora irányában érvényes, a szálirány szerint másfelé futó soron is. A CutOptim app Szálirány módja ugyanezt a kódot futtatja. (2026-10-02 óta.)
Erezet egyeztetés lapoknál (szettek)
A szálirány minden darab szálát a megfelelő irányba állítja. Egyes frontoknak ennél több kell: egy két ajtó fölötti fiókelőlap, amelynek mintázata átfut az egyikből a másikba, mintha a három még mindig egyetlen tábla lenne. A POST /v1/optimize/2d hívásban adj ezeknek a darab-soroknak egy id mezőt, és nevezd meg őket a matchedSets listában:
{
"parts": [
{ "id": "DF", "name": "Drawer front", "w": 48.125, "h": 6 },
{ "id": "DOOR", "name": "Door", "w": 24, "h": 30, "qty": 2 },
{ "name": "Shelf", "w": 22.5, "h": 11.25, "qty": 4 }
],
"stock": [{ "w": 96, "h": 48, "qty": 2, "grain": "w" }],
"options": { "kerf": 0.125 },
"matchedSets": [
{ "id": "base-1", "name": "Base cabinet fronts", "grain": "w",
"layout": { "dir": "rows", "lines": [["DF"], ["DOOR", "DOOR"]] } }
]
}
- Mi az a szett. A
layout.linesa tagokat aparts[].idszerint sorolja fel. Adir: "rows"esetén minden sor egymás mellett álló tagok sora, a sorok fentről lefelé egymás alatt állnak, így a[["DF"], ["DOOR", "DOOR"]]egy fiókelőlap két ajtó fölött; a"cols"esetén minden sor egy oszlop, az oszlopok egymás mellett állnak. Egy darab egy szettben többször is szerepelhet (Door, Door), de csak egyetlen szetthez tartozhat. Aqty(alapérték 1) azt adja meg, hány példány kell — három egyforma szekrényqty: 3—, a darabok sajátqtyértékének pedig minden példányt fedeznie kell. Egy szettnek legalább 2 és legfeljebb 24 tagja van, egy kérés legfeljebb 50 szettet fogad. - Hogyan vágódik. A szett egyetlen téglalapként — a blokkként — megy át az optimalizálón, és a tagjaiként jön vissza, pontosan egy fűrészrésnyi távolságra, egyetlen darab lapból. A szett
grainértéke ("w"vagy"h", a blokk szélessége vagy magassága mentén) dönt minden tag irányáról; a tag sajátgrainértékét a szetten belül nem használja, és egy figyelmeztetés megnevezi azt a tagot, amelyet felülír. Szett-grainnélkül a blokk elfordulhat, ha minden tagrotatable. AzinstallGapa tagok közti hézag a szekrényen (alapérték: a fűrészrés); a lapon továbbra is egy fűrészrésnyire vannak egymástól. - Mi jön vissza. Minden elhelyezett tag viseli a
matchedSetmezőt: a szettidértékét, hogy melyikinstance, és apositionértékét a szekrényelőlapon olvasási sorrendben — fentről lefelé, balról jobbra, 1-től —, plusz egyhintmezőt, például"left"vagy"right", ahol ez egyértelmű. A válasz kap egymatchedSetsösszesítést, szettenként egy elemmel: aletter(A, B … a kérés sorrendjében), hány példányt vágtak egy blokkban (asBlock), darabonként vagy hagytak elhelyezetlenül, a blokk mérete és a szettwarningssorai. Ha egy blokk egyik alapanyag-lapra sem fér, azonMiss: "split"(az alapérték) figyelmeztetéssel egyenként helyezi el a tagokat, azonMiss: "unplaced"pedig azunplacedlistában sorolja fel őket. - Figyelmeztetések, nem hibák. Az az eltérés, amelynél a méretek nem illeszkednek, a szett figyelmeztetése, nem elutasítás. Minden sor a kódjával kezdődik —
align:(a vonalak nem egy síkban vannak),gap:(a fűrészrés szélesebb azinstallGapértékénél),grain:,split:,unplaced:,unmatched:(nincs a szett anyagából készlet),priority:ésgrainGroup:—, azalignés agappedig az egységed 1/64-e vagy a fűrészrés negyede szerint ítélődik meg, amelyik kisebb. Az a szett, amelyet egyáltalán nem lehet kirakni — egy olyan tag-azonosító, amelyet egyetlen darab sem visel, egy hivatkozott azonosító két darabon, kettőnél kevesebb tag, aqty-hez túl kevés darab —,400, amely megnevezi a pontos mezőt, még a hívás terhelése előtt. - A
parts[].idbiztonságosan küldhető. Csak az az azonosító ellenőrzött, amelyre egy szett hivatkozik (egy nem üres, nyomtatható karakterekből álló, legfeljebb 64 karakteres szöveg, vagy egy egész szám, pontosan egy darabon). Minden más azonosítót figyelmen kívül hagy, bármi áll benne, így az ERP-cikkszámaid ott maradhatnak a sorokon. És a szettek nélküli kérésnél semmi nem változik: csak a nem üresmatchedSetstömb kapcsolja be a funkciót — a hiányzó, anull, az[]vagy bármely nem tömb értékre pontosan úgy válaszol, mint eddig. - Exportok. Szettekkel a
csvkapSetésPositionoszlopot a végén, azsvgkiírja a pozíciókódot (A1, A2 …) a darabfeliratokra, és minden szett keretét egy különmatched-setscsoportba rajzolja — azoptions.setOutlines: falsekihagyja ezt a csoportot —, adxfpedig a pozíciókódot a LABELS rétegen viszi. Apdfés alabelsPdfnem jelöli a szetteket: a tagokat közönséges darabokként rajzolják, és ezt awarningsjelzi; a szett-jelölések asheets[].parts[].matchedSetmezőben, acsv-ben és azsvg-ben vannak. - Motorok és végpontok. A
heuristicés abalancedmotor rakja ki a szetteket (abalancednem rangsorolja apriorityértéket, ígyrespectStockmellett egy szett elveszítheti a helyét,priority:figyelmeztetéssel). Amaxmotor a nem üresmatchedSetslistát400-zal utasítja el, amelynekdetails.unsupportedmezője megnevezi, még a hívás terhelése előtt; az üres lista egy közönségesmaxfeladat. AmatchedSetsés aparts[].idcsak 2D-ben él: az 1D, a fa és a nest végpont figyelmen kívül hagyja őket. - A
grainGroupelavult. Továbbra is elfogadott, és pontosan úgy működik, mint eddig: az azonos csoportba tartozó darabok egy lapon maradnak. Egymás mellé sosem rakta őket, ezért nem ad folytonos szálat köztük — ahhoz használd amatchedSets-et.
A CutOptim app Erezet egyeztetése ugyanezzel a maggal rakja ki a szetteket.
Miért van a fának saját végpontja
A lineáris anyag egy dimenziót ismer, a hosszt, tehát bármelyik rúd bármelyik darabot adhatja. A faanyagnál ez nem így van: egy 50×150-es darab nem jöhet ki egy 50×100-as rúdból, akármennyi hossz marad is rajta. A fa-végpont ezért minden darabnál és minden készlet-sornál átveszi a keresztmetszet mindkét oldalát, keresztmetszetenként szétválasztja a munkát, minden szekcióhoz a saját készletét párosítja, és a szekciókat külön adja vissza — mindegyiket a saját rúdjaival és a saját összesítésével, a teljes munka számai mellett.
Két részlet, amit érdemes tudni az integrálás előtt:
-
A keresztmetszet két oldala tetszőleges sorrendben küldhető. Az 50×100 és a 100×50 ugyanaz a gerenda megfordítva, és egy szekcióba kerül. Így az, hogy az adataid éppen hogyan lettek felvéve, nem tüntethet el alapanyagot.
-
A „nincs ilyen keresztmetszetű készlet” és a „nem fért el” külön jelenik meg. Az első hiányzó anyag, a második kapacitás-probléma, és másképp kell javítani — egy listába keverve rossz helyre küldenék a felhasználódat.
Ezt közelíthetnéd több saját 1d hívással is, ha magad csoportosítod a darabokat. Az keresztmetszetenként egy kérésbe kerülne a kvótádból egy helyett az egész munkára, a készlet-párosítást a te kódodba tolná, és olyan összesítést adna, amit magadnak kellene összeraknod — és ami nem feltétlenül egyezne azzal, amit a CutOptim app mutat ugyanarra a munkára.
Darabok CAD-fájlból
A nesting végpont nem csak koordinátákat fogad. Egy darab source mezőt is vihet helyettük — egy SVG- vagy DXF-dokumentumot —, és a szerver ebből olvassa ki a kontúrt és a benne lévő lyukakat. Ugyanaz a beolvasó, amit az alkalmazás használ, amikor a Nesting módjára ejtesz egy rajzot, tehát egy CAD-fájlokban már meglévő darab-könyvtárat nem kell előbb koordináta-listákká alakítani.
A fájl csak a geometriát váltja ki. A darabszám, az anyag, az engedélyezett forgatások és a saját metaadatod ugyanolyan mezők maradnak a darab során, mint amikor koordinátákat küldesz. Egy fájl egy darabot ír le; ha egyetlen rajz több különálló alkatrészt tartalmaz, a POST /v1/import/nest előbb kész darab-sorokra bontja — és ez a hívás kulcsot igényel, de nem fogyaszt kérést a havi keretedből.
Semmi nem tárolódik. A fájl kizárólag magaként a kérésként létezik: a memóriában olvassuk be, és mire a válasz megíródik, megszűnik. Nem marad másolat lemezen vagy adatbázisban, nem kerül naplóba, és utólag nincs mit törölni. A mértékegységgel ugyanígy bánunk — egy DXF deklarálhat millimétert vagy hüvelyket, és mi jelentjük, amit mondott, de a koordinátákat sosem váltjuk át, mert ebben az API-ban egyetlen érték sem hordoz mértékegységet.
Mindig ugyanaz a válasz
A motor determinisztikus: ugyanaz a bemenet mindig ugyanazt a kimenetet adja. Nincs véletlenszerűség, és nincs óra az algoritmusban.
Ez elméletinek hangzik, de éppen ez a gyakorlati oka annak, hogy érdemes rá építeni. Azt jelenti, hogy az eredmények cache-elhetők — ha ugyanerre a munkára már rákérdeztél, biztonsággal újrahasználhatod a választ ahelyett, hogy megint megkérdeznéd. Azt is jelenti, hogy az integráció tesztelhető: egy terv összehasonlítható egy ismerten helyes eredménnyel, és ha eltérés van, az valódi eltérés, nem zaj. Az a szoftver, amely hétfőn árat ad a vevőnek, pénteken is ugyanazt az árat fogja adni.
Van egy opt-in kivétel, és ezt a válasz ki is mondja: a nesting max motorja (lentebb) fix időkeretet fordít keresésre, tehát hogy meddig jut, attól függ, mennyi munka fér bele ebbe az időbe. A válaszai deterministic: false értéket visznek. Minden más motor — a nesting alapértelmezettjét, az lbf-et is beleértve — determinisztikus.
Biztonságos újrapróbálás. Ha megszakad a kapcsolat, nem tudni, megérkezett-e a kérés. Küldjön Idempotency-Key fejlécet — egy munkánként választott értéket —, és ugyanazzal a kulccsal próbálja újra: 24 órán belül ugyanaz a kérés a tárolt választ adja vissza Idempotency-Replayed: true jelöléssel, és nem számít második hívásnak. Egy max job sem kerül kétszer sorba. A nyilvános demókulcs ezt a fejlécet figyelmen kívül hagyja. (2026-10-15 óta.)
Webhookok az async jobokhoz. A GET /v1/jobs/{id} pollozása helyett regisztrálj egy végpontot (https:// URL) a vezérlőpulton, és aláírt POST-ot kapsz — job.succeeded vagy job.failed —, amikor egy async max job befejeződik. Ellenőrizd a CutOptim-Signature fejlécet a kapott titokkal, válaszolj 10 másodpercen belül, a tervet pedig a GET /v1/jobs/{id} adja. A sikertelen kézbesítést újrapróbáljuk: 8 próba 24 óra alatt. (2026-10-19 óta.)
Hivatalos SDK-k. Nyílt forráskódú kliensek TypeScripthez, Pythonhoz és PHP-hoz — npm install @cutoptim/engine, pip install cutoptim, composer require cutoptim/engine — típusos kérésekkel, újrapróbálással, amit sosem számolunk fel kétszer (minden hívás Idempotency-Key-t visz), várakozó segédfüggvénnyel az async jobokhoz és webhook-ellenőrzéssel. A forrás a GitHubon; részletek az SDK-útmutatóban (angolul).
MCP-szerver AI-asszisztensekhez. A Claude Code, a Cursor, a VS Code és a Claude Desktop eszközként hívhatja a motort a https://api.cutoptim.com/mcp címen futó Model Context Protocol-szerveren át, ugyanazzal az API-kulccsal (Authorization: Bearer …) és ugyanabból a kvótából: egy eszközhívás egy API-hívás, a validate_* eszközök ingyenesek. Helyben is futtatható a npx -y @cutoptim/mcp csomaggal (kulcs a CUTOPTIM_API_KEY változóban), a hivatalos MCP Registryben pedig io.github.cutoptim/engine néven szerepel. A kliensbeállítások az MCP-útmutatóban vannak (angolul).
Három motor
Az API motorválasztást kínál. Az első kettő szinkron módon fut; a harmadik aszinkron. A különbség nem minőségi kérdés: kompromisszum a sebesség, aközött, hogy az eredmény felszabható-e panelfűrészen, és aközött, hogy mennyire közelíti meg az elméleti minimumot.
- A
heuristicaz alapértelmezett, és ugyanaz, amit az app is használ. Guillotine elrendezéseket ad: legjobb kihasználás, minden elrendezés fűrésszel vágható, és mindig teljes vágásterv. Szinkron. - A
balancedkülön kérésre kapcsol be. Helyette szabad beágyazást használ, ami nagy munkákon jóval gyorsabb — 2000 darabos munkán mérve körülbelül 25× — kissé rosszabb kihasználás árán. A fontos csavar: az elrendezései gyakran nem vághatók éltől élig, ezért azoknál egyáltalán nem ad vágástervet. Szinkron. - A
maxkülön kérésre kapcsol be, 2D lapokhoz (és külön, a true-shape nestinghez is — lásd lentebb). 2D-n szerver-oldali fakeresés, amely az alapértelmezettnél jóval több munkán éri el a bizonyított optimumot, és az elrendezései továbbra is guillotine-vághatók. Az ára az idő: egymaxszámítás másodpercektől egy percig tart, ezért nem a válaszban felel. Helyette aPOST /v1/optimize/2dazengine: "max"értékkel egy feladatazonosítót ad vissza, amelyet aGET /v1/jobs/{id}végponttal kérdezel le, amíg el nem készül. Továbbra is determinisztikus. Akkor nyúlj hozzá, ha egy nagy, értékes munkánál megéri várni az utolsó néhány tábláért. Egyetlen készlet-formátumot modellez, teljes lapméreten, korlátlan darabszámmal, ezért ha a kérés ezen felül második készlet-formátumot, oldalankéntitrim-et, korlátozott készletet (respectStock), anyagot, szálirány-csoportot vagy nem üresmatchedSetslistát is visz, azt előre elutasítja egy400-zal, ami pontosan megnevezi, mit nem tud — még mielőtt a hívás terhelődne. Az ilyen munkákat küldd aheuristicmotornak, az mindegyiket kezeli.
Nesting: lbf és max
A true-shape nestingnek saját két motorja van. Az lbf az alapértelmezett: azonnali, szinkron és determinisztikus. A max külön kérésre kapcsol be, és aszinkron, pontosan úgy, mint a 2D max — a POST /v1/optimize/nest az engine: "max" értékkel egy feladatazonosítót ad vissza, amelyet a GET /v1/jobs/{id} végponttal kérdezel le.
A nesting max előbb lefuttatja az lbf lépést, tehát mindig van kéznél egy érvényes válasz. Ezután egy időkeretet (options.timeBudgetMs, alapértelmezésben 60 másodperc, 10 és 180 között) fordít arra, hogy kevesebb táblát igénylő elrendezést keressen, egyszerre egy táblát töltve fel. Sosem ad vissza több táblát, mint az lbf: ha a keresés nem talál jobbat, az lbf elrendezést kapod, egy ezt kimondó figyelmeztetéssel. Mivel a keresés időkorlátos, a válaszai deterministic: false értéket visznek. Elfogad több lapméretet is anyagonként, valamint a respectStock beállítást, és ugyanazzal a szabállyal rangsorolja az eredményét, mint az lbf (lentebb): csak akkor cseréli le az lbf tervet, ha az jobb — sosem csupán azért, mert kevesebb táblát tartalmaz. A poligon alakú táblát vagy a kizárási zónákat, amelyeket a sáv-keresése nem tud modellezni, a munkán belül az lbf lépés szolgálja ki, figyelmeztetéssel — sosem utasítja el. A régebbi sparrow nevet a rendszer a max aliasaként elfogadja.
A téglalap alakú darabok egzakt rácsot kapnak (2026-09-28 óta). Az lbf mintavételezéssel keresi a pozíciókat, ami szinte sosem talál rá egy hézag nélküli rácsra: három 500 mm-es darab egy 1500 mm-es tábla szélességében, nulla távolsággal pontosan elfér, a mintavételező keresés viszont kettőt helyez el. Ezért mindkét motor két alternatívát is kipróbál, és ugyanazzal a szabállyal a legjobban rangsorolót tartja meg: a darabokat a megengedett derékszögekre korlátozva, illetve a darabok befoglaló téglalapjait egy egzakt téglalap-pakolóval elrendezve (az egymást nem fedő téglalapok nem tartalmazhatnak egymást fedő darabokat, tehát ez bármilyen körvonalra érvényes). Döntetlennél — azonos táblák, azonos lapterület — az a terv nyer, amelyik elölről hátrafelé tölti ki a tábláit, azután az, amelyikben kevesebb darab tér el a derékszögektől. Semmit nem kell bekapcsolni, és a rangsor szerint az eredmény csak jobb lehet; ha a téglalapok egy tervet arra a legkisebb táblaszámra hoznak le, amit a darabok területe megenged, a max is azonnal válaszol, keresés helyett.
Egy néhány tucat darabos munkához általában elég körülbelül 15 másodperc időkeret (timeBudgetMs: 15000); a munka nagyjából egy-két másodperccel az időkeret után készül el, plusz amennyi ideig a sorban várakozott. Kérdezd le a GET /v1/jobs/{id} végpontot két-három másodpercenként — a lekérdezés nem fogyaszt kvótát. Egyetlen időkeret sem ígérhet konkrét táblaszámot.
Nesting: a tábla szélén tartott távolság, lapméretek és tábla-költségek
- A tábla szélén tartott távolság. Az
options.minSeparationa darabok közti távolság, és önmagában a tábla szélén is ezt alkalmazza. Azoptions.edgeClearancea szélt külön állítja be — például 5 a darabok közt, és 0 vagy 10 a szélen. Ha kihagyod, a szél változatlanul aminSeparationértéket tartja, pontosan úgy, mint eddig. Mindkét motoron működik, téglalap alakú táblát igényel (wésh), és a kizárási zónák aminSeparationértéket tartják, mint a darabok. Egy poligon alakú táblát, vagy olyan értéket, amely nem hagy helyet a táblán, a rendszer 400-zal elutasít, még mielőtt a hívás terhelődne. - Lapméret választása. Ha egy anyaghoz két vagy több alapanyag-sor tartozik, az
lbfkipróbálja őket a beírt sorrendedben, majd egyenként a méreteket, valamint egy legolcsóbb-elöl sorrendben is, és a legjobbat tartja meg — így az eredmény már nem függ attól, milyen sorrendben írod be a sorokat. A rangsor: a legtöbb elhelyezett kötelezően kivágandó darab (lásd lentebb), majd a legtöbb elhelyezett darab, majd a legkisebb összes lap-terület (anyag), majd a legkevesebb tábla. Azoptions.minimizeCostmellett helyette a legkisebb összes ár szerint rangsorol (price, vagycostegy ár nélküli sornál) — de csak akkor, ha az adott anyag minden sorának van ára; különben visszaesik a területre, és ezt awarningsmezőben ki is mondja. - Méretek keverése. Ezután minden táblát — a legkevésbé kitöltöttel kezdve — egyenként újraneszel az olcsóbb vagy kisebb sorokra, és lecseréli, ha attól a teljes terv jobban rangsorol. Így a méretek keveredhetnek egy anyagon belül: jellemzően két nagy tábla és egy kisebb utolsó, ott, ahol a félig üres utolsó tábla korábban egy nagy volt. Az
options.respectStockmellett egyetlen sor sem használódik aqtyértékénél többször. Amaxmotor ugyanezt a rangsort alkalmazza. - Kötelezően kivágandó darabok. A
parts[].priority: trueegy kötelezően kivágandó darabot jelöl. Azoptions.respectStockmellett számít — egy korlátozott készletnél, ahol nem biztos, hogy minden darab elfér —: a kötelezően kivágandó darabok ilyenkor elsőként kerülnek elhelyezésre, így egy sima darab sosem foglalja el azt a helyet a táblán, amire egy kötelezően kivágandó darabnak szüksége van, és a fenti rangsor azt a tervet helyezi előrébb, amelyik többet tart meg belőlük, még akkor is, ha összesen kevesebb darabot helyez el. Mindkét motor tiszteletben tartja (amaxmegtartja azlbfelrendezést, amikor bármi kimarad elhelyezetlenül). ArespectStocknélkül minden ráférő darab úgyis elhelyeződik, tehát a jelző semmit nem változtat. Egy kötelezően kivágandó darab, amely egyáltalán egyik táblára sem fér rá, továbbra is azunplacedlistában szerepel. (2026-09-22 óta — előtte a nesting motor elfogadta a mezőt, de figyelmen kívül hagyta.) - Korlátozott készlet, amelyre nem fér fel minden.
options.respectStockmellett, ha a terv még darabot hagy ki, a motor a darabok befoglaló téglalapjaival laponként is feltölti a lapokat — mindegyiket annyira, amennyire lehet, és az a darab, amely csak egy lapméretre fér, oda kerül először (a magas oldallap az egyetlen nagy lapra, nem egy maradék-csíkra). Ezt a tervet csak akkor veszi át, ha több darabot helyez el (a kötelezőket előre) vagy kevesebb anyagot használ; amelyik munkán minden elfér, az pontosan úgy jön vissza, mint eddig. Betartja a darabok megengedett forgatásait, aminSeparation-t és azedgeClearance-t. (2026-10-14 óta.) - Mennyibe kerültek az egyes táblák. Minden tábla viszi a
stockmezőt — a kérés azon alapanyag-sorának indexét, amelyből kivágták —, és a válasz kiegészül astockUsagemezővel: egy bejegyzés minden felhasznált alapanyag-soronként, a táblaszámával, összárával és sűrűségével. Az egység az alapanyag-sor, nem a méret: két azonos méretű, de eltérő árú vagymeta-jú sor két bejegyzést jelent. - Vágáshossz és beszúrások. Minden tábla viszi a
cutLengthmezőt — az elhelyezett darabok körvonalainak és lyukainak összegzett kerülete, a te mértékegységedben —, valamint apiercesmezőt, egy beszúrást minden zárt kontúrra; ametricsösszesíti mindkettőt. Ez a geometriai kontúrhossz: nincs benne közös vonalú vágás, be-/kivezetés vagy mikro-híd — ezeket a saját CAM szoftvered adja hozzá. - Felhasznált terület, a tábla egy részének leszámlázásához. Minden tábla viszi a
usedWidthés ausedHeightmezőt — a legtávolabbi pont, ameddig bármelyik elhelyezett darab elér a tábla origó-sarkától, a te mértékegységedben, a valós táblán (edgeClearancemellett a szélhagyás is beleszámít) —, valamint ausedAreamezőt, a szorzatukat; astockUsage[].usedAreaalapanyag-soronként összesíti. Ez az a szám, amire egy ERP-nek szüksége van, ha egy vízszintes vágást (usedHeight× a tábla szélessége), egy függőleges vágást (usedWidth× a tábla magassága) vagy a befoglaló téglalapot (usedArea) akarja leszámlázni a teljes tábla helyett — a számlázási szabály a tiéd marad. Hogy ezek a számok kicsik legyenek, mindkét motor alapértelmezésben tömöríti minden anyag legkevésbé kitöltött tábláját: a darabjait ugyanarra a táblára újraneszeli, az elforgatásnak azzal a részhalmazával, amit az adott darab megenged — 0/180, 0/90/180/270, és egyetlen tájolás minden példányra, egy diszkrétallowedRotations-szel metszve, sosem egy új szöggel —, és azt az elrendezést tartja meg, amelynek a legkisebb a felhasznált területe.engine: "max"esetén ezt a táblát utána maga a keresés is újrarakja — a tábla magassága mentén, egytáblás tervnél a szélessége mentén is —, és ugyanazon szabály szerint a szorosabb elrendezést tartja meg. A táblaszám, a méretek, az ár és az elhelyezett darabok sosem változnak; azoptions.compact: falsea tömörítetlen elrendezést adja vissza. Ha egy sávot számlázol a befoglaló téglalap helyett, állítsd be azoptions.compactFormezőt ennek megfelelően: a"horizontal"a legkisebbusedHeightértékű elrendezést tartja meg (egy sáv a tábla teljes szélességén át), a"vertical"a legkisebbusedWidthértékűt (egy sáv a tábla teljes magasságán át); az alapértelmezett"box"a legkisebbusedArea-t tartja meg. A sáv-módok minden példányt negyedfordulattal (90° vagy 270°) elforgatva is kipróbálnak, ahol azallowedRotationsmegengedi. Az, hogy mennyire kicsi lesz a felhasznált terület, a daraboktól függ. (2026-09-22 óta.)
A balanced nem „jobb eredményt” jelent. Gyorsabb, és kicsit rosszabb a kihasználása; ha pedig az elrendezése nem guillotine-vágható, akkor nincs vágásterv, amit a fűrész kezelőjének át lehetne adni. Csak akkor válaszd, ha egy nagyon nagy munkán a sebesség többet ér, mint egy fűrészre kész terv. Ha bizonytalan vagy, maradj az alapértelmezettnél.
Korlátok
Minden kérésnek van felső határa, így egy elszaladó munka világosan elbukik, nem pedig lefagy:
| Korlát | Érték |
|---|---|
| Darab kérésenként | 2000 |
| Alapanyag-sor kérésenként | 50 |
| A kéréstörzs mérete | 1 MB |
| Kérés-törzs mérete — a rajzot hordozó nest-utakon | 10 MB |
| Aktív kulcs fiókonként | 10 |
Kulcs nélküli validate hívás címenként |
120 / perc |
| Ismeretlen API-kulcs címenként | 30 / perc — utána 429 a perc hátralevő részére |
| Várakozás szabad számítási helyre (szinkron utak) | kb. 8 s — utána 429, nem terheli a keretet |
Egyszerre queued/running max job fiókonként |
5 |
Nesting max keresési időkeret feladatonként |
10–180 s (alapértelmezés 60 s) |
Idempotency-Key megőrzése |
24 óra |
| Webhook-végpontok fiókonként | 5 |
| Webhook-kézbesítési próbák | 8, 24 óra alatt |
Hogyan kapok hozzáférést
Kezdd az Engine API oldalon. Az Engine API az app csomagjaitól külön számlázódik, és nincs olyan csomagváltás, amely bekapcsolná.
- Próbáld ki, aztán fizess elő — vagy kérdezz. Fizetés előtt is hívhatod az API-t: az API-referencia Példa futtatása gombjai egy nyilvános demókulcsot használnak, fiók nélkül, és minden bejelentkezett fiók készíthet ingyenes teszt-kulcsot az irányítópulton (saját, kis havi keret, soha nem számlázódik, előfizetés nem kell hozzá). Ha készen állsz, az Engine API oldalon történő előfizetés a leggyorsabb út — a belépő csomag, a Studio ingyenes próbaidővel indul, és a hozzáférés magától felkerül a fiókodra. Ha inkább előbb leírnád az integrációdat, vagy a standard csomagnál nagyobb mennyiség kell, vedd fel velünk a kapcsolatot, és írd le, mit szeretnél összekötni, és körülbelül hány vágástervre lesz szüksége havonta.
- A hozzáférés felkerül a fiókodra. A fiókodon semmi más nem változik.
- Készíts kulcsot. Az API-kulcsok kártya minden bejelentkezett fiók irányítópultján ott van: előfizetés nélkül teszt-kulcsokat készít, API-hozzáféréssel éles kulcsokat is. A kulcsokat ott magad készíted el, nevezed el és törlöd.
- Másold ki a kulcsot azonnal. A teljes kulcsot pontosan egyszer mutatjuk meg: a létrehozás pillanatában.
A kulcsot csak egyszer mutatjuk meg. A CutOptim csak egy sha256 lenyomatot tárol róla, magát a kulcsot soha — így később sem lehet visszaolvasni, sem neked, sem nekünk. Létrehozáskor másold be egyenesen a szoftvered konfigurációjába. Ha elveszítesz egy kulcsot, töröld, és készíts újat; ha egy kulcs illetéktelen kezébe kerül, töröld, és a vele indított hívások azonnal leállnak.
A kulcsot kezeld úgy, mint egy jelszót: a szoftvered konfigurációjában van a helye, nem e-mailben, táblázatban vagy képernyőképen.
Mit csinál az API-kulcsok kártya az irányítópultodon
Négy vezérlő — és érdemes pontosan kimondani, melyik mit változtat, különösen az utolsót, amiről sokan azt hiszik, a számlázáshoz nyúl. Nem nyúl.
- Csomag, Váltás és Számlázás. A Csomag sor megmutatja, melyik csomagon van a fiók (Studio vagy Scale). A Váltás: Scale (vagy Váltás: Studio) gomb megerősítés után megváltoztatja a csomagot, és a fiók havi kvótája azonnal módosul. A Számlázás megnyitja a számlázási beállításaidat, ahol kártyát cserélhetsz, számlákat nézhetsz meg vagy lemondhatod az előfizetést.
- Kulcs létrehozása. Létrehoz egy új kulcsot, és egyetlen egyszer meg is mutatja, ott helyben. A név (
ERP-integráció,staging) kizárólag arra való, hogy később meg tudd különböztetni a kulcsaidat. Fiókonként legfeljebb 10 aktív kulcs. A teszt-kulcsokat ugyanígy készíted, és külön számolódnak: saját, kis havi keretük van, és soha nem számlázódnak. - A használati sáv. Két szám: a fiókod havi összesített felhasználása a kvótához mérve, és kulcsonként az, hogy az a kulcs mennyit fogyasztott. A kulcsonkénti szám arra válaszol, hogy melyik integráció eszi a keretet — nem külön költségvetés.
- Visszavonás. A következő hívástól kezdve leállítja azt az egy kulcsot. A sor látható marad, hogy az előzménye ne vesszen el.
A kulcs visszavonásának semmi köze az előfizetésedhez. Nem mond le semmit, nem térít vissza pénzt, és nem szabadít fel kvótát — a csomag fut tovább, a keret megmarad, csak épp az az egy kulcs már nincs a kezedben. Akkor vonj vissza, ha egy kulcs kikerült valahova, vagy egy integrációt kivezetsz. Ha nem akarod tovább fizetni, az előfizetést mondd le: a hozzáférés ilyenkor a már kifizetett időszak végéig megmarad, utána viszont a meglévő kulcsok is leállnak.
Egy kvóta a fiókra, nem kulcsonként egy
A fiókod minden aktív kulcsa ugyanabból a havi keretből fogyaszt. Egy második kulcs nem hoz létre második kvótát — a kulcsok arra valók, hogy szétválaszd a stagingot az élestől, minden integrációnak saját azonosítót adj, és egyet visszavonhass anélkül, hogy a többit zavarnád.
A GET /v1/usage a fiók állását adja vissza (used, limit, remaining), tehát arra a kérdésre válaszol, ami valóban érdekel — mennyi maradt, mielőtt a hívások elkezdenek elhasalni —, függetlenül attól, melyik kulccsal kérdeztél. Ha elfogy a keret, minden kulcs 402-t ad, nem csak az, amelyik elhasználta.
Csomagok, ár és kvóta
Az Engine API-t az app csomagjaitól külön számlázzuk, havonta, euróban, két csomaggal:
| Csomag | Miben tér el |
|---|---|
| Studio | A belépő csomag, ingyenes próbaidővel |
| Scale | Nagyobb havi kéréskvóta, próbaidő nélkül — a Studióból váltasz rá |
Minden más azonos mindkettőn: ugyanazok a motorok, mind a négy mód, minden beállítás, ugyanazok a válaszok. Minden kérés ugyanannyit számít — egy nesting-munka egy kérésbe kerül, pont úgy, mint egy 2D vagy 1D.
- Kemény plafon, túlhasználat nélkül. Amikor a havi kvóta elfogy, a hívások
402-t adnak, amíg a kvóta a következő hónap első napján vissza nem áll. Nincs váratlan számla. - Két e-mail, hogy a plafon ne lepjen meg. A kvóta 90 százalékánál e-mailt küldünk a fióknak, és még egyet, amikor elfogyott.
- A csomagváltás egyetlen gomb az irányítópultod API-kulcsok kártyáján (Váltás: Scale / Váltás: Studio); az új kvóta azonnal érvényes. A magasabb csomagra váltást a hátralévő időszakra azonnal felszámoljuk; az alacsonyabbra váltásnál nincs visszatérítés, az alacsonyabb díj a következő megújulástól jár. A váltás a próbaidő után érhető el.
- A Scale-nél nagyobb mennyiségeket egyedileg áraljuk — vedd fel velünk a kapcsolatot.
Az aktuális árakat és kvótákat az Engine API oldal tartalmazza — az az oldal az árazási konfigurációnkból olvassa ki őket, tehát ott mindig a pontos szám szerepel.
A technikai részletekhez — a pontos kérés- és válaszszerkezethez, minden beállításhoz, az összes hibakódhoz és a verziózás működéséhez — lásd az API-referenciát.
Nyílt forráskódú komponensek
A CutOptim motorjai nyílt forráskódú könyvtárakra épülnek, változatlan formában, a szervereinken:
- jagua-rs — a true-shape nesting mögötti geometriai ütközésmotor (MPL-2.0).
- sparrow — a nesting
maxmotorja mögötti keresés (MIT, KU Leuven). - PackingSolver — a 2D
maxmotor mögötti fakeresés (MIT).
Minden, ami körülöttük van — az API, a szerződés és e motorok közti leképezés, a téglalapos pakolók és maga az app — a CutOptim saját kódja.
Amit ez nem változtat meg
Érdemes világosan kimondani, mert az Engine API-t könnyű a termék megváltozásának félreolvasni:
- Az appban futó optimalizáló változatlan. Ugyanúgy a böngésződben fut, mint eddig.
- Az Ingyenes, a Pro és a Műhely csomagot nem érinti. Továbbra is tartalmazzák az appban futó optimalizálót, a korábbi korlátokkal. Semmi nem került az API mögé.
- Amit az appban teszel, az nem fogyaszt API-kérést. A havi API-kvótához csak a saját szoftvered hívásai nyúlnak hozzá.
Az Engine API azoknak szóló kiegészítés, akik a CutOptimot más szoftverbe illesztik. Ha nem közéjük tartozol, számodra semmi nem változott.