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

1747 lines
51 KiB
TypeScript
Raw Normal View History

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-1N个元素表示大板)
* @param bigBangSL (bigBang中前N-1bigBang中只有一个元素即只有大板没有余料板)
* @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)
})
}