1753 lines
64 KiB
JavaScript
1753 lines
64 KiB
JavaScript
"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);
|
||
})];
|
||
});
|
||
});
|
||
}
|