Files
cut-abstractions/samples/handleAbility/RectOptimizeWorker/RectOptimizeMachine.ts

1747 lines
51 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

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

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)
})
}