Files
cut-abstractions/samples/moduleManager/RectOptimizeWorker/RectOptimizeMachine.js
2025-07-22 18:38:25 +08:00

1753 lines
64 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (g && (g = 0, op[0] && (_ = 0)), _) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.RectOptimizeMachine = void 0;
var bang_1 = require("./bang");
var RectOptimizeMachine = /** @class */ (function () {
function RectOptimizeMachine() {
this._Stop = false;
}
RectOptimizeMachine.prototype.Stop = function (d) {
console.log('优化 stop=》RectOptimizeMachine', d);
this._Stop = true;
};
/**
* @param xbangs 小板
* @param bigBang 大板(N个元素前N-1个元素表示余料板且余料板须为矩形第N个元素表示大板)
* @param bigBangSL 余料板数量(bigBang中前N-1个元素对应的数量如果bigBang中只有一个元素即只有大板没有余料板则为空数组)
* @param xyhcs 新优化次数
* @param isdtwosided 双面加工的小板是否优先排入
* @param gap 排版缝隙 = 开料刀直径 + 缝隙
* @param hssf 规则排版
* @param YuLiaoBoardDo2FaceBlock 余料板是否排入双面加工的小板
*/
RectOptimizeMachine.prototype.Start = function (xbangs, bigBang, bigBangSL, xyhcs, isdtwosided, gap, hssf, YuLiaoBoardDo2FaceBlock) {
return __awaiter(this, void 0, void 0, function () {
var bestFit, bestInv, i, inv, re_ylb, fit, qfsh, tempArr, info;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
this._Stop = false;
bestFit = Number.POSITIVE_INFINITY // 最佳的利用率 35*10 + 最后一张板
;
i = 0;
fit = null;
_a.label = 1;
case 1:
if (!!this._Stop) return [3 /*break*/, 3];
qfsh = hssf ? false : i % 2 === 0 // 电子锯算法, 永远不合并空间
;
tempArr = SnameYH(xbangs.slice(), bigBang, bigBangSL, xyhcs, qfsh, isdtwosided, gap, YuLiaoBoardDo2FaceBlock);
inv = tempArr[0];
re_ylb = tempArr[1];
if (xbangs.length > 1000) {
// debugger
}
fit = GetInvFit(inv);
info = {
times: i,
type: 'loop'
};
if (fit < bestFit) {
bestFit = fit;
bestInv = inv;
this.CallBack(inv, re_ylb, fit, info);
}
/** 优化次数限制 逻辑 */
// if (xyhcs == i) {
// await this.Stop(info);
// info.type = 'stop'
// this.CallBack(inv, re_ylb, fit, info)
// }
return [4 /*yield*/, Sleep(Math.max(5, 20 - Math.floor(xbangs.length / 10000)))];
case 2:
/** 优化次数限制 逻辑 */
// if (xyhcs == i) {
// await this.Stop(info);
// info.type = 'stop'
// this.CallBack(inv, re_ylb, fit, info)
// }
_a.sent();
i++;
return [3 /*break*/, 1];
case 3: return [2 /*return*/];
}
});
});
};
return RectOptimizeMachine;
}());
exports.RectOptimizeMachine = RectOptimizeMachine;
// 优化所有余料
function YLYH_all(xbangs, yuliao_bang, ylzs, xyhcs, qfsh, isdtwosided, gap, YuLiaoBoardDo2FaceBlock) {
var get_regelt = [];
var temp_yan_bang = [];
var re_Bigbang = [];
temp_yan_bang = [];
// console.log('余料总数:', ylzs)
for (var i = 0; i < ylzs.length; i++) {
if (xbangs.length == 0) {
break;
}
else {
temp_yan_bang = [];
for (var sl = 0; sl < ylzs[i]; sl++) {
temp_yan_bang.push(yuliao_bang[i]);
}
var temp = [];
temp = ylyh(xbangs, temp_yan_bang, xyhcs, qfsh, isdtwosided, gap, YuLiaoBoardDo2FaceBlock);
for (var yhsl = 0; yhsl < temp[0].length; yhsl++) {
get_regelt.push(temp[0][yhsl]);
}
for (var ylsl = 0; ylsl < temp[2].length; ylsl++) {
re_Bigbang.push(temp[2][ylsl]);
}
xbangs = temp[1].slice();
// re_Bigbang.push(temp[2].slice());
}
}
return [get_regelt, xbangs, re_Bigbang];
}
// 优化余料中的一个尺寸的小板
function ylyh(xbangs, yuliao_bang, xyhcs, qfsh, isdtwosided, gap, YuLiaoBoardDo2FaceBlock) {
var finbang;
var yh_result = [];
var l;
var w;
var ylzs; // 余料张数
var temp_yan_bang = [];
var re_yan_bang = [];
var temp_max_YH = [];
temp_yan_bang = [];
temp_yan_bang.push(yuliao_bang[0]);
l = yuliao_bang[0].l;
w = yuliao_bang[0].w;
if (YuLiaoBoardDo2FaceBlock) // 余料板允许加入双面小板
{
finbang = find_bang_k_g(l, w, xbangs, false).slice();
}
else {
finbang = find_bang_k_g(l, w, xbangs, true).slice();
}
if (finbang.length > 0) {
if (YuLiaoBoardDo2FaceBlock) // 余料板允许加入双面小板
{
temp_max_YH = YHJS(finbang, temp_yan_bang, xyhcs, qfsh, isdtwosided, gap); // 余料板 不优先 双面加工板
}
else {
temp_max_YH = YHJS(finbang, temp_yan_bang, xyhcs, qfsh, false, gap);
}
if (yuliao_bang.length > temp_max_YH.length) {
ylzs = temp_max_YH.length;
}
else {
ylzs = yuliao_bang.length;
}
for (var i = 0; i < ylzs; i++) {
yh_result.push(temp_max_YH[i]);
re_yan_bang.push(yuliao_bang[0]);
for (var n = 0; n < temp_max_YH[i].length; n++) {
for (var bsl = xbangs.length - 1; bsl >= 0; bsl--)
if (temp_max_YH[i][n].bangid == xbangs[bsl].id) {
xbangs.splice(bsl, 1);
}
}
}
}
return [yh_result, xbangs, re_yan_bang];
}
// 相同板材优化
function SnameYH(xbangs, B_bang, ylsl, xyhcs, qfsh, isdtwosided, gap, YuLiaoBoardDo2FaceBlock) {
var same_yh_bang = [];
var temp_max_YH = [];
var ylbang_max_yh = [];
var temp_same_yh;
var isend = false;
var Bigbang = [];
Bigbang.push(B_bang[B_bang.length - 1]);
var ylbang = B_bang.slice();
ylbang.pop();
var tempresult = [];
tempresult = YLYH_all(xbangs, ylbang, ylsl, xyhcs, qfsh, isdtwosided, gap, YuLiaoBoardDo2FaceBlock); // 余料优化
for (var i = 0; i < tempresult[0].length; i++) {
same_yh_bang.push(tempresult[0][i]);
}
xbangs = tempresult[1].slice();
ylbang_max_yh = tempresult[2].slice();
while (isend === false) {
if (xbangs.length == 0) {
break;
}
temp_max_YH = YHJS(xbangs, Bigbang, xyhcs, qfsh, isdtwosided, gap);
temp_same_yh = Get_bs_bang(temp_max_YH, xbangs, isdtwosided);
for (var i = 0; i < temp_same_yh[0].length; i++) {
same_yh_bang.push(temp_same_yh[0][i]);
xbangs = temp_same_yh[1].slice();
}
}
return [same_yh_bang, ylbang_max_yh];
}
// 优化计算.
function YHJS(xbangs, B_bang, cs, qfsh, isdtwosided, gap) {
var xbangs_bak = xbangs.slice();
var bestFit = Number.POSITIVE_INFINITY;
// let bestFit = Infinity;
var bestInv;
for (var i = 0; i < cs; i++) {
xbangs = xbangs_bak.slice();
var result_yh = void 0;
if (qfsh)
result_yh = CBJS(xbangs, B_bang, gap, isdtwosided);
else
result_yh = CBJS1(xbangs, B_bang, gap, isdtwosided);
var fit_1 = GetInvFit(result_yh);
if (fit_1 < bestFit) {
bestFit = fit_1;
bestInv = result_yh;
}
}
return bestInv;
}
// 得到利用率最高板材,及返回倍数板及剩下的小板
function Get_bs_bang(inv, listbang, isdtwosided) {
var bestCon = arrayMax(inv, GetConFit)[0]; // 最优大板
var temp_yh_bang = [];
var temp_list_yh_bang = [];
var isfindend = false;
while (isfindend == false) {
if (listbang.length == 0) {
break;
}
var unPlacelist = listbang.slice();
for (var _i = 0, bestCon_1 = bestCon; _i < bestCon_1.length; _i++) {
var br = bestCon_1[_i];
var temp_result = find_same_bang(br.pbg, br.pbk, unPlacelist, isdtwosided);
if (temp_result.findid > -1) // 找到合适的板
{
temp_yh_bang.push({
bangid: temp_result.id,
line: temp_result.line,
x: br.x,
y: br.y,
pbg: temp_result.pbg,
pbk: temp_result.pbk,
});
unPlacelist.splice(temp_result.findid, 1); // 这里不会错误的原因是 必然会有一次成功 并且下面会备份这个数组
}
else // 没找到 合适的板 退出
{
isfindend = true;
break;
}
}
if (isfindend == false) // 找到合适的
{
temp_list_yh_bang.push(temp_yh_bang);
temp_yh_bang = [];
listbang = unPlacelist.slice(); // 备份数组
}
}
return [temp_list_yh_bang, listbang];
}
function GetInvFit(inv) {
var fit = (inv.length - 1) * 10;
fit += GetConFit(arrayLast(inv));
return fit;
}
function GetConFit(con) {
var fit = 0;
for (var _i = 0, con_1 = con; _i < con_1.length; _i++) {
var p = con_1[_i];
fit += p.pbg * p.pbk * 1e-6;
}
return fit;
}
// 初步优化计算 横竖算法,无空间合并
function CBJS1(Listbang, yanbang, dt, isdtwosided) {
var yanbang_bk = yanbang.slice();
// let zfkj: Big_bang[] = [];
// let list_zfkj: (Big_bang[])[] = [];
var list_yh_bng = [];
// let list_yang_bang: (Big_bang[])[] = [];
var result_yh = [];
while (Listbang.length > 0) {
// zfkj = [];
yanbang = yanbang_bk.slice();
result_yh = [];
while (yanbang.length > 0) {
var lx = Math.floor(Math.random() * 3); // lx:0 面积最大 1 最高 2 最宽
var fs = void 0; // fs:留板方式0:左右 1上下
if (Math.floor(Math.random() * 2) == 0) {
fs = false;
}
else {
fs = true;
}
var get_result = [];
get_result = jsyb(yanbang[0], lx, fs, dt, Listbang, isdtwosided); // lx:0面积最大 1最高 2最宽 fs:取板方式false:左右(取同宽) true上下(取同高) dt:刀头间隙
yanbang.shift();
if (get_result[0] > 0) {
for (var i = 0; i < get_result[0]; i++)
yanbang.push(get_result[2][i]);
}
if (get_result[1] > 0) {
for (var i = 0; i < get_result[1]; i++)
result_yh.push(get_result[3][i]);
}
Listbang = get_result[4].slice();
if (Listbang.length == 0) {
break;
}
}
// list_zfkj.push(zfkj);
list_yh_bng.push(result_yh);
// list_yang_bang.push(yanbang);
// list_zfkj.push(zfkj);
// Draw_Yan_bang(yanbang, 3, 0);
// Draw_Yan_bang(zfkj, 5, 0);
}
// return [list_yh_bng, list_zfkj, list_yang_bang];
return list_yh_bng;
}
// 初步优化计算 交叉算法,有空间合并
function CBJS(Listbang, yanbang, dt, isdtwosided) {
var yanbang_bk = yanbang.slice();
// let zfkj: Big_bang[] = [];
// let list_zfkj: (Big_bang[])[] = [];
var list_yh_bng = [];
// let list_yang_bang: (Big_bang[])[] = [];
var result_yh = [];
// let temp: number = 0;
while (Listbang.length > 0) // while (temp < 2)//
{
// temp++;
// zfkj = [];
yanbang = yanbang_bk.slice();
result_yh = [];
while (yanbang.length > 0) {
var lx = Math.floor(Math.random() * 3); // lx:0 面积最大 1 最高 2 最宽
var fs = void 0; // fs:留板方式0:左右 1上下
if (Math.floor(Math.random() * 2) == 0) {
fs = false;
}
else {
fs = true;
}
var get_result = [];
var temp_yanbang = [];
temp_yanbang = HBKJ(yanbang, Listbang, dt);
yanbang = temp_yanbang[0];
get_result = jsyb1(yanbang[temp_yanbang[1]], lx, fs, dt, Listbang, isdtwosided); // lx:0面积最大 1最高 2最宽 fs:取板方式false:取同宽) true取同高) dt:刀头间隙
yanbang.splice(temp_yanbang[1], 1);
if (get_result[0] > 0) {
for (var i = 0; i < get_result[0]; i++)
yanbang.push(get_result[2][i]);
}
if (get_result[1] > 0) {
for (var i = 0; i < get_result[1]; i++)
result_yh.push(get_result[3][i]);
}
Listbang = get_result[4].slice();
if (Listbang.length == 0) {
break;
}
}
// list_zfkj.push(zfkj);
list_yh_bng.push(result_yh);
// list_yang_bang.push(yanbang);
// list_zfkj.push(zfkj);
// Draw_Yan_bang(yanbang, 3, 0);
// Draw_Yan_bang(zfkj, 5, 0);
}
// return [list_yh_bng, list_zfkj, list_yang_bang];
return list_yh_bng;
}
// 空间合并(相加)
function hb(yanbang, dt) {
var i = -1;
yanbang.sort(function (a1, a2) { return a1.x - a2.x; });
while (true) {
i++;
if (yanbang.length < 2 || i === yanbang.length - 1)
break;
if (yanbang[i].y === yanbang[i + 1].y
&& yanbang[i].x + yanbang[i].w + dt === yanbang[i + 1].x
&& yanbang[i].l === yanbang[i + 1].l) {
yanbang[i].w = yanbang[i].w + yanbang[i + 1].w + dt;
yanbang.splice(i + 1, 1);
i = -1;
}
}
return yanbang;
}
// 整理空间
function zlkj(yanbang, listbang, dt) {
var k;
var g;
var isjshb = true; // false 继续合并 ture 不在合并
var minY = 100000;
var yanindex;
if (listbang.length == 0)
return [yanbang, true];
for (var i = 0; i < yanbang.length; i++) {
if (yanbang[i].y < minY) {
minY = yanbang[i].y;
yanindex = i;
}
}
k = yanbang[yanindex].w;
g = yanbang[yanindex].l;
if (yanindex == 0 && yanbang.length > 1) {
if (yanbang[yanindex].x + yanbang[yanindex].w + dt == yanbang[yanindex + 1].x) // && yanbang[i].y + yanbang[i].l == yanbang[i + 1].y + yanbang[i + 1].l)
{
if (find_max_mz(g, k, listbang, false).findid == -1) {
yanbang[yanindex].y = yanbang[yanindex + 1].y;
yanbang[yanindex].l = yanbang[yanindex + 1].l;
isjshb = false;
}
}
}
else if (yanindex == yanbang.length - 1 && yanbang.length > 1) {
if (yanbang[yanindex - 1].x + yanbang[yanindex - 1].w + dt == yanbang[yanindex].x && yanbang.length > 1) // && yanbang[i].y + yanbang[i].l == yanbang[i - 1].y + yanbang[i - 1].l && (yanbang[i - 1].x + yanbang[i - 1].w + dt == yanbang[i].x))
{
if (find_max_mz(g, k, listbang, false).findid == -1) {
yanbang[yanindex].y = yanbang[yanindex - 1].y;
yanbang[yanindex].l = yanbang[yanindex - 1].l;
isjshb = false;
}
}
}
else if (yanbang.length > 1) {
if (yanbang[yanindex - 1].y > yanbang[yanindex + 1].y) {
if (yanbang[yanindex].x + yanbang[yanindex].w + dt == yanbang[yanindex + 1].x) // && yanbang[i].y + yanbang[i].l == yanbang[i + 1].y + yanbang[i + 1].l)
{
if (find_max_mz(g, k, listbang, false).findid == -1) {
yanbang[yanindex].y = yanbang[yanindex + 1].y;
yanbang[yanindex].l = yanbang[yanindex + 1].l;
isjshb = false;
}
}
}
else {
if (yanbang[yanindex - 1].x + yanbang[yanindex - 1].w + dt == yanbang[yanindex].x) // && yanbang.length > 1 && yanbang[i].y + yanbang[i].l == yanbang[i - 1].y + yanbang[i - 1].l && (yanbang[i - 1].x + yanbang[i - 1].w + dt == yanbang[i].x))
{
if (find_max_mz(g, k, listbang, false).findid == -1) {
yanbang[yanindex].y = yanbang[yanindex - 1].y;
yanbang[yanindex].l = yanbang[yanindex - 1].l;
isjshb = false;
}
}
}
}
// console.log("zlkj");
// console.log(g, k);
// console.log(yanbang);
// console.log(listbang);
// Sleep(0);
return [yanbang, isjshb];
}
// 合并空间
function HBKJ(yanbang, listbang, dt) {
var get_result;
var minY = 10000;
var yanindex;
get_result = hb(yanbang, dt);
yanbang = get_result;
var isend = false;
while (isend == false) {
if (yanbang.length == 1) {
break;
}
for (var i = 0; i < yanbang.length; i++) {
var temp_result = [];
temp_result = zlkj(yanbang, listbang, dt);
if (temp_result[1] == false) {
yanbang = temp_result[0];
get_result = hb(yanbang, dt);
yanbang = get_result;
}
else
isend = true;
}
}
for (var i = 0; i < yanbang.length; i++) {
if (yanbang[i].y < minY) {
minY = yanbang[i].y;
yanindex = i;
}
}
return [yanbang, yanindex];
}
// 寻找符合面积的板
function find_bang_k_g(g, k, Listbang, oneFaceBlock) {
var finbang = [];
if (oneFaceBlock == true) {
for (var i = 0; i < Listbang.length; i++) {
if (Listbang[i].line == 0) {
if (Listbang[i].l <= g && Listbang[i].w <= k && Listbang[i].isdtwosided == false) {
finbang.push(Listbang[i]);
}
}
else if (Listbang[i].line == 1) {
if (Listbang[i].l <= k && Listbang[i].w <= g && Listbang[i].isdtwosided == false) {
finbang.push(Listbang[i]);
}
}
else {
if (Listbang[i].l <= g && Listbang[i].w <= k && Listbang[i].isdtwosided == false) {
finbang.push(Listbang[i]);
}
else if (Listbang[i].l <= k && Listbang[i].w <= g && Listbang[i].isdtwosided == false) {
finbang.push(Listbang[i]);
}
}
}
}
else {
for (var i = 0; i < Listbang.length; i++) {
if (Listbang[i].line == 0) {
if (Listbang[i].l <= g && Listbang[i].w <= k) {
finbang.push(Listbang[i]);
}
}
else if (Listbang[i].line == 1) {
if (Listbang[i].l <= k && Listbang[i].w <= g) {
finbang.push(Listbang[i]);
}
}
else {
if (Listbang[i].l <= g && Listbang[i].w <= k) {
finbang.push(Listbang[i]);
}
else if (Listbang[i].l <= k && Listbang[i].w <= g) {
finbang.push(Listbang[i]);
}
}
}
}
return finbang;
} // 寻找面积最的板
// 寻找面积最大的板
function find_max_mz(g, k, Listbang, isdtwosided) {
var max = 0;
var bangindex = -1;
var line = bang_1.LineType.Positive;
var pbg = 0;
var pbk = 0;
var bangid = 0;
var temp_max;
if (isdtwosided == true) {
for (var i = 0; i < Listbang.length; i++) {
temp_max = Listbang[i].l * Listbang[i].w / 1000000;
if (Listbang[i].line == 0) {
if (Listbang[i].l <= g && Listbang[i].w <= k && max < temp_max && Listbang[i].isdtwosided == true) {
max = temp_max;
bangindex = i;
line = 0;
pbg = Listbang[i].l;
pbk = Listbang[i].w;
bangid = Listbang[i].id;
}
}
else if (Listbang[i].line == 1) {
if (Listbang[i].l <= k && Listbang[i].w <= g && max < temp_max && Listbang[i].isdtwosided == true) {
max = temp_max;
bangindex = i;
line = 1;
pbg = Listbang[i].w;
pbk = Listbang[i].l;
bangid = Listbang[i].id;
}
}
else {
if (Listbang[i].l <= g && Listbang[i].w <= k && max < temp_max && Listbang[i].isdtwosided == true) {
max = temp_max;
bangindex = i;
line = 0;
pbg = Listbang[i].l;
pbk = Listbang[i].w;
bangid = Listbang[i].id;
}
else if (Listbang[i].l <= k && Listbang[i].w <= g && max < temp_max && Listbang[i].isdtwosided == true) {
max = temp_max;
bangindex = i;
line = 1;
pbg = Listbang[i].w;
pbk = Listbang[i].l;
bangid = Listbang[i].id;
}
}
}
if (bangindex == -1) {
for (var i = 0; i < Listbang.length; i++) {
temp_max = Listbang[i].l * Listbang[i].w / 1000000;
if (Listbang[i].line == 0) {
if (Listbang[i].l <= g && Listbang[i].w <= k && max < temp_max) {
max = temp_max;
bangindex = i;
line = 0;
pbg = Listbang[i].l;
pbk = Listbang[i].w;
bangid = Listbang[i].id;
}
}
else if (Listbang[i].line == 1) {
if (Listbang[i].l <= k && Listbang[i].w <= g && max < temp_max) {
max = temp_max;
bangindex = i;
line = 1;
pbg = Listbang[i].w;
pbk = Listbang[i].l;
bangid = Listbang[i].id;
}
}
else {
if (Listbang[i].l <= g && Listbang[i].w <= k && max < temp_max) {
max = temp_max;
bangindex = i;
line = 0;
pbg = Listbang[i].l;
pbk = Listbang[i].w;
bangid = Listbang[i].id;
}
else if (Listbang[i].l <= k && Listbang[i].w <= g && max < temp_max) {
max = temp_max;
bangindex = i;
line = 1;
pbg = Listbang[i].w;
pbk = Listbang[i].l;
bangid = Listbang[i].id;
}
}
}
}
}
else {
for (var i = 0; i < Listbang.length; i++) {
temp_max = Listbang[i].l * Listbang[i].w / 1000000;
if (Listbang[i].line == 0) {
if (Listbang[i].l <= g && Listbang[i].w <= k && max < temp_max) {
max = temp_max;
bangindex = i;
line = 0;
pbg = Listbang[i].l;
pbk = Listbang[i].w;
bangid = Listbang[i].id;
}
}
else if (Listbang[i].line == 1) {
if (Listbang[i].l <= k && Listbang[i].w <= g && max < temp_max) {
max = temp_max;
bangindex = i;
line = 1;
pbg = Listbang[i].w;
pbk = Listbang[i].l;
bangid = Listbang[i].id;
}
}
else {
if (Listbang[i].l <= g && Listbang[i].w <= k && max < temp_max) {
max = temp_max;
bangindex = i;
line = 0;
pbg = Listbang[i].l;
pbk = Listbang[i].w;
bangid = Listbang[i].id;
}
else if (Listbang[i].l <= k && Listbang[i].w <= g && max < temp_max) {
max = temp_max;
bangindex = i;
line = 1;
pbg = Listbang[i].w;
pbk = Listbang[i].l;
bangid = Listbang[i].id;
}
}
}
}
return {
findid: bangindex,
line: line,
pbg: pbg,
pbk: pbk,
id: bangid,
};
} // 寻找面积最的板
// 寻找最高的板
function find_max_g(g, k, Listbang, isdtwosided) {
var max = 0;
var bangindex = -1;
var line = bang_1.LineType.Positive;
var pbg = 0;
var pbk = 0;
var bangid = 0;
if (isdtwosided == true) {
for (var i = 0; i < Listbang.length; i++) {
if (Listbang[i].line == 0) {
if (Listbang[i].l <= g && Listbang[i].w <= k && max < Listbang[i].l && Listbang[i].isdtwosided == true) {
max = Listbang[i].l;
bangindex = i;
line = 0;
pbg = Listbang[i].l;
pbk = Listbang[i].w;
bangid = Listbang[i].id;
}
}
else if (Listbang[i].line == 1) {
if (Listbang[i].l <= k && Listbang[i].w <= g && max < Listbang[i].w && Listbang[i].isdtwosided == true) {
max = Listbang[i].w;
bangindex = i;
line = 1;
pbg = Listbang[i].w;
pbk = Listbang[i].l;
bangid = Listbang[i].id;
}
}
else {
if (Listbang[i].l <= g && Listbang[i].w <= k && max < Listbang[i].l && Listbang[i].isdtwosided == true) {
max = Listbang[i].l;
bangindex = i;
line = 0;
pbg = Listbang[i].l;
pbk = Listbang[i].w;
bangid = Listbang[i].id;
}
else if (Listbang[i].l <= k && Listbang[i].w <= g && max < Listbang[i].w && Listbang[i].isdtwosided == true) {
max = Listbang[i].w;
bangindex = i;
line = 1;
pbg = Listbang[i].w;
pbk = Listbang[i].l;
bangid = Listbang[i].id;
}
}
}
if (bangindex == -1) {
for (var i = 0; i < Listbang.length; i++) {
if (Listbang[i].line == 0) {
if (Listbang[i].l <= g && Listbang[i].w <= k && max < Listbang[i].l) {
max = Listbang[i].l;
bangindex = i;
line = 0;
pbg = Listbang[i].l;
pbk = Listbang[i].w;
bangid = Listbang[i].id;
}
}
else if (Listbang[i].line == 1) {
if (Listbang[i].l <= k && Listbang[i].w <= g && max < Listbang[i].w) {
max = Listbang[i].w;
bangindex = i;
line = 1;
pbg = Listbang[i].w;
pbk = Listbang[i].l;
bangid = Listbang[i].id;
}
}
else {
if (Listbang[i].l <= g && Listbang[i].w <= k && max < Listbang[i].l) {
max = Listbang[i].l;
bangindex = i;
line = 0;
pbg = Listbang[i].l;
pbk = Listbang[i].w;
bangid = Listbang[i].id;
}
else if (Listbang[i].l <= k && Listbang[i].w <= g && max < Listbang[i].w) {
max = Listbang[i].w;
bangindex = i;
line = 1;
pbg = Listbang[i].w;
pbk = Listbang[i].l;
bangid = Listbang[i].id;
}
}
}
}
}
else {
for (var i = 0; i < Listbang.length; i++) {
if (Listbang[i].line == 0) {
if (Listbang[i].l <= g && Listbang[i].w <= k && max < Listbang[i].l) {
max = Listbang[i].l;
bangindex = i;
line = 0;
pbg = Listbang[i].l;
pbk = Listbang[i].w;
bangid = Listbang[i].id;
}
}
else if (Listbang[i].line == 1) {
if (Listbang[i].l <= k && Listbang[i].w <= g && max < Listbang[i].w) {
max = Listbang[i].w;
bangindex = i;
line = 1;
pbg = Listbang[i].w;
pbk = Listbang[i].l;
bangid = Listbang[i].id;
}
}
else {
if (Listbang[i].l <= g && Listbang[i].w <= k && max < Listbang[i].l) {
max = Listbang[i].l;
bangindex = i;
line = 0;
pbg = Listbang[i].l;
pbk = Listbang[i].w;
bangid = Listbang[i].id;
}
else if (Listbang[i].l <= k && Listbang[i].w <= g && max < Listbang[i].w) {
max = Listbang[i].w;
bangindex = i;
line = 1;
pbg = Listbang[i].w;
pbk = Listbang[i].l;
bangid = Listbang[i].id;
}
}
}
}
return {
findid: bangindex,
line: line,
pbg: pbg,
pbk: pbk,
id: bangid,
};
}
// 寻找同高的板
function find_same_g(g, k, Listbang, isdtwosided) {
var max = g;
var bangindex = -1;
var line = bang_1.LineType.Positive;
var pbg = 0;
var pbk = 0;
var bangid = 0;
if (isdtwosided == true) {
for (var i = 0; i < Listbang.length; i++) {
if (Listbang[i].line == 0) {
if (Listbang[i].l <= g && Listbang[i].w <= k && max == Listbang[i].l && Listbang[i].isdtwosided == true) {
bangindex = i;
line = 0;
pbg = Listbang[i].l;
pbk = Listbang[i].w;
bangid = Listbang[i].id;
break;
}
}
else if (Listbang[i].line == 1) {
if (Listbang[i].l <= k && Listbang[i].w <= g && max == Listbang[i].w && Listbang[i].isdtwosided == true) {
bangindex = i;
line = 1;
pbg = Listbang[i].w;
pbk = Listbang[i].l;
bangid = Listbang[i].id;
break;
}
}
else {
if (Listbang[i].l <= g && Listbang[i].w <= k && max == Listbang[i].l && Listbang[i].isdtwosided == true) {
bangindex = i;
line = 0;
pbg = Listbang[i].l;
pbk = Listbang[i].w;
bangid = Listbang[i].id;
break;
}
else if (Listbang[i].l <= k && Listbang[i].w <= g && max == Listbang[i].w && Listbang[i].isdtwosided == true) {
bangindex = i;
line = 1;
pbg = Listbang[i].w;
pbk = Listbang[i].l;
bangid = Listbang[i].id;
break;
}
}
}
if (bangindex == -1) {
for (var i = 0; i < Listbang.length; i++) {
if (Listbang[i].line == 0) {
if (Listbang[i].l <= g && Listbang[i].w <= k && max == Listbang[i].l) {
bangindex = i;
line = 0;
pbg = Listbang[i].l;
pbk = Listbang[i].w;
bangid = Listbang[i].id;
break;
}
}
else if (Listbang[i].line == 1) {
if (Listbang[i].l <= k && Listbang[i].w <= g && max == Listbang[i].w) {
bangindex = i;
line = 1;
pbg = Listbang[i].w;
pbk = Listbang[i].l;
bangid = Listbang[i].id;
break;
}
}
else {
if (Listbang[i].l <= g && Listbang[i].w <= k && max == Listbang[i].l) {
bangindex = i;
line = 0;
pbg = Listbang[i].l;
pbk = Listbang[i].w;
bangid = Listbang[i].id;
break;
}
else if (Listbang[i].l <= k && Listbang[i].w <= g && max == Listbang[i].w) {
bangindex = i;
line = 1;
pbg = Listbang[i].w;
pbk = Listbang[i].l;
bangid = Listbang[i].id;
break;
}
}
}
}
}
else {
for (var i = 0; i < Listbang.length; i++) {
if (Listbang[i].line == 0) {
if (Listbang[i].l <= g && Listbang[i].w <= k && max == Listbang[i].l) {
bangindex = i;
line = 0;
pbg = Listbang[i].l;
pbk = Listbang[i].w;
bangid = Listbang[i].id;
break;
}
}
else if (Listbang[i].line == 1) {
if (Listbang[i].l <= k && Listbang[i].w <= g && max == Listbang[i].w) {
bangindex = i;
line = 1;
pbg = Listbang[i].w;
pbk = Listbang[i].l;
bangid = Listbang[i].id;
break;
}
}
else {
if (Listbang[i].l <= g && Listbang[i].w <= k && max == Listbang[i].l) {
bangindex = i;
line = 0;
pbg = Listbang[i].l;
pbk = Listbang[i].w;
bangid = Listbang[i].id;
break;
}
else if (Listbang[i].l <= k && Listbang[i].w <= g && max == Listbang[i].w) {
bangindex = i;
line = 1;
pbg = Listbang[i].w;
pbk = Listbang[i].l;
bangid = Listbang[i].id;
break;
}
}
}
}
return {
findid: bangindex,
line: line,
pbg: pbg,
pbk: pbk,
id: bangid,
};
} // 寻找同高的板
// 寻找最宽的板
function find_max_k(g, k, Listbang, isdtwosided) {
var max = 0;
var bangindex = -1;
var line = bang_1.LineType.Positive;
var pbg = 0;
var pbk = 0;
var bangid = 0;
if (isdtwosided == true) {
for (var i = 0; i < Listbang.length; i++) {
if (Listbang[i].line == 0) {
if (Listbang[i].l <= g && Listbang[i].w <= k && max < Listbang[i].w && Listbang[i].isdtwosided == true) {
max = Listbang[i].w;
bangindex = i;
line = 0;
pbg = Listbang[i].l;
pbk = Listbang[i].w;
bangid = Listbang[i].id;
}
}
else if (Listbang[i].line == 1) {
if (Listbang[i].l <= k && Listbang[i].w <= g && max < Listbang[i].l && Listbang[i].isdtwosided == true) {
max = Listbang[i].l;
bangindex = i;
line = 1;
pbg = Listbang[i].w;
pbk = Listbang[i].l;
bangid = Listbang[i].id;
}
}
else {
if (Listbang[i].l <= g && Listbang[i].w <= k && max < Listbang[i].w && Listbang[i].isdtwosided == true) {
max = Listbang[i].w;
bangindex = i;
line = 0;
pbg = Listbang[i].l;
pbk = Listbang[i].w;
bangid = Listbang[i].id;
}
else if (Listbang[i].l <= k && Listbang[i].w <= g && max < Listbang[i].l && Listbang[i].isdtwosided == true) {
max = Listbang[i].l;
bangindex = i;
line = 1;
pbg = Listbang[i].w;
pbk = Listbang[i].l;
bangid = Listbang[i].id;
}
}
}
if (bangindex == -1) {
for (var i = 0; i < Listbang.length; i++) {
if (Listbang[i].line == 0) {
if (Listbang[i].l <= g && Listbang[i].w <= k && max < Listbang[i].w) {
max = Listbang[i].w;
bangindex = i;
line = 0;
pbg = Listbang[i].l;
pbk = Listbang[i].w;
bangid = Listbang[i].id;
}
}
else if (Listbang[i].line == 1) {
if (Listbang[i].l <= k && Listbang[i].w <= g && max < Listbang[i].l) {
max = Listbang[i].l;
bangindex = i;
line = 1;
pbg = Listbang[i].w;
pbk = Listbang[i].l;
bangid = Listbang[i].id;
}
}
else {
if (Listbang[i].l <= g && Listbang[i].w <= k && max < Listbang[i].w) {
max = Listbang[i].w;
bangindex = i;
line = 0;
pbg = Listbang[i].l;
pbk = Listbang[i].w;
bangid = Listbang[i].id;
}
else if (Listbang[i].l <= k && Listbang[i].w <= g && max < Listbang[i].l) {
max = Listbang[i].l;
bangindex = i;
line = 1;
pbg = Listbang[i].w;
pbk = Listbang[i].l;
bangid = Listbang[i].id;
}
}
}
}
}
else {
for (var i = 0; i < Listbang.length; i++) {
if (Listbang[i].line == 0) {
if (Listbang[i].l <= g && Listbang[i].w <= k && max < Listbang[i].w) {
max = Listbang[i].w;
bangindex = i;
line = 0;
pbg = Listbang[i].l;
pbk = Listbang[i].w;
bangid = Listbang[i].id;
}
}
else if (Listbang[i].line == 1) {
if (Listbang[i].l <= k && Listbang[i].w <= g && max < Listbang[i].l) {
max = Listbang[i].l;
bangindex = i;
line = 1;
pbg = Listbang[i].w;
pbk = Listbang[i].l;
bangid = Listbang[i].id;
}
}
else {
if (Listbang[i].l <= g && Listbang[i].w <= k && max < Listbang[i].w) {
max = Listbang[i].w;
bangindex = i;
line = 0;
pbg = Listbang[i].l;
pbk = Listbang[i].w;
bangid = Listbang[i].id;
}
else if (Listbang[i].l <= k && Listbang[i].w <= g && max < Listbang[i].l) {
max = Listbang[i].l;
bangindex = i;
line = 1;
pbg = Listbang[i].w;
pbk = Listbang[i].l;
bangid = Listbang[i].id;
}
}
}
}
return {
findid: bangindex,
line: line,
pbg: pbg,
pbk: pbk,
id: bangid,
};
} // 寻找最高的板
// 寻同宽的板
function find_same_k(g, k, Listbang, isdtwosided) {
var max = k;
var bangindex = -1;
var line = bang_1.LineType.Positive;
var pbg = 0;
var pbk = 0;
var bangid = 0;
if (isdtwosided == true) {
for (var i = 0; i < Listbang.length; i++) {
if (Listbang[i].line == 0) {
if (Listbang[i].l <= g && Listbang[i].w <= k && max == Listbang[i].w && Listbang[i].isdtwosided == true) {
bangindex = i;
line = 0;
pbg = Listbang[i].l;
pbk = Listbang[i].w;
bangid = Listbang[i].id;
break;
}
}
else if (Listbang[i].line == 1) {
if (Listbang[i].l <= k && Listbang[i].w <= g && max == Listbang[i].l && Listbang[i].isdtwosided == true) {
bangindex = i;
line = 1;
pbg = Listbang[i].w;
pbk = Listbang[i].l;
bangid = Listbang[i].id;
break;
}
}
else {
if (Listbang[i].l <= g && Listbang[i].w <= k && max == Listbang[i].w && Listbang[i].isdtwosided == true) {
bangindex = i;
line = 0;
pbg = Listbang[i].l;
pbk = Listbang[i].w;
bangid = Listbang[i].id;
break;
}
else if (Listbang[i].l <= k && Listbang[i].w <= g && max == Listbang[i].l && Listbang[i].isdtwosided == true) {
bangindex = i;
line = 1;
pbg = Listbang[i].w;
pbk = Listbang[i].l;
bangid = Listbang[i].id;
break;
}
}
}
if (bangindex == -1) {
for (var i = 0; i < Listbang.length; i++) {
if (Listbang[i].line == 0) {
if (Listbang[i].l <= g && Listbang[i].w <= k && max == Listbang[i].w) {
bangindex = i;
line = 0;
pbg = Listbang[i].l;
pbk = Listbang[i].w;
bangid = Listbang[i].id;
break;
}
}
else if (Listbang[i].line == 1) {
if (Listbang[i].l <= k && Listbang[i].w <= g && max == Listbang[i].l) {
bangindex = i;
line = 1;
pbg = Listbang[i].w;
pbk = Listbang[i].l;
bangid = Listbang[i].id;
break;
}
}
else {
if (Listbang[i].l <= g && Listbang[i].w <= k && max == Listbang[i].w) {
bangindex = i;
line = 0;
pbg = Listbang[i].l;
pbk = Listbang[i].w;
bangid = Listbang[i].id;
break;
}
else if (Listbang[i].l <= k && Listbang[i].w <= g && max == Listbang[i].l) {
bangindex = i;
line = 1;
pbg = Listbang[i].w;
pbk = Listbang[i].l;
bangid = Listbang[i].id;
break;
}
}
}
}
}
else {
for (var i = 0; i < Listbang.length; i++) {
if (Listbang[i].line == 0) {
if (Listbang[i].l <= g && Listbang[i].w <= k && max == Listbang[i].w) {
bangindex = i;
line = 0;
pbg = Listbang[i].l;
pbk = Listbang[i].w;
bangid = Listbang[i].id;
break;
}
}
else if (Listbang[i].line == 1) {
if (Listbang[i].l <= k && Listbang[i].w <= g && max == Listbang[i].l) {
bangindex = i;
line = 1;
pbg = Listbang[i].w;
pbk = Listbang[i].l;
bangid = Listbang[i].id;
break;
}
}
else {
if (Listbang[i].l <= g && Listbang[i].w <= k && max == Listbang[i].w) {
bangindex = i;
line = 0;
pbg = Listbang[i].l;
pbk = Listbang[i].w;
bangid = Listbang[i].id;
break;
}
else if (Listbang[i].l <= k && Listbang[i].w <= g && max == Listbang[i].l) {
bangindex = i;
line = 1;
pbg = Listbang[i].w;
pbk = Listbang[i].l;
bangid = Listbang[i].id;
break;
}
}
}
}
return {
findid: bangindex,
line: line,
pbg: pbg,
pbk: pbk,
id: bangid,
};
} // 寻同宽的板
// 找到同样大小尺寸的板材 && Listbang[i].isdtwosided == true)
function find_same_bang(g, k, Listbang, isdtwosided) {
var bangindex = -1;
var line = bang_1.LineType.Positive;
var pbg = 0;
var pbk = 0;
var bangid = 0;
if (isdtwosided == true) {
for (var i = 0; i < Listbang.length; i++) {
if (Listbang[i].line == 0) {
if (Listbang[i].l == g && Listbang[i].w == k && Listbang[i].isdtwosided == true) {
bangindex = i;
line = 0;
pbg = Listbang[i].l;
pbk = Listbang[i].w;
bangid = Listbang[i].id;
break;
}
}
else if (Listbang[i].line == 1) {
if (Listbang[i].l == k && Listbang[i].w == g && Listbang[i].isdtwosided == true) {
bangindex = i;
line = 1;
pbg = Listbang[i].w;
pbk = Listbang[i].l;
bangid = Listbang[i].id;
break;
}
}
else {
if (Listbang[i].l == g && Listbang[i].w == k && Listbang[i].isdtwosided == true) {
bangindex = i;
line = 0;
pbg = Listbang[i].l;
pbk = Listbang[i].w;
bangid = Listbang[i].id;
break;
}
else if (Listbang[i].l == k && Listbang[i].w == g && Listbang[i].isdtwosided == true) {
bangindex = i;
line = 1;
pbg = Listbang[i].w;
pbk = Listbang[i].l;
bangid = Listbang[i].id;
break;
}
}
}
if (bangindex == -1) {
for (var i = 0; i < Listbang.length; i++) {
if (Listbang[i].line == 0) {
if (Listbang[i].l == g && Listbang[i].w == k) {
bangindex = i;
line = 0;
pbg = Listbang[i].l;
pbk = Listbang[i].w;
bangid = Listbang[i].id;
break;
}
}
else if (Listbang[i].line == 1) {
if (Listbang[i].l == k && Listbang[i].w == g) {
bangindex = i;
line = 1;
pbg = Listbang[i].w;
pbk = Listbang[i].l;
bangid = Listbang[i].id;
break;
}
}
else {
if (Listbang[i].l == g && Listbang[i].w == k) {
bangindex = i;
line = 0;
pbg = Listbang[i].l;
pbk = Listbang[i].w;
bangid = Listbang[i].id;
break;
}
else if (Listbang[i].l == k && Listbang[i].w == g) {
bangindex = i;
line = 1;
pbg = Listbang[i].w;
pbk = Listbang[i].l;
bangid = Listbang[i].id;
break;
}
}
}
}
}
else {
for (var i = 0; i < Listbang.length; i++) {
if (Listbang[i].line == 0) {
if (Listbang[i].l == g && Listbang[i].w == k) {
bangindex = i;
line = 0;
pbg = Listbang[i].l;
pbk = Listbang[i].w;
bangid = Listbang[i].id;
break;
}
}
else if (Listbang[i].line == 1) {
if (Listbang[i].l == k && Listbang[i].w == g) {
bangindex = i;
line = 1;
pbg = Listbang[i].w;
pbk = Listbang[i].l;
bangid = Listbang[i].id;
break;
}
}
else {
if (Listbang[i].l == g && Listbang[i].w == k) {
bangindex = i;
line = 0;
pbg = Listbang[i].l;
pbk = Listbang[i].w;
bangid = Listbang[i].id;
break;
}
else if (Listbang[i].l == k && Listbang[i].w == g) {
bangindex = i;
line = 1;
pbg = Listbang[i].w;
pbk = Listbang[i].l;
bangid = Listbang[i].id;
break;
}
}
}
}
return {
findid: bangindex,
line: line,
pbg: pbg,
pbk: pbk,
id: bangid,
};
} // 寻找同高或同宽的板
// 计算生成的余板 返回 余板数组,连带的板 小板数组
// lx:0面积最大 1最高 2最宽 fs:取板方式false:左右(取同宽) true上下(取同高) dt:刀头间隙
function jsyb(bigbang, lx, fs, dt, listbang, isdtwosided) {
var x = bigbang.x;
var y = bigbang.y;
var k = bigbang.w;
var g = bigbang.l;
var isend = false;
var ybg = g;
var ybk = k;
var x1 = x;
var y1 = y;
var yb = []; // #余板 坐标跟高宽;
var yhxbang = []; // #连带小板的Id及坐标
var zfkj = []; // 作废的空间
var l;
var w;
var get_result;
var temp_get;
if (lx === 0) {
// get_result = find_max_mz(g, k, listbang);
get_result = find_max_mz(g, k, listbang, isdtwosided);
}
else if (lx == 1) {
// get_result = find_max_g(g, k, listbang);
get_result = find_max_g(g, k, listbang, isdtwosided);
}
else {
// get_result = find_max_k(g, k, listbang);
get_result = find_max_k(g, k, listbang, isdtwosided);
}
if (get_result.findid > -1) {
yhxbang.push({
bangid: get_result.id,
line: get_result.line,
x: x,
y: y,
pbg: get_result.pbg,
pbk: get_result.pbk,
});
listbang.splice(get_result.findid, 1);
l = get_result.pbg;
w = get_result.pbk;
if (fs == false) // false:左右(取同宽) true上下(取同高)
{
ybg = g - l - dt;
y1 = y + l + dt;
while (isend == false) {
// temp_get = find_same_k(ybg, w, listbang);
temp_get = find_same_k(ybg, w, listbang, isdtwosided);
if (temp_get.findid > -1) {
yhxbang.push({
bangid: temp_get.id,
line: temp_get.line,
x: x,
y: y1,
pbg: temp_get.pbg,
pbk: temp_get.pbk,
});
y1 = y1 + temp_get.pbg + dt;
ybg = ybg - temp_get.pbg - dt;
listbang.splice(temp_get.findid, 1);
}
else {
if (ybg > 0) {
yb.push({
l: ybg,
w: w,
x: x,
y: y1,
});
}
if (k - w - dt > 0) {
yb.push({
l: g,
w: k - w - dt,
x: x + w + dt,
y: y,
});
}
break;
}
}
}
else // true上下(取同高)
{
ybk = k - w - dt;
x1 = x + w + dt;
while (isend == false) {
temp_get = find_same_g(l, ybk, listbang, isdtwosided);
if (temp_get.findid > -1) {
yhxbang.push({
bangid: temp_get.id,
line: temp_get.line,
x: x1,
y: y,
pbg: temp_get.pbg,
pbk: temp_get.pbk,
});
x1 = x1 + temp_get.pbk + dt;
ybk = ybk - temp_get.pbk - dt;
listbang.splice(temp_get.findid, 1);
}
else {
if (ybk > 0) {
yb.push({
l: l,
w: ybk,
x: x1,
y: y,
});
}
if (g - l - dt > 0) {
yb.push({
l: g - l - dt,
w: k,
x: x,
y: y + l + dt,
});
}
break;
}
}
} // false:左右(取同宽) true上下(取同高)
var ybsl = 0;
var yhsl = 0;
if (yb.length > 0) {
ybsl = yb.length;
}
if (yhxbang.length > 0) {
yhsl = yhxbang.length;
}
return [ybsl, yhsl, yb, yhxbang, listbang, 0, zfkj];
}
else {
zfkj.push({
l: g,
w: k,
x: x,
y: y,
});
var ybsl = 0;
var yhsl = 0;
if (yb.length > 0) {
ybsl = yb.length;
}
if (yhxbang.length > 0) {
yhsl = yhxbang.length;
}
return [ybsl, yhsl, yb, yhxbang, listbang, 1, zfkj];
}
}
// 计算生成的余板 返回 余板数组,连带的板 小板数组 都是左右分隔空间,后面再来空间合并
// lx:0面积最大 1最高 2最宽 fs:取板方式false:取同宽 true取同高 dt:刀头间隙
function jsyb1(bigbang, lx, fs, dt, listbang, isdtwosided) {
var x = bigbang.x;
var y = bigbang.y;
var k = bigbang.w;
var g = bigbang.l;
var isend = false;
var ybg = g;
var ybk = k;
var x1 = x;
var y1 = y;
var yb = []; // #余板 坐标跟高宽;
var yhxbang = []; // #连带小板的Id及坐标
var zfkj = []; // 作废的空间
var l;
var w;
var get_result;
var temp_get;
if (lx == 0) {
// get_result = find_max_mz(g, k, listbang);
get_result = find_max_mz(g, k, listbang, isdtwosided);
}
else if (lx == 1) {
// get_result = find_max_g(g, k, listbang);
get_result = find_max_g(g, k, listbang, isdtwosided);
}
else {
// get_result = find_max_k(g, k, listbang);
get_result = find_max_k(g, k, listbang, isdtwosided);
}
if (get_result.findid > -1) {
yhxbang.push({
bangid: get_result.id,
line: get_result.line,
x: x,
y: y,
pbg: get_result.pbg,
pbk: get_result.pbk,
});
listbang.splice(get_result.findid, 1);
//////////////
l = get_result.pbg;
w = get_result.pbk;
if (fs == false) // false:左右(取同宽) true上下(取同高)
{
ybg = g - l - dt;
y1 = y + l + dt;
while (isend == false) {
temp_get = find_same_k(ybg, w, listbang, isdtwosided);
if (temp_get.findid > -1) {
yhxbang.push({
bangid: temp_get.id,
line: temp_get.line,
x: x,
y: y1,
pbg: temp_get.pbg,
pbk: temp_get.pbk,
});
y1 = y1 + temp_get.pbg + dt;
ybg = ybg - temp_get.pbg - dt;
listbang.splice(temp_get.findid, 1);
}
else {
if (ybg > 0) {
yb.push({
l: ybg,
w: w,
x: x,
y: y1,
});
}
if (k - w - dt > 0) {
yb.push({
l: g,
w: k - w - dt,
x: x + w + dt,
y: y,
});
}
break;
}
}
}
else // true上下(取同高)
{
ybk = k - w - dt;
x1 = x + w + dt;
while (isend == false) {
temp_get = find_same_g(l, ybk, listbang, isdtwosided);
if (temp_get.findid > -1) {
yhxbang.push({
bangid: temp_get.id,
line: temp_get.line,
x: x1,
y: y,
pbg: temp_get.pbg,
pbk: temp_get.pbk,
});
x1 = x1 + temp_get.pbk + dt;
ybk = ybk - temp_get.pbk - dt;
listbang.splice(temp_get.findid, 1);
}
else {
if (ybk > 0) {
yb.push({
l: g,
w: ybk,
x: x1,
y: y,
});
}
if (g - l - dt > 0) {
yb.push({
l: g - l - dt,
w: k - ybk - dt,
x: x,
y: y + l + dt,
});
}
break;
}
}
} // false:左右(取同宽) true上下(取同高)
////////////////////////////////////////////////////////////////////////////
var ybsl = 0;
var yhsl = 0;
if (yb.length > 0) {
ybsl = yb.length;
}
if (yhxbang.length > 0) {
yhsl = yhxbang.length;
}
return [ybsl, yhsl, yb, yhxbang, listbang, 0, zfkj];
}
else {
zfkj.push({
l: g,
w: k,
x: x,
y: y,
});
var ybsl = 0;
var yhsl = 0;
if (yb.length > 0) {
ybsl = yb.length;
}
if (yhxbang.length > 0) {
yhsl = yhxbang.length;
}
return [ybsl, yhsl, yb, yhxbang, listbang, 1, zfkj];
}
}
/** 获取数组最后一个元素 */
function arrayLast(arr) {
return arr[arr.length - 1];
}
/** 查找数组中最大的元素 */
function arrayMax(arr, f) {
if (f === void 0) { f = function (a) { return a; }; }
var max = Number.NEGATIVE_INFINITY;
var maxIndex = -1;
for (var i = 0; i < arr.length; i++) {
var item = arr[i];
var v = f(item);
if (v > max) {
maxIndex = i;
max = v;
}
}
return [arr[maxIndex], maxIndex];
}
function Sleep(time) {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
return [2 /*return*/, new Promise(function (res) {
setTimeout(res, time);
})];
});
});
}