{
  "version": 3,
  "sources": ["/cdn/shop/t/109/assets/fd-plot-core.js?x=1791610527691"],
  "sourcesContent": ["/* FD Plot-Rechner \u2013 Rechenkern (Verschachtelung + Materialoptimierung)\n   Alle Ma\u00DFe in mm. */\n(function (root) {\n  'use strict';\n\n  // Teile auf eine Rollenbreite verschachteln (Regal-/Shelf-Verfahren, mehrere Strategien, beste gewinnt)\n  // pieces: [{w, h, qty, label}]  w = Breite (quer zur Rolle, wenn nicht gedreht), h = H\u00F6he (Laufrichtung)\n  function pack(pieces, rollWidth, gap, allowRotate) {\n    var A = rollWidth - 2 * gap; // nutzbare Breite\n    var items = [];\n    var tooWide = [];\n    pieces.forEach(function (p, idx) {\n      var fitsN = p.w <= A, fitsR = allowRotate && p.h <= A;\n      if (!fitsN && !fitsR) { tooWide.push(idx); return; }\n      for (var i = 0; i < p.qty; i++) items.push({ w: p.w, h: p.h, idx: idx, n: i + 1 });\n    });\n    if (tooWide.length) return { error: 'tooWide', pieces: tooWide };\n    if (!items.length) return { shelves: [], length: 0 };\n\n    var strategies = allowRotate ? ['longAcross', 'shortAcross', 'asIs'] : ['asIs'];\n    var best = null;\n    strategies.forEach(function (s) {\n      var r = ffdh(items, A, gap, allowRotate, s);\n      if (!best || r.length < best.length) best = r;\n    });\n    return best;\n  }\n\n  function orient(it, A, allowRotate, s) {\n    var big = Math.max(it.w, it.h), small = Math.min(it.w, it.h);\n    if (!allowRotate || s === 'asIs') {\n      if (it.w <= A) return { a: it.w, b: it.h, rot: false };\n      return { a: it.h, b: it.w, rot: true };\n    }\n    if (s === 'longAcross') {\n      if (big <= A) return { a: big, b: small, rot: big !== it.w };\n      return { a: small, b: big, rot: small !== it.w };\n    }\n    // shortAcross\n    return { a: small, b: big, rot: small !== it.w };\n  }\n\n  // First-Fit Decreasing Height\n  function ffdh(items, A, gap, allowRotate, s) {\n    var list = items.map(function (it) {\n      var o = orient(it, A, allowRotate, s);\n      return { it: it, a: o.a, b: o.b, rot: o.rot };\n    });\n    list.sort(function (x, y) { return y.b - x.b || y.a - x.a; });\n    var shelves = [];\n    list.forEach(function (e) {\n      var placed = false;\n      for (var i = 0; i < shelves.length && !placed; i++) {\n        var sh = shelves[i];\n        var opts = [{ a: e.a, b: e.b, rot: e.rot }];\n        if (allowRotate) opts.push({ a: e.b, b: e.a, rot: !e.rot });\n        for (var k = 0; k < opts.length; k++) {\n          var o = opts[k];\n          if (o.b <= sh.h && sh.used + gap + o.a <= A + gap) { // used enth\u00E4lt bereits Abst\u00E4nde\n            sh.items.push({ x: sh.used, a: o.a, b: o.b, rot: o.rot, it: e.it });\n            sh.used += o.a + gap;\n            placed = true; break;\n          }\n        }\n      }\n      if (!placed) {\n        shelves.push({ h: e.b, used: e.a + gap, items: [{ x: 0, a: e.a, b: e.b, rot: e.rot, it: e.it }] });\n      }\n    });\n    var length = gap;\n    shelves.forEach(function (sh) { length += sh.h + gap; });\n    return { shelves: shelves, length: length, strategy: s };\n  }\n\n  // L\u00E4nge einer Gruppe von Regalen inkl. Abst\u00E4nden\n  function segLen(shelves, gap) {\n    var l = gap;\n    shelves.forEach(function (sh) { l += sh.h + gap; });\n    return l;\n  }\n\n  // Regale auf Rollen verteilen (First-Fit Decreasing), Rest als Meterware\n  function binShelves(shelves, R, gap) {\n    var sorted = shelves.slice().sort(function (a, b) { return b.h - a.h; });\n    var bins = [];\n    sorted.forEach(function (sh) {\n      var ok = false;\n      for (var i = 0; i < bins.length; i++) {\n        if (bins[i].len + sh.h + gap <= R) { bins[i].shelves.push(sh); bins[i].len += sh.h + gap; ok = true; break; }\n      }\n      if (!ok) bins.push({ shelves: [sh], len: gap + sh.h + gap });\n    });\n    bins.sort(function (a, b) { return b.len - a.len; }); // vollste Rollen zuerst\n    return bins;\n  }\n\n  // G\u00FCnstigste Materialkombination f\u00FCr eine Breite\n  // meter: {price} oder null ; rolls: [{price, lengthMm, id}]\n  function bestMaterial(packed, gap, meter, rolls, minMeters) {\n    var shelves = packed.shelves, options = [];\n    var minM = minMeters || 1;\n    if (meter) {\n      var m = Math.max(minM, Math.ceil(packed.length / 1000 - 1e-9));\n      options.push({ rolls: 0, roll: null, meters: m, cost: m * meter.price, segments: [{ type: 'meter', shelves: shelves, cap: m * 1000 }] });\n    }\n    rolls.forEach(function (roll) {\n      if (shelves.some(function (sh) { return sh.h + 2 * gap > roll.lengthMm; })) return;\n      var bins = binShelves(shelves, roll.lengthMm, gap);\n      // nur Rollen\n      options.push({ rolls: bins.length, roll: roll, meters: 0, cost: bins.length * roll.price,\n        segments: bins.map(function (b) { return { type: 'roll', shelves: b.shelves, cap: roll.lengthMm }; }) });\n      // k volle Rollen + Rest als Meterware\n      if (meter) {\n        for (var k = 1; k < bins.length; k++) {\n          var rest = [];\n          bins.slice(k).forEach(function (b) { rest = rest.concat(b.shelves); });\n          var mm = Math.max(minM, Math.ceil(segLen(rest, gap) / 1000 - 1e-9));\n          var segs = bins.slice(0, k).map(function (b) { return { type: 'roll', shelves: b.shelves, cap: roll.lengthMm }; });\n          segs.push({ type: 'meter', shelves: rest, cap: mm * 1000 });\n          options.push({ rolls: k, roll: roll, meters: mm, cost: k * roll.price + mm * meter.price, segments: segs });\n        }\n      }\n    });\n    // nur, was auch verf\u00FCgbar ist (lim = verf\u00FCgbarer Bestand bei Varianten mit Bestandsf\u00FChrung)\n    options = options.filter(function (o) {\n      if (o.meters && meter && meter.lim != null && o.meters > meter.lim) return false;\n      if (o.rolls && o.roll && o.roll.lim != null && o.rolls > o.roll.lim) return false;\n      return true;\n    });\n    if (!options.length) return null;\n    options.sort(function (a, b) {\n      if (Math.abs(a.cost - b.cost) > 0.5) return a.cost - b.cost;\n      return (a.rolls + a.meters) - (b.rolls + b.meters);\n    });\n    return options[0];\n  }\n\n  var api = { pack: pack, bestMaterial: bestMaterial, segLen: segLen };\n  if (typeof module !== 'undefined' && module.exports) module.exports = api;\n  else root.FDPlotCore = api;\n})(this);\n"],
  "mappings": "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",
  "names": []
}
