API belgeleri

Handifyit sipariş yönetimini, 2B kesim optimizasyonunu ve DXF CNC doğrulamasını iş akışınıza entegre edin. Optimizasyon, JSON sonuçlarını ve PDF, SVG, DXF, CSV ve PTX dışa aktarımlarını destekler. Kimliği doğrulanmış API isteklerinde Authorization: Bearer <token> başlığı kullanılır.

Tarayıcıda da çalışabilirsiniz: kesim siparişleri oluşturun, parçaları içe aktarın, kaydedilmiş çalıştırmaları karşılaştırın, bir sonuç seçin ve sipariş durumlarını güncelleyin. Aşağıdaki rehber API entegrasyonunu kapsar; kod yazmadan başlamak için sipariş iş akışına bakın. Nasıl çalışır?

Bölüme git: CNC ön doğrulayıcı · POST /api/validate-cnc · Ön ayarlar · Optimizasyon · CSV içe aktarma · DXF içe aktarma · Swagger UI

Kimlik doğrulama — uzun ömürlü API belirteçleri

Handifyit, otomatik veya sunucu tarafındaki çağrılar için Uzun ömürlü API belirteçleri kullanır. Siz açıkça iptal edene kadar geçerlidirler. Bir belirteç almak için aşağıdaki üç adımı izleyin.

1

Erişim belirteci almak için giriş yapın

Kimlik bilgilerinizi gönderip Profil sayfasını açın.

POST /login
Content-Type: application/json

{
  "email": "[email protected]",
  "password": "yourpassword"
}

→ 200 OK
{
  "access_token":  "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
2

Uzun ömürlü API belirteci oluşturun

API belirtecine açıklayıcı bir ad verin. Dönen belirteci kopyalayın: değeri yalnızca bir kez gösterilir.

POST /api/tokens
Authorization: Bearer <access_token>
Content-Type: application/json

{
  "name": "My Production App"
}

→ 201 Created
{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",  ← bu değeri kaydedin!
  "name": "My Production App"
}

API belirteçlerini Profil üzerinden de iptal edebilirsiniz.

3

API belirtecini her istekte kullanın

Tüm /api/* çağrılarında API belirtecini Bearer olarak gönderin.

POST /api/optimize
Authorization: Bearer <your-api-token>
Content-Type: application/json

{ ... istek gövdesi ... }

Ortak istek gövdesi

Altı optimizasyon uç noktası aynı JSON gövdesini kabul eder. Yalnızca materials, stock_plates, parts ve optimize_type zorunludur; diğer alanların varsayılanları vardır.

AlanDurumVarsayılanAçıklama
materialszorunlu—Malzeme dizisi. Her nesnede id (tam sayı), name (metin), identifier (kısa kod) gerekir; thickness mm olarak eklenebilir (varsayılan 18). Parçalar ve levhalar material_id ile gruplanır.
stock_plateszorunlu—Kesilecek stok levhalar. Her nesne: width, height, quantity (varsayılan 1), material_id.
partszorunlu—Kesilecek parçalar. Her nesne: width, height, quantity (varsayılan 1), material_id ve can_rotate (varsayılan true). Döndürme parça bazında belirlenir.
optimize_typezorunlu—"saw" — panel testereleri için düz giyotin kesimleri. "cnc" — CNC frezeler için iç içe yerleşim; daha esnek ancak daha yavaş.
blade_widthisteğe bağlı5Testere veya freze kesim genişliği, parça/levha biriminde 1–10. Kesimler arasındaki alandan düşülür. Dosya içe aktarma 0–10 kabul eder.
trim_stock_plateisteğe bağlı10Kullanılamayan kenarları çıkarmak için optimizasyondan önce her levha kenarından alınan pay, 0–50.
allow_mixed_stock_sizesisteğe bağlıtrueAynı malzemede farklı levha boyutlarını karıştırmaya izin verir. false, malzemenin tüm levhalarının aynı boyutta olmasını zorunlu kılar.
pattern_directionisteğe bağlı"none""paralleltowidth"
performance_modeisteğe bağlı"normal""fast" — en hızlı yanıt. "normal" — dengeli (önerilir). "high" — daha uzun hesaplama karşılığında fireyi azaltan yoğun sıkıştırma.
random_seedisteğe bağlı0Rastgele sayı üretecinin tam sayı başlangıç değeri. İstekler arasında aynı yerleşimi üretmek için aynı değeri kullanın.
can_rotateisteğe bağlı—Kullanımdan kaldırıldı. Uyumluluk için korunan genel ayar, tüm parçalara aynı döndürme iznini uygular. Her parçanın can_rotate değeri için bu alanı atlayın.

Tam istek örneği

{
  "materials": [
    { "id": 1, "name": "Plywood 18mm", "identifier": "PLY18", "thickness": 18 }
  ],
  "stock_plates": [
    { "width": 2440, "height": 1220, "quantity": 5, "material_id": 1 }
  ],
  "parts": [
    { "width": 800, "height": 600, "quantity": 4, "material_id": 1, "can_rotate": true  },
    { "width": 400, "height": 300, "quantity": 8, "material_id": 1, "can_rotate": false }
  ],
  "optimize_type":           "saw",
  "blade_width":              5,
  "trim_stock_plate":         10,
  "allow_mixed_stock_sizes":  true,
  "pattern_direction":       "none",
  "performance_mode":        "normal",
  "random_seed":              0
}

Ücretsiz plan sınırları

Ücretsiz hesaplarda bu sınırlar tüm optimizasyon uç noktalarında geçerlidir (/api/optimize, /api/optimize/pdf, /api/optimize/dxf, /api/optimize/svg, /api/optimize/csv, /api/optimize/ptx ve tüm from-dxf, from-csv çeşitleri):

  • İstek başına 25 parça — parts dizisindeki tüm part.quantity değerlerinin toplamı 25’i aşmamalıdır. Aşılması 400 döndürür.
  • Günde 25 optimizasyon isteği — hesap bazında sayılır, UTC gece yarısında sıfırlanır. Aşılması 429 döndürür.
POST/api/optimize

Optimizasyonu çalıştırır ve tam yerleşimi JSON olarak döndürür. Dosya oluşturmaz; kendi uygulamanızda sonuçları işlemek veya göstermek için kullanın.

Yanıt yapısı

{
  "results": [
    {
      "material": { "id": 1, "name": "Plywood 18mm", "identifier": "PLY18",
                    "thickness": 18 },
      "layouts": [
        {
          "stock_width":  2420,
          "stock_height": 1200,
          "stock_index":  0,
          "cuts": [
            { "x": 0,   "y": 0,   "width": 800, "height": 600, "part_id": 0 },
            { "x": 805, "y": 0,   "width": 400, "height": 300, "part_id": 1 },
            { "x": 805, "y": 305, "width": 400, "height": 300, "part_id": 1 }
          ],
          "cut_length_mm":     10420,
          "cut_length_method": "guillotine",
          "offcuts": [
            { "x": 1220, "y": 0, "width": 1220, "height": 1220 },
            …
          ],
          "saw_plan": {
            "kind": "split", "x": 0, "y": 0, "width": 2440, "height": 1220,
            "axis": "x", "cuts": [5, 810, 1215],
            "children": [
              { "kind": "offcut", "x": 0, "y": 0, "width": 5, "height": 1220 },
              { "kind": "split", "x": 10, "y": 0, "width": 800, "height": 1220,
                "axis": "y", "cuts": [5, 610],
                "children": [
                  { "kind": "offcut", "x": 10, "y": 0, "width": 800, "height": 5 },
                  { "kind": "part", "x": 10, "y": 10, "width": 800, "height": 600,
                    "cut_index": 0 },
                  …
                ] },
              …
            ]
          }
        }
      ],
      "summary": {
        "total_stock_used":    1,
        "total_parts":         12,
        "material_efficiency": 91.8,
        "total_cut_length_mm": 10420
      }
    }
  ]
}

Yanıt, her malzeme için bir results kaydı içerir. Her kayıt şunları kapsar:

  • layouts — kullanılan levha başına bir nesne; cuts, parçaların konumunu (x, y) ve boyutunu listeler
  • summary — total_stock_used, total_parts, material_efficiency (%0–100) ve total_cut_length_mm

stock_width ve stock_height, dört kenardan trim_stock_plate çıkarıldıktan sonraki kullanılabilir alanı tanımlar. cut koordinatları bu alanın sol üst köşesinden başlar. part_id, parçanın malzeme grubundaki indeksidir; genel kimlik değildir.

cut_length_mm iki yöntemle ölçülür; yöntemi cut_length_method belirtir: "guillotine", panel testeresinin yoludur; "contour", frezenin parça çevresindeki yoludur. Farklı fiziksel büyüklüklerdir; birbirine eklemeyin veya karşılaştırmayın.

stock_index, kaynak levhanın istekteki stock_plates dizisinde konumudur. offcuts, küçük atıklar dahil, planlanan kesimlerin bütün bıraktığı parçasız artıklardır. cuts aksine ham levhada konumlanırlar. Fiziksel boyutlarında kesim payı zaten düşülmüştür ve tıraşlanmamış kenarlar dahildir.

saw_plan, ham levhadaki aynı planın ağaç biçimidir. Bir "split" bölgesi paralel kesimlerle bölünür: cuts, axis yönündeki şerit başlangıçlarını verir ("x": boyuna; "y": enine). Şerit genişliği blade_width olur. children her aralık için kayıt içerir; artık yoksa null. Yapraklar, cut_index ile cuts dizisine başvuran "part" parçaları ve "offcut" artıklarıdır. null, bazı "cnc" yerleşimlerinde olduğu gibi, düz kesim sırası olmadığını belirtir.

POST/api/optimize/pdf

Optimize edip levha başına bir sayfalı tek PDF oluşturur. Dosya buluta yüklenir ve imzalı indirme URL’si döndürülür.

İstek

/api/optimize ile aynı JSON gövdesi (yukarıya bakın).

Yanıt

{
  "files": [
    {
      "name": "layout-1708433600000.pdf",
      "url":  "https://storage.example.com/pdf/1708433600000/layout-1708433600000.pdf"
    }
  ]
}

Yanıt, tüm levhaları içeren tek PDF dosyası içerir.

POST/api/optimize/dxf

Optimize edip levha başına DXF oluşturur. Çoğu CAD/CAM yazılımı ve CNC denetleyicisiyle uyumludur (AutoCAD, Fusion 360, Mach3 vb.). Saklanan her dosya için ayrı URL döndürür.

İstek

/api/optimize ile aynı JSON gövdesi (yukarıya bakın).

Yanıt

{
  "files": [
    {
      "name": "plate-1-25318.dxf",
      "url":  "https://storage.example.com/dxf/1708433600000/plate-1-25318.dxf"
    },
    {
      "name": "plate-2-25318.dxf",
      "url":  "https://storage.example.com/dxf/1708433600000/plate-2-25318.dxf"
    }
  ]
}

Levha başına bir dosya. Ad, levha indeksini ve çalıştırma kimliğini içerir: plate-1-25318.dxf, 25318 çalıştırmasının 1. levhasıdır.

POST/api/optimize/csv

Optimize edip tüm malzeme ve levhalardaki parçalar için tek CSV oluşturur. Satırlar konum, parça ve levha ölçüleri, malzeme adı ve kodunu içerir; tablolar, ERP ve özel son işlemciler için uygundur. Dosya buluta yüklenir ve URL’si döner.

İstek

/api/optimize ile aynı JSON gövdesi (yukarıya bakın).

CSV sütunları

Part ID, x, y, width, height, stock_width, stock_height, material(as name), material(as identifier)

Yanıt

{
  "files": [
    {
      "name": "layout-1708433600000.csv",
      "url":  "https://storage.example.com/csv/1708433600000/layout-1708433600000.csv"
    }
  ]
}

Tüm malzeme ve levhaların kesimlerini içeren tek CSV.

POST/api/optimize/svg

Optimize edip levha başına SVG oluşturur. Ölçeklenebilir vektörler web önizlemeleri ve Inkscape, Illustrator veya Figma’ya aktarım için uygundur. Saklanan dosyaların ayrı URL’lerini döndürür.

İstek

/api/optimize ile aynı JSON gövdesi (yukarıya bakın).

Yanıt

{
  "files": [
    {
      "name": "plate-1-25318.svg",
      "url":  "https://storage.example.com/svg/1708433600000/plate-1-25318.svg"
    },
    {
      "name": "plate-2-25318.svg",
      "url":  "https://storage.example.com/svg/1708433600000/plate-2-25318.svg"
    }
  ]
}
POST/api/optimize/ptx
Beta

PTX dışa aktarma beta aşamasındadır ve henüz gerçek makinelerde doğrulanmamıştır. Dışa aktarılan dosyaları üretimde kullanmadan önce hedef makinenizde doğrulayın.

Optimize edip malzeme grubu başına PTX (Pattern Exchange) oluşturur. HOLZMA / HOMAG testereleri için bu aktarım biçimini HolzLink, CADmatic 4/5 ve HOMAG intelliDivide kabul eder. Dosya, malzemenin işini, kesim desenlerini ve sıralarını içerir. Bulut dosyalarının URL’lerini döndürür.

İstek

/api/optimize ile aynı JSON gövdesi (yukarıya bakın). optimize_type: "saw", panel testerelerine uygun giyotin yerleşimleri üretir.

Yanıt

{
  "files": [
    {
      "name": "J1708433600000.PTX",
      "url":  "https://storage.example.com/ptx/1708433600000/J1708433600000.PTX"
    }
  ]
}

Malzeme grubu başına bir PTX. Her dosya şunları içerir:

  • HEADER, bir JOBS satırı ve bir MATERIALS satırı — program bilgileri, levha kalınlığı, kesim payı ve kenar tıraşı.
  • BOARDS + PATTERNS — farklı yerleşim başına bir çift; ham ölçüler ve tekrar sayısı. Aynı yerleşimler birleştirilir.
  • PARTS_REQ + PARTS_INF + PARTS_UDI — desendeki her farklı parça geometrisi için iş boyunca numaralandırılmış eşleşen satırlar. Miktarlar tekrarlanan tüm levhaları içerir. İsteğe bağlı açıklama ve kenar etiketleri boştur; malzeme kodu DSP olur.
  • CUTS — başlangıç, boyuna, enine, tekrar kesim ve kenar tıraşı talimatları; her desenin ayrı sırası ve gerekli parça başvuruları vardır.

Varsayılan kalınlık, mobilya levhalarında yaygın olan 18 mm’dir. Ölçüler milimetredir. Program ve dosya adları J<timestamp>.PTX biçiminde, malzeme başına benzersiz sayısal kimlikle oluşturulur.

İç içe "cnc" yerleşimi her zaman testereyle kesilemez. Bu durumda uç nokta dosya yerine 422 döndürür.

CSV parça listesi içe aktarma

from-csv uç noktaları JSON yerine multipart/form-data kabul eder. Tablodan parça listesi yükleyin: sunucu satırlardan parts oluşturur. Malzeme, levha, kesim genişliği ve diğer ayarlar params alanında JSON metniyle gönderilir.

CSV biçimi

↓ CSV şablonunu / örneğini indirinTüm desteklenen alanlar ve farklı miktarlarda 10 örnek parça. Malzeme kodlarını kendi kodlarınızla değiştirin.

Material Code,Width,Height,Quantity,Can Rotate
PLY18,800,600,4,1
PLY18,400,300,8,0
MDF16,1200,400,2,1

Satırların parçalara dönüşmesi

  • Başlık satırı zorunludur. Büyük/küçük harf, çevre boşlukları, tire ve alt çizgi göz ardı edilir: Material Code, Width, Height, Quantity, Can Rotate.
  • Material Code, materials dizisindeki bir kaydın identifier değeriyle eşleşir. Bilinmeyen kod isteği başarısız kılar; hata satırı belirtir.
  • Can Rotate isteğe bağlıdır: 1, 90° dönüşe izin verir; 0 vermez. Boş hücre veya eksik sütun, damar yönünü korumak için döndürme yok anlamına gelir.
  • Material Code, Width, Height ve Quantity her satırda zorunludur.
  • Virgül, noktalı virgül, sekme, UTF-8 BOM ve tırnaklı metin desteklenir. API ölçüleri pozitif tam milimetre; miktarlar pozitif tam sayıdır.

Her kenarın bantlanması

Top, Right, Bottom ve Left için Edge Band (kod), Edge Thickness (mm), Pre Milling (alınan mm) ve Edge Method kullanın. Örnek: Top Edge Band, Top Edge Thickness. Kenarlar, döndürmeden önceki parçayı belirtir.

İşlenmeyen kenarları boş bırakın. Yöntemler: none, band, pre_mill_band. Eksik yöntem kod, kalınlık ve frezelemeden belirlenir. Bantlı kenarlar pozitif kalınlık ister; API katalog kodlarına bakmaz. Çalışma alanı içe aktarıcısı eksik kalınlığı katalogdan alabilir.

Dimension Mode, blank (varsayılan) veya finished kabul eder. Optimizasyon, kalınlık ve ön frezelemeyi telafi eder. İsteğe bağlı sınırlar: Banding Min Length, Banding Min Cross Size, Pre Milling Min Length, Pre Milling Min Cross Size, mm olarak; sıfır sınırı kapatır. Processing Order her kenarı bir kez listeler, örneğin top right bottom left. Hatalar satır numarasını belirtir.

Çalışma alanı ayrıca Part Code, Part Name, Grain (none, paralleltowidth, paralleltolength), Priority ve Notes alır. Durumsuz CSV API’si bu sipariş bilgilerini yok sayar.

İstek alanları (multipart)

AlanDurumTürAçıklama
filezorunlu—Yukarıdaki başlıkla CSV parça listesi.
paramszorunlu—JSON optimizasyon parametreleri (aşağıdaki tablo). parts hariç tüm OptimizeRequest alanları.

«params» JSON alanları

AlanDurumVarsayılanAçıklama
materialszorunlu—En az bir malzeme gerekir. identifier, satırın Material Code değeriyle eşleşir.
stock_plateszorunlu—/api/optimize ile aynı; en az bir levha gerekir.
optimize_typezorunlu—"saw" veya "cnc" (/api/optimize ile aynı).
blade_widthisteğe bağlı5Kesim genişliği, mm. JSON uç noktasından farklı olarak dosya içe aktarma 0 kabul eder.
trim_stock_plateisteğe bağlı10/api/optimize ile aynı.
allow_mixed_stock_sizesisteğe bağlıtrue/api/optimize ile aynı.
pattern_directionisteğe bağlı"none"/api/optimize ile aynı.
performance_modeisteğe bağlı"normal"/api/optimize ile aynı.
random_seedisteğe bağlı0/api/optimize ile aynı.

«params» JSON örneği

{
  "materials": [
    { "id": 1, "name": "Plywood 18mm", "identifier": "PLY18", "thickness": 18 },
    { "id": 2, "name": "MDF 16mm",     "identifier": "MDF16", "thickness": 16 }
  ],
  "stock_plates": [
    { "width": 2440, "height": 1220, "quantity": 5, "material_id": 1 },
    { "width": 2800, "height": 2070, "quantity": 3, "material_id": 2 }
  ],
  "optimize_type":           "saw",
  "blade_width":              5,
  "trim_stock_plate":         10,
  "allow_mixed_stock_sizes":  true,
  "pattern_direction":       "none",
  "performance_mode":        "normal",
  "random_seed":              0
}

İstek örneği (curl)

# JSON sonucu
curl -X POST https://handifyit.com/api/optimize/from-csv \
  -H "Authorization: Bearer <your-api-token>" \
  -F "[email protected]" \
  -F 'params={
    "materials":    [{"id":1,"name":"Plywood 18mm","identifier":"PLY18","thickness":18}],
    "stock_plates": [{"width":2440,"height":1220,"quantity":5,"material_id":1}],
    "optimize_type":   "saw",
    "blade_width":      5,
    "trim_stock_plate": 10
  }'

# PDF — dışa aktarma biçimi «from-csv» son ekinden önce gelir:
curl -X POST https://handifyit.com/api/optimize/pdf/from-csv \
  -H "Authorization: Bearer <your-api-token>" \
  -F "[email protected]" \
  -F 'params={"materials":[...],"stock_plates":[...],"optimize_type":"saw"}'

# /svg/from-csv /dxf/from-csv /csv/from-csv /ptx/from-csv için aynı yapı

Uç noktalar

POST/api/optimize/from-csv

CSV’yi okur, optimize eder ve /api/optimize yapısında tam JSON yerleşimi döndürür.

{
  "results": [
    {
      "material": { "id": 1, "name": "Plywood 18mm", "identifier": "PLY18",
                    "thickness": 18 },
      "layouts": [
        {
          "stock_width":  2420,
          "stock_height": 1200,
          "stock_index":  0,
          "cuts": [
            { "x": 0,   "y": 0,   "width": 800, "height": 600, "part_id": 0 },
            { "x": 805, "y": 0,   "width": 400, "height": 300, "part_id": 1 },
            { "x": 805, "y": 305, "width": 400, "height": 300, "part_id": 1 }
          ],
          "cut_length_mm":     10420,
          "cut_length_method": "guillotine",
          "offcuts": [
            { "x": 1220, "y": 0, "width": 1220, "height": 1220 },
            …
          ],
          "saw_plan": {
            "kind": "split", "x": 0, "y": 0, "width": 2440, "height": 1220,
            "axis": "x", "cuts": [5, 810, 1215],
            "children": [
              { "kind": "offcut", "x": 0, "y": 0, "width": 5, "height": 1220 },
              { "kind": "split", "x": 10, "y": 0, "width": 800, "height": 1220,
                "axis": "y", "cuts": [5, 610],
                "children": [
                  { "kind": "offcut", "x": 10, "y": 0, "width": 800, "height": 5 },
                  { "kind": "part", "x": 10, "y": 10, "width": 800, "height": 600,
                    "cut_index": 0 },
                  …
                ] },
              …
            ]
          }
        }
      ],
      "summary": {
        "total_stock_used":    1,
        "total_parts":         12,
        "material_efficiency": 91.8,
        "total_cut_length_mm": 10420
      }
    }
  ]
}
POST/api/optimize/{format}/from-csv

Aynı içe aktarma, dışa aktarmayla. {format}, pdf, svg, dxf, csv veya ptx olur. Yanıt, imzalı URL’ler içeren { "files": [...] } biçimindedir.

Beta

PTX dışa aktarma beta aşamasındadır ve henüz gerçek makinelerde doğrulanmamıştır. Dışa aktarılan dosyaları üretimde kullanmadan önce hedef makinenizde doğrulayın.

DXF içe aktarma ile optimizasyon

from-dxf uç noktaları JSON yerine multipart/form-data kabul eder. Sunucu, elle parts dizisi gerekmeden dış DXF konturlarını okur. Her kapalı sınır, eksenlere paralel sınırlayıcı kutudan width ve height alınan bir parça olur. Tüm ayarlar params alanında JSON metnidir.

DXF parçalarının çıkarılması

  • İçeren bir sınırı olmayan üst düzey kapalı LWPOLYLINE, POLYLINE, ELLIPSE ve SPLINE nesneleri parçalara dönüşür.
  • width ve height, eksenlere paralel kutu ölçüleridir; unit biriminde tam sayıya yuvarlanır (varsayılan mm). Herhangi bir boyutu 1 birimden küçük parçalar atlanır.
  • Tüm parçalar material_id malzemesini alır; varsayılan, materials dizisinin ilk kaydındaki id değeridir.
  • İç konturlar (delikler, boşaltmalar, kanallar) yok sayılır. Kesim optimizasyonunda yalnızca dış sınır önemlidir.

İstek alanları (multipart)

AlanDurumTürAçıklama
filezorunlu—DXF dosya baytları (R12–2018); .dxf uzantısı zorunludur.
paramszorunlu—JSON parametreleri (aşağıdaki tablo): parts hariç tüm OptimizeRequest alanları, ayrıca unit ve material_id.

«params» JSON alanları

AlanDurumVarsayılanAçıklama
materialszorunlu—/api/optimize ile aynı; en az bir malzeme gerekir.
stock_plateszorunlu—/api/optimize ile aynı; en az bir levha gerekir.
optimize_typezorunlu—"saw" veya "cnc" (/api/optimize ile aynı).
unitisteğe bağlı"mm""cm"
material_idisteğe bağlıilk malzemenin id değeriTüm DXF parçalarına atanacak malzeme kimliği. Varsayılan, materials dizisinin ilk kaydındaki id değeridir.
blade_widthisteğe bağlı5Kesim genişliği, mm. JSON uç noktasından farklı olarak dosya içe aktarma 0 kabul eder.
can_rotateisteğe bağlıtrueÇizimde parça bazında dönüş bilgisi olmadığı için tüm DXF parçalarına uygulanır.
trim_stock_plateisteğe bağlı10/api/optimize ile aynı.
allow_mixed_stock_sizesisteğe bağlıtrue/api/optimize ile aynı.
pattern_directionisteğe bağlı"none"/api/optimize ile aynı.
performance_modeisteğe bağlı"normal"/api/optimize ile aynı.
random_seedisteğe bağlı0/api/optimize ile aynı.

«params» JSON örneği

{
  "materials": [
    { "id": 1, "name": "Plywood 18mm", "identifier": "PLY18", "thickness": 18.0 }
  ],
  "stock_plates": [
    { "width": 2440, "height": 1220, "quantity": 5, "material_id": 1 }
  ],
  "optimize_type":           "saw",
  "blade_width":              5,
  "can_rotate":               true,
  "trim_stock_plate":         10,
  "allow_mixed_stock_sizes":  true,
  "pattern_direction":       "none",
  "performance_mode":        "normal",
  "random_seed":              0,
  "unit":                    "mm",
  "material_id":              1
}

İstek örneği (curl)

# JSON sonucu
curl -X POST https://handifyit.com/api/optimize/from-dxf \
  -H "Authorization: Bearer <your-api-token>" \
  -F "[email protected]" \
  -F 'params={
    "materials":       [{"id":1,"name":"Plywood 18mm","identifier":"PLY18","thickness":18}],
    "stock_plates":    [{"width":2440,"height":1220,"quantity":5,"material_id":1}],
    "optimize_type":   "saw",
    "blade_width":      5,
    "can_rotate":       true,
    "trim_stock_plate": 10,
    "unit":            "mm"
  }'

# PDF — PDF dışa aktarma uç noktasını kullanın:
curl -X POST https://handifyit.com/api/optimize/pdf/from-dxf \
  -H "Authorization: Bearer <your-api-token>" \
  -F "[email protected]" \
  -F 'params={"materials":[...],"stock_plates":[...],"optimize_type":"saw"}'

# /svg/from-dxf /dxf/from-dxf /csv/from-dxf /ptx/from-dxf için aynı yapı

Uç noktalar

POST/api/optimize/from-dxf

DXF’yi okur, optimize eder ve /api/optimize yapısında tam JSON yerleşimi döndürür.

{
  "results": [
    {
      "material": { "id": 1, "name": "Plywood 18mm", "identifier": "PLY18",
                    "thickness": 18 },
      "layouts": [
        {
          "stock_width":  2420,
          "stock_height": 1200,
          "stock_index":  0,
          "cuts": [
            { "x": 0,   "y": 0,   "width": 800, "height": 600, "part_id": 0 },
            { "x": 805, "y": 0,   "width": 400, "height": 300, "part_id": 1 },
            { "x": 805, "y": 305, "width": 400, "height": 300, "part_id": 1 }
          ],
          "cut_length_mm":     10420,
          "cut_length_method": "guillotine",
          "offcuts": [
            { "x": 1220, "y": 0, "width": 1220, "height": 1220 },
            …
          ],
          "saw_plan": {
            "kind": "split", "x": 0, "y": 0, "width": 2440, "height": 1220,
            "axis": "x", "cuts": [5, 810, 1215],
            "children": [
              { "kind": "offcut", "x": 0, "y": 0, "width": 5, "height": 1220 },
              { "kind": "split", "x": 10, "y": 0, "width": 800, "height": 1220,
                "axis": "y", "cuts": [5, 610],
                "children": [
                  { "kind": "offcut", "x": 10, "y": 0, "width": 800, "height": 5 },
                  { "kind": "part", "x": 10, "y": 10, "width": 800, "height": 600,
                    "cut_index": 0 },
                  …
                ] },
              …
            ]
          }
        }
      ],
      "summary": {
        "total_stock_used":    1,
        "total_parts":         12,
        "material_efficiency": 91.8,
        "total_cut_length_mm": 10420
      }
    }
  ]
}
POST/api/optimize/pdf/from-dxf

DXF’yi okur, optimize eder ve levha başına bir sayfalı PDF planını imzalı URL ile döndürür.

{
  "files": [
    {
      "name": "layout-1708433600000.pdf",
      "url":  "https://storage.example.com/pdf/1708433600000/layout-1708433600000.pdf"
    }
  ]
}
POST/api/optimize/svg/from-dxf

DXF’yi okur, optimize eder ve levha başına bir SVG’yi imzalı URL’lerle döndürür.

{
  "files": [
    {
      "name": "plate-1-25318.svg",
      "url":  "https://storage.example.com/svg/1708433600000/plate-1-25318.svg"
    },
    {
      "name": "plate-2-25318.svg",
      "url":  "https://storage.example.com/svg/1708433600000/plate-2-25318.svg"
    }
  ]
}
POST/api/optimize/dxf/from-dxf

DXF’yi okur, optimize eder ve levha başına bir DXF yerleşimini imzalı URL’lerle döndürür.

{
  "files": [
    {
      "name": "plate-1-25318.dxf",
      "url":  "https://storage.example.com/dxf/1708433600000/plate-1-25318.dxf"
    },
    {
      "name": "plate-2-25318.dxf",
      "url":  "https://storage.example.com/dxf/1708433600000/plate-2-25318.dxf"
    }
  ]
}
POST/api/optimize/csv/from-dxf

DXF’yi okur, optimize eder ve tek CSV kesim listesini imzalı URL ile döndürür.

{
  "files": [
    {
      "name": "layout-1708433600000.csv",
      "url":  "https://storage.example.com/csv/1708433600000/layout-1708433600000.csv"
    }
  ]
}
POST/api/optimize/ptx/from-dxf
Beta

PTX dışa aktarma beta aşamasındadır ve henüz gerçek makinelerde doğrulanmamıştır. Dışa aktarılan dosyaları üretimde kullanmadan önce hedef makinenizde doğrulayın.

DXF’yi okur, optimize eder ve HOLZMA / HOMAG testereleri için PTX dosyalarını imzalı URL’lerle döndürür.

{
  "files": [
    {
      "name": "J1708433600000.PTX",
      "url":  "https://storage.example.com/ptx/1708433600000/J1708433600000.PTX"
    }
  ]
}

CNC ön doğrulama

Üretimden önce CNC ön doğrulayıcı, bir DXF dosyası dosyasını makine sınırlarına göre inceler. Parça konturlarını ve iç işlemleri (delme, boşaltma, kanal) çıkarıp geometrik kural ihlalleri arar.

KodÖnem derecesiAçıklama
PART_TOO_SMALLhataSınırlayıcı kutu part_min_width × part_min_height değerinden küçüktür.
PART_TOO_LARGEhataSınırlayıcı kutu part_max_width × part_max_height değerini aşar.
OPERATION_OUTSIDE_PARThataİşlem konturunun bir veya daha fazla köşesi parça dışındadır.
OPERATION_INTERSECTS_EDGEhataKöşeler içeride olsa bile işlem kenarları parça sınırını keser.
OPERATION_TOO_CLOSE_TO_EDGEhata / uyarıKenara uzaklık min_edge_offset altındadır. < ½ sınır ise hata; < sınır ise uyarı.
DRILL_DIAMETER_TOO_SMALLhataDelik çapı drill_min_diameter altındadır.
DRILL_DIAMETER_TOO_LARGEhataDelik çapı drill_max_diameter değerini aşar.
OPERATIONS_INTERSECThataAynı yüzdeki iki işlem örtüşür.
OPERATIONS_TOO_CLOSEhata / uyarıİki işlemin yüzeyleri arasındaki uzaklık min_op_spacing altındadır. < ½ sınır ise hata; < sınır ise uyarı.
POST/api/validate-cnc

DXF’yi multipart/form-data olarak yükleyin. Yanıt tam ValidationReport içerir: her parça için işlemler ve ihlallerle bir PartResult.

İstek alanları (multipart)

AlanDurumTürAçıklama
filezorunlu—DXF baytları. Çoğu ikili R12–2018 sürümü kabul edilir.
configisteğe bağlıvarsayılan değerlerJSON olarak ValidationConfig nesnesi (aşağıdaki tablo). Tüm alanlar isteğe bağlıdır; eksik alanlar varsayılan değeri alır.

ValidationConfig alanları

AlanDurumVarsayılanAçıklama
part_min_widthisteğe bağlı50İzin verilen en küçük parça genişliği, mm.
part_min_heightisteğe bağlı50İzin verilen en küçük parça yüksekliği, mm.
part_max_widthisteğe bağlı2800İzin verilen en büyük parça genişliği, mm.
part_max_heightisteğe bağlı2070İzin verilen en büyük parça yüksekliği, mm.
drill_min_diameteristeğe bağlı2En küçük matkap çapı, mm.
drill_max_diameteristeğe bağlı35En büyük matkap çapı, mm.
min_edge_offsetisteğe bağlı8İşlem kenarı ile parça sınırı arasındaki en küçük mesafe, mm.
min_op_spacingisteğe bağlı8İki işlemin yüzeyleri arasındaki en küçük mesafe, mm.
groove_aspect_ratioisteğe bağlı3.0Kapalı iç konturda uzun kenar ≥ bu oran × kısa kenar ise genel boşaltma yerine kanal olarak sınıflandırılır.
unitisteğe bağlı"mm""cm"

İstek örneği (curl)

curl -X POST https://handifyit.com/api/validate-cnc \
  -H "Authorization: Bearer <your-api-token>" \
  -F "[email protected]" \
  -F 'config={"part_min_width":50,"part_min_height":50,\
              "part_max_width":2800,"part_max_height":2070,\
              "drill_min_diameter":2,"drill_max_diameter":35,\
              "min_edge_offset":8,"min_op_spacing":8,\
              "groove_aspect_ratio":3,"unit":"mm"}'

Yanıt örneği

{
  "valid": false,
  "summary": {
    "total_parts":      3,
    "total_operations": 12,
    "total_issues":     2,
    "errors":           1,
    "warnings":         1
  },
  "parts": [
    {
      "id":    "part_1",
      "layer": "PART",
      "bbox":  { "min_x": 0, "min_y": 0, "max_x": 400, "max_y": 300,
                 "width": 400, "height": 300 },
      "operations": [
        {
          "id":     "op_1",
          "kind":   "drilling",
          "side":   "through",
          "layer":  "DRILL",
          "bbox":   { "min_x": 46, "min_y": 46, "max_x": 54, "max_y": 54,
                      "width": 8, "height": 8 },
          "center": { "x": 50, "y": 50 },
          "diameter": 8
        }
      ],
      "issues": [
        {
          "code":         "OPERATION_TOO_CLOSE_TO_EDGE",
          "message":      "Operation op_1 is 3.50 mm from the part edge (minimum: 8.0 mm)",
          "severity":     "error",
          "operation_id": "op_1"
        }
      ],
      "valid": false
    }
  ]
}

Temel yanıt alanları:

  • valid — yalnızca hiçbir parçada hata düzeyinde sorun yoksa true.
  • summary — toplamlar: total_parts, total_operations, errors, warnings.
  • parts[] — her parça için sınırlayıcı kutu, işlemler ve sorunları içeren nesne.
  • issues[].severity — "error" (engelleyici) veya "warning" (yalnızca bilgi).

CNC yapılandırma ön ayarları

Sonraki doğrulamalar için adlandırılmış ValidationConfig ön ayarlarını kaydedin. Yalnızca hesabınıza özeldirler.

GET/api/cnc-configs

Giriş yapmış kullanıcının tüm kayıtlı ön ayarlarını döndürür.

GET /api/cnc-configs
Authorization: Bearer <your-api-token>

→ 200 OK
{
  "configs": [
    {
      "id":         "d4f2a1b3-...",
      "name":       "Standard Router",
      "config":     { ... },
      "created_at": "2026-04-05T10:00:00Z",
      "updated_at": "2026-04-05T10:00:00Z"
    }
  ]
}
POST/api/cnc-configs

Adlandırılmış ön ayar oluşturur. Kayıtla birlikte 201 Created döndürür.

POST /api/cnc-configs
Authorization: Bearer <your-api-token>
Content-Type: application/json

{
  "name": "Standard Router",
  "config": {
    "part_min_width":     50,
    "part_min_height":    50,
    "part_max_width":     2800,
    "part_max_height":    2070,
    "drill_min_diameter": 2,
    "drill_max_diameter": 35,
    "min_edge_offset":    8,
    "min_op_spacing":     8,
    "groove_aspect_ratio": 3,
    "unit": "mm"
  }
}

→ 201 Created
{
  "id":         "d4f2a1b3-...",
  "name":       "Standard Router",
  "config":     { ... },
  "created_at": "2026-04-05T10:00:00Z",
  "updated_at": "2026-04-05T10:00:00Z"
}
PUT/api/cnc-configs/{id}

Adı ve/veya yapılandırmayı değiştirir. Gövde POST ile aynı yapıdadır. Güncel kayıtla 200 OK veya kimlik yoksa ya da başka kullanıcıya aitse 404 döndürür.

DELETE/api/cnc-configs/{id}

Ön ayarı kalıcı siler. Başarıda 204 No Content, bulunamazsa 404 döndürür.

Hata yanıtları

Tüm uç noktalar hataları aynı JSON zarfında döndürür:

{ "message": "A part (800×600) does not fit any stock plate" }
  • 400 — parça sınırı aşıldı: quantity toplamı planın istek sınırını aşar. Bozuk CSV veya eksik multipart alanı da burada bildirilir.
  • 401 — Bearer belirteci eksik, süresi dolmuş veya iptal edilmiş.
  • 422 — parça hiçbir levhaya sığmıyor veya levhalar yetmiyor. Optimizasyon tamamen başarılı olur veya başarısızdır; kısmi yerleşim dönmez. Mesaj parça ya da kısıtı belirtir. PTX, testereyle kesilemeyen yerleşimde de 422 döndürür.
  • 429 — günlük sınır doldu. UTC gece yarısında sıfırlanır.
  • 500 — dosya yükleme hatası gibi dahili sunucu hatası.