1747 lines
51 KiB
TypeScript
1747 lines
51 KiB
TypeScript
import type { Big_bang, Con, Inv, xbang } from './bang'
|
||
import { LineType } from './bang'
|
||
|
||
export class RectOptimizeMachine {
|
||
private _Stop = false
|
||
|
||
public CallBack: (best: Inv, yl: Big_bang[], fit: number, info: any) => void | Promise<void>
|
||
|
||
Stop(d?:any) {
|
||
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 余料板是否排入双面加工的小板
|
||
*/
|
||
async Start(xbangs: xbang[], bigBang: Big_bang[], bigBangSL: number[], xyhcs: number, isdtwosided: boolean, gap: number, hssf: boolean, YuLiaoBoardDo2FaceBlock: boolean) {
|
||
this._Stop = false
|
||
|
||
// let bestFit = Infinity; //最佳的利用率 35*10 + 最后一张板
|
||
let bestFit = Number.POSITIVE_INFINITY // 最佳的利用率 35*10 + 最后一张板
|
||
let bestInv: Inv
|
||
|
||
let i = 0
|
||
let inv; let re_ylb; let fit: any = null
|
||
|
||
while (!this._Stop) {
|
||
|
||
const qfsh = hssf ? false : i % 2 === 0 // 电子锯算法, 永远不合并空间
|
||
|
||
let 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)
|
||
let 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)
|
||
// }
|
||
await Sleep(Math.max(5, 20 - Math.floor(xbangs.length / 10000)))
|
||
i++
|
||
}
|
||
}
|
||
}
|
||
|
||
// 优化所有余料
|
||
function YLYH_all(xbangs: xbang[], yuliao_bang: Big_bang[], ylzs: number[], xyhcs: number, qfsh: boolean, isdtwosided: boolean, gap: number, YuLiaoBoardDo2FaceBlock: boolean): [Inv, xbang[], Big_bang[]] // 余料优化
|
||
{
|
||
let get_regelt: Inv = []
|
||
let temp_yan_bang: Big_bang[] = []
|
||
let re_Bigbang: Big_bang[] = []
|
||
temp_yan_bang = []
|
||
// console.log('余料总数:', ylzs)
|
||
for (let i = 0; i < ylzs.length; i++) {
|
||
if (xbangs.length == 0) {
|
||
break
|
||
}
|
||
else {
|
||
temp_yan_bang = []
|
||
for (let sl = 0; sl < ylzs[i]; sl++) {
|
||
temp_yan_bang.push(yuliao_bang[i])
|
||
}
|
||
let temp:any = []
|
||
temp = ylyh(xbangs, temp_yan_bang, xyhcs, qfsh, isdtwosided, gap, YuLiaoBoardDo2FaceBlock)
|
||
for (let yhsl = 0; yhsl < temp[0].length; yhsl++) {
|
||
get_regelt.push(temp[0][yhsl])
|
||
}
|
||
for (let 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: xbang[], yuliao_bang: Big_bang[], xyhcs: number, qfsh: boolean, isdtwosided: boolean, gap: number, YuLiaoBoardDo2FaceBlock: boolean): [Inv, xbang[], Big_bang[]] // 余料优化
|
||
{
|
||
let finbang: xbang[]
|
||
let yh_result: Inv = []
|
||
let l: number
|
||
let w: number
|
||
let ylzs: number// 余料张数
|
||
let temp_yan_bang: Big_bang[] = []
|
||
let re_yan_bang: Big_bang[] = []
|
||
let temp_max_YH: Inv = []
|
||
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 (let i = 0; i < ylzs; i++) {
|
||
yh_result.push(temp_max_YH[i])
|
||
re_yan_bang.push(yuliao_bang[0])
|
||
for (let n = 0; n < temp_max_YH[i].length; n++) {
|
||
for (let 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: xbang[], B_bang: Big_bang[], ylsl: number[], xyhcs: number, qfsh: boolean, isdtwosided: boolean, gap: number, YuLiaoBoardDo2FaceBlock: boolean): [Inv, Big_bang[]] {
|
||
let same_yh_bang: Inv = []
|
||
let temp_max_YH: Inv = []
|
||
let ylbang_max_yh: Big_bang[] = []
|
||
let temp_same_yh: [Inv, xbang[]]
|
||
let isend: boolean = false
|
||
let Bigbang: Big_bang[] = []
|
||
Bigbang.push(B_bang[B_bang.length - 1])
|
||
|
||
let ylbang: Big_bang[] = B_bang.slice()
|
||
ylbang.pop()
|
||
|
||
let tempresult = []
|
||
|
||
tempresult = YLYH_all(xbangs, ylbang, ylsl, xyhcs, qfsh, isdtwosided, gap, YuLiaoBoardDo2FaceBlock) // 余料优化
|
||
|
||
for (let 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 (let 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: xbang[], B_bang: Big_bang[], cs: number, qfsh: boolean, isdtwosided: boolean, gap: number): Inv {
|
||
let xbangs_bak = xbangs.slice()
|
||
let bestFit = Number.POSITIVE_INFINITY
|
||
// let bestFit = Infinity;
|
||
let bestInv: Inv
|
||
for (let i = 0; i < cs; i++) {
|
||
xbangs = xbangs_bak.slice()
|
||
|
||
let result_yh: Inv
|
||
if (qfsh)
|
||
result_yh = CBJS(xbangs, B_bang, gap, isdtwosided)
|
||
else
|
||
result_yh = CBJS1(xbangs, B_bang, gap, isdtwosided)
|
||
|
||
let fit = GetInvFit(result_yh)
|
||
if (fit < bestFit) {
|
||
bestFit = fit
|
||
bestInv = result_yh
|
||
}
|
||
}
|
||
return bestInv
|
||
}
|
||
|
||
// 得到利用率最高板材,及返回倍数板及剩下的小板
|
||
function Get_bs_bang(inv: Inv, listbang: xbang[], isdtwosided: boolean): [Inv, xbang[]] {
|
||
let [bestCon] = arrayMax(inv, GetConFit)// 最优大板
|
||
|
||
let temp_yh_bang: Con = []
|
||
let temp_list_yh_bang: Inv = []
|
||
let isfindend: boolean = false
|
||
|
||
while (isfindend == false) {
|
||
if (listbang.length == 0) { break }
|
||
|
||
let unPlacelist = listbang.slice()
|
||
for (let br of bestCon) {
|
||
let 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: Inv) {
|
||
let fit = (inv.length - 1) * 10
|
||
fit += GetConFit(arrayLast(inv))
|
||
return fit
|
||
}
|
||
|
||
function GetConFit(con: Con) {
|
||
let fit = 0
|
||
for (let p of con)
|
||
fit += p.pbg * p.pbk * 1e-6
|
||
return fit
|
||
}
|
||
|
||
// 初步优化计算 横竖算法,无空间合并
|
||
function CBJS1(Listbang: xbang[], yanbang: Big_bang[], dt: number, isdtwosided: boolean): Inv // [(YHB_LST)[], (Big_bang[])[], (Big_bang[])[]]
|
||
{
|
||
let yanbang_bk: Big_bang[] = yanbang.slice()
|
||
// let zfkj: Big_bang[] = [];
|
||
// let list_zfkj: (Big_bang[])[] = [];
|
||
let list_yh_bng: Inv = []
|
||
// let list_yang_bang: (Big_bang[])[] = [];
|
||
let result_yh: Con = []
|
||
|
||
while (Listbang.length > 0) {
|
||
// zfkj = [];
|
||
yanbang = yanbang_bk.slice()
|
||
result_yh = []
|
||
while (yanbang.length > 0) {
|
||
let lx: number = Math.floor(Math.random() * 3) // lx:0 面积最大 1 最高 2 最宽
|
||
let fs: boolean // fs:留板方式,0:左右 1:上下
|
||
if (Math.floor(Math.random() * 2) == 0) { fs = false } else { fs = true }
|
||
let 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 (let i = 0; i < get_result[0]; i++)
|
||
yanbang.push(get_result[2][i])
|
||
}
|
||
if (get_result[1] > 0) {
|
||
for (let 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: xbang[], yanbang: Big_bang[], dt: number, isdtwosided: boolean): Inv // [(YHB_LST)[], (Big_bang[])[], (Big_bang[])[]]
|
||
{
|
||
let yanbang_bk: Big_bang[] = yanbang.slice()
|
||
// let zfkj: Big_bang[] = [];
|
||
// let list_zfkj: (Big_bang[])[] = [];
|
||
let list_yh_bng: Inv = []
|
||
// let list_yang_bang: (Big_bang[])[] = [];
|
||
let result_yh: Con = []
|
||
|
||
// let temp: number = 0;
|
||
while (Listbang.length > 0)// while (temp < 2)//
|
||
{
|
||
// temp++;
|
||
// zfkj = [];
|
||
yanbang = yanbang_bk.slice()
|
||
result_yh = []
|
||
while (yanbang.length > 0) {
|
||
let lx: number = Math.floor(Math.random() * 3) // lx:0 面积最大 1 最高 2 最宽
|
||
let fs: boolean // fs:留板方式,0:左右 1:上下
|
||
if (Math.floor(Math.random() * 2) == 0) { fs = false } else { fs = true }
|
||
let get_result = []
|
||
let 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 (let i = 0; i < get_result[0]; i++)
|
||
yanbang.push(get_result[2][i])
|
||
}
|
||
if (get_result[1] > 0) {
|
||
for (let 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: Big_bang[], dt: number): Big_bang[] {
|
||
let i: number = -1
|
||
yanbang.sort((a1, a2) => 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: Big_bang[], listbang: xbang[], dt: number): [Big_bang[], boolean] // false 继续合并 ture 不在合并
|
||
{
|
||
let k: number
|
||
let g: number
|
||
let isjshb: boolean = true// false 继续合并 ture 不在合并
|
||
let minY: number = 100000
|
||
let yanindex: number
|
||
if (listbang.length == 0)
|
||
return [yanbang, true]
|
||
|
||
for (let 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: Big_bang[], listbang: xbang[], dt: number): [Big_bang[], number] {
|
||
let get_result: Big_bang[]
|
||
let minY: number = 10000
|
||
let yanindex: number
|
||
|
||
get_result = hb(yanbang, dt)
|
||
yanbang = get_result
|
||
|
||
let isend: boolean = false
|
||
while (isend == false) {
|
||
if (yanbang.length == 1) { break }
|
||
for (let i = 0; i < yanbang.length; i++) {
|
||
let 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 (let 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: number, k: number, Listbang: xbang[], oneFaceBlock: boolean): xbang[] // g 高 k 宽 listbang:小板列表 lx:0 面积最大 1 最高 2 最宽 isdtwosided: boolean true 翻板提前
|
||
{
|
||
let finbang: xbang[] = []
|
||
if (oneFaceBlock == true) {
|
||
for (let 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 (let 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: number, k: number, Listbang: xbang[], isdtwosided: boolean): findbang // g 高 k 宽 listbang:小板列表 lx:0 面积最大 1 最高 2 最宽 isdtwosided: boolean true 翻板提前
|
||
{
|
||
let max: number = 0
|
||
let bangindex: number = -1
|
||
let line: LineType = LineType.Positive
|
||
let pbg: number = 0
|
||
let pbk: number = 0
|
||
let bangid: number = 0
|
||
let temp_max: number
|
||
|
||
if (isdtwosided == true) {
|
||
for (let 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 (let 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 (let 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,
|
||
pbg,
|
||
pbk,
|
||
id: bangid,
|
||
}
|
||
} // 寻找面积最的板
|
||
|
||
// 寻找最高的板
|
||
function find_max_g(g: number, k: number, Listbang: xbang[], isdtwosided: boolean): findbang // g 高 k 宽 listbang:小板列表 lx:0 面积最大 1 最高 2 最宽
|
||
{
|
||
let max: number = 0
|
||
let bangindex: number = -1
|
||
let line: LineType = LineType.Positive
|
||
let pbg: number = 0
|
||
let pbk: number = 0
|
||
let bangid: number = 0
|
||
if (isdtwosided == true) {
|
||
for (let 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 (let 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 (let 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,
|
||
pbg,
|
||
pbk,
|
||
id: bangid,
|
||
}
|
||
}
|
||
|
||
// 寻找同高的板
|
||
function find_same_g(g: number, k: number, Listbang: xbang[], isdtwosided: boolean): findbang // g 高 k 宽 listbang:小板列表 lx:0 面积最大 1 最高 2 最宽
|
||
{
|
||
let max: number = g
|
||
let bangindex: number = -1
|
||
let line: LineType = LineType.Positive
|
||
let pbg: number = 0
|
||
let pbk: number = 0
|
||
let bangid: number = 0
|
||
if (isdtwosided == true) {
|
||
for (let 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 (let 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 (let 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,
|
||
pbg,
|
||
pbk,
|
||
id: bangid,
|
||
}
|
||
}// 寻找同高的板
|
||
|
||
// 寻找最宽的板
|
||
function find_max_k(g: number, k: number, Listbang: xbang[], isdtwosided: boolean): findbang // g 高 k 宽 listbang:小板列表 lx:0 面积最大 1 最高 2 最宽
|
||
{
|
||
let max: number = 0
|
||
let bangindex: number = -1
|
||
let line: LineType = LineType.Positive
|
||
let pbg: number = 0
|
||
let pbk: number = 0
|
||
let bangid: number = 0
|
||
if (isdtwosided == true) {
|
||
for (let 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 (let 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 (let 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,
|
||
pbg,
|
||
pbk,
|
||
id: bangid,
|
||
}
|
||
} // 寻找最高的板
|
||
|
||
// 寻同宽的板
|
||
function find_same_k(g: number, k: number, Listbang: xbang[], isdtwosided: boolean): findbang // g 高 k 宽 listbang:小板列表 lx:0 面积最大 1 最高 2 最宽
|
||
{
|
||
let max: number = k
|
||
let bangindex: number = -1
|
||
let line: LineType = LineType.Positive
|
||
let pbg: number = 0
|
||
let pbk: number = 0
|
||
let bangid: number = 0
|
||
if (isdtwosided == true) {
|
||
for (let 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 (let 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 (let 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,
|
||
pbg,
|
||
pbk,
|
||
id: bangid,
|
||
}
|
||
} // 寻同宽的板
|
||
|
||
// 找到同样大小尺寸的板材 && Listbang[i].isdtwosided == true)
|
||
function find_same_bang(g: number, k: number, Listbang: xbang[], isdtwosided: boolean): findbang // g 高 k 宽 listbang:小板列表 1 同高 2 同宽
|
||
{
|
||
let bangindex: number = -1
|
||
let line: LineType = LineType.Positive
|
||
let pbg: number = 0
|
||
let pbk: number = 0
|
||
let bangid: number = 0
|
||
if (isdtwosided == true) {
|
||
for (let 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 (let 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 (let 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,
|
||
pbg,
|
||
pbk,
|
||
id: bangid,
|
||
}
|
||
} // 寻找同高或同宽的板
|
||
|
||
// 计算生成的余板 返回 余板数组,连带的板 小板数组
|
||
// lx:0面积最大 1最高 2最宽 fs:取板方式,false:左右(取同宽) true:上下(取同高) dt:刀头间隙
|
||
function jsyb(bigbang: Big_bang, lx: number, fs: boolean, dt: number, listbang: xbang[], isdtwosided: boolean): [number, number, Big_bang[], Con, xbang[], number, Big_bang[]] {
|
||
let x: number = bigbang.x
|
||
let y: number = bigbang.y
|
||
let k: number = bigbang.w
|
||
let g: number = bigbang.l
|
||
let isend: boolean = false
|
||
let ybg: number = g
|
||
let ybk: number = k
|
||
let x1: number = x
|
||
let y1: number = y
|
||
let yb: Big_bang[] = [] // #余板 坐标跟高宽;
|
||
let yhxbang: Con = [] // #连带小板的Id,及坐标
|
||
let zfkj: Big_bang[] = [] // 作废的空间
|
||
let l: number
|
||
let w: number
|
||
|
||
let get_result: findbang
|
||
let temp_get: findbang
|
||
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,
|
||
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,
|
||
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,
|
||
x,
|
||
y: y1,
|
||
})
|
||
}
|
||
if (k - w - dt > 0) {
|
||
yb.push({
|
||
l: g,
|
||
w: k - w - dt,
|
||
x: x + w + dt,
|
||
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,
|
||
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,
|
||
w: ybk,
|
||
x: x1,
|
||
y,
|
||
})
|
||
}
|
||
if (g - l - dt > 0) {
|
||
yb.push({
|
||
l: g - l - dt,
|
||
w: k,
|
||
x,
|
||
y: y + l + dt,
|
||
})
|
||
}
|
||
break
|
||
}
|
||
}
|
||
} // false:左右(取同宽) true:上下(取同高)
|
||
let ybsl: number = 0
|
||
let yhsl: number = 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,
|
||
y,
|
||
})
|
||
let ybsl: number = 0
|
||
let yhsl: number = 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: Big_bang, lx: number, fs: boolean, dt: number, listbang: xbang[], isdtwosided: boolean): [number, number, Big_bang[], Con, xbang[], number, Big_bang[]] {
|
||
let x: number = bigbang.x
|
||
let y: number = bigbang.y
|
||
let k: number = bigbang.w
|
||
let g: number = bigbang.l
|
||
let isend: boolean = false
|
||
let ybg: number = g
|
||
let ybk: number = k
|
||
let x1: number = x
|
||
let y1: number = y
|
||
let yb: Big_bang[] = [] // #余板 坐标跟高宽;
|
||
let yhxbang: Con = []// #连带小板的Id,及坐标
|
||
let zfkj: Big_bang[] = [] // 作废的空间
|
||
let l: number
|
||
let w: number
|
||
|
||
let get_result: findbang
|
||
let temp_get: findbang
|
||
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,
|
||
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,
|
||
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,
|
||
x,
|
||
y: y1,
|
||
})
|
||
}
|
||
if (k - w - dt > 0) {
|
||
yb.push({
|
||
l: g,
|
||
w: k - w - dt,
|
||
x: x + w + dt,
|
||
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,
|
||
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,
|
||
})
|
||
}
|
||
if (g - l - dt > 0) {
|
||
yb.push({
|
||
l: g - l - dt,
|
||
w: k - ybk - dt,
|
||
x,
|
||
y: y + l + dt,
|
||
})
|
||
}
|
||
break
|
||
}
|
||
}
|
||
} // false:左右(取同宽) true:上下(取同高)
|
||
|
||
////////////////////////////////////////////////////////////////////////////
|
||
|
||
let ybsl: number = 0
|
||
let yhsl: number = 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,
|
||
y,
|
||
})
|
||
let ybsl: number = 0
|
||
let yhsl: number = 0
|
||
if (yb.length > 0) { ybsl = yb.length }
|
||
if (yhxbang.length > 0) { yhsl = yhxbang.length }
|
||
return [ybsl, yhsl, yb, yhxbang, listbang, 1, zfkj]
|
||
}
|
||
}
|
||
|
||
interface findbang {
|
||
findid: number
|
||
line: LineType
|
||
pbg: number
|
||
pbk: number
|
||
id: number
|
||
}
|
||
|
||
interface Lyr {
|
||
pfs: number// 平方数
|
||
lry: number// 利用率
|
||
ys: number// 页数
|
||
}
|
||
|
||
/** 获取数组最后一个元素 */
|
||
function arrayLast<T>(arr: { [key: number]: T; length: number }): T
|
||
{
|
||
return arr[arr.length - 1]
|
||
}
|
||
|
||
/** 查找数组中最大的元素 */
|
||
function arrayMax<T>(arr: T[], f: (item: T) => number = a => (a as unknown as number)): [T, number]
|
||
{
|
||
let max = Number.NEGATIVE_INFINITY
|
||
let maxIndex = -1
|
||
for (let i = 0; i < arr.length; i++)
|
||
{
|
||
let item = arr[i]
|
||
let v = f(item)
|
||
if (v > max)
|
||
{
|
||
maxIndex = i
|
||
max = v
|
||
}
|
||
}
|
||
return [arr[maxIndex], maxIndex]
|
||
}
|
||
async function Sleep(time: number)
|
||
{
|
||
return new Promise((res) =>
|
||
{
|
||
setTimeout(res, time)
|
||
})
|
||
}
|