feat:提交
This commit is contained in:
@@ -0,0 +1,321 @@
|
||||
|
||||
import { BlockSizePlus } from './BlockSizePlus.js'
|
||||
import { BlockHelper } from './BlockHelper.js'
|
||||
import { BlockModel,PlaceBlock,PlaceBoard,PlaceMaterial } from '../../confClass.js'
|
||||
|
||||
/**
|
||||
* 大板长边的两侧多少范围内 避免造型 ,如果出现,则那片小板掉头放置
|
||||
* @param pm
|
||||
* @param 大板边缘范围
|
||||
* @face 大板面 反面 1; 正面 0 ;双面 2
|
||||
* @forCNC 针对的是cnc数据
|
||||
* @isReverse 反转: 大板边缘尽量 安排造型
|
||||
*/
|
||||
export function DisPoseModelInBoardBorder(pm: PlaceMaterial, width: number, face: number, forCNC: number, isReverse: boolean)
|
||||
{
|
||||
if (width == 0)
|
||||
return
|
||||
for (const pb of pm.boardList)
|
||||
{
|
||||
if (pb.isAdnormal())
|
||||
continue
|
||||
if (pb.isLocked || pb.cutedType != 0)
|
||||
continue
|
||||
if (isReverse == false)
|
||||
{
|
||||
// 避免大板边出现 造型
|
||||
DisPoseModelInBoardBorder_pb(pb, width, face, forCNC)
|
||||
}
|
||||
else
|
||||
{
|
||||
// 尽量 安排 造型在大板边
|
||||
needModelInBoardBorder_pb(pb, width, face, forCNC)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 大板边缘 避免造型 如果出现,则那片小板掉头放置
|
||||
*
|
||||
* @param pb
|
||||
* @param width
|
||||
* @param face
|
||||
* @param forCNC 针对的是cnc的加工
|
||||
*/
|
||||
function DisPoseModelInBoardBorder_pb(pb: PlaceBoard, width: number, face: number, forCNC: number)
|
||||
{
|
||||
const bw = pb.width
|
||||
for (const block of pb.blockList)
|
||||
{
|
||||
if (block.isUnRegular)
|
||||
continue
|
||||
if (block.placeX + block.placeWidth < width)
|
||||
continue // 小板整片板都在边缘, 转不转没意义
|
||||
if (block.placeX > bw - width)
|
||||
continue
|
||||
// 如果内部有小板, 也不能掉头
|
||||
if (hasChildBlock(block, pb.blockList))
|
||||
continue
|
||||
|
||||
let isInBorder = false
|
||||
const models = getModels(block, face, forCNC)
|
||||
for (const model of models)
|
||||
{
|
||||
isInBorder = isInBoardBorder(block, model, bw, width)
|
||||
if (isInBorder)
|
||||
break
|
||||
}
|
||||
|
||||
if (isInBorder == false)
|
||||
continue
|
||||
|
||||
turnBlock(block)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 大板边缘 尽量安排造型
|
||||
*
|
||||
* @param pb
|
||||
* @param width
|
||||
* @param face
|
||||
* @param forCNC
|
||||
*/
|
||||
function needModelInBoardBorder_pb(pb: PlaceBoard, width: number, face: number, forCNC: number)
|
||||
{
|
||||
const blocks_turn: any = []
|
||||
const bw = pb.width
|
||||
|
||||
// 大板左边
|
||||
const blocks_z = pb.blockList.filter(t => t.isUnRegular == false && t.placeX < width)
|
||||
for (const block of blocks_z)
|
||||
{
|
||||
// 如果内部有小板, 也不能掉头
|
||||
if (hasChildBlock(block, pb.blockList))
|
||||
continue
|
||||
// 造型
|
||||
const models = getModels(block, face, forCNC)
|
||||
|
||||
let hasModelOnLeft = false // 左边有造型
|
||||
let hasModelOnRight = false // 右边有造型
|
||||
for (const model of models)
|
||||
{
|
||||
if (hasModelOnLeft == false && isInBoardLeft(block, model, width, false))
|
||||
hasModelOnLeft = true
|
||||
if (hasModelOnRight == false && isInBoardLeft(block, model, width, true))
|
||||
hasModelOnRight = true
|
||||
}
|
||||
// 左边没有造型, 右边有造型,则掉头
|
||||
if (hasModelOnLeft == false && hasModelOnRight)
|
||||
{
|
||||
blocks_turn.push(block)
|
||||
}
|
||||
}
|
||||
|
||||
// 大板右边
|
||||
const blocks_y = pb.blockList.filter(t => t.isUnRegular == false && t.placeX + t.placeWidth > bw - width)
|
||||
for (const block of blocks_y)
|
||||
{
|
||||
// 如果内部有小板, 也不能掉头
|
||||
if (hasChildBlock(block, pb.blockList))
|
||||
continue
|
||||
// 造型
|
||||
const models = getModels(block, face, forCNC)
|
||||
|
||||
let hasModelOnLeft = false // 小板左边有造型
|
||||
let hasModelOnRight = false // 小板右边有造型
|
||||
for (const model of models)
|
||||
{
|
||||
if (hasModelOnLeft == false && isInBoardRight(block, model, bw, width, true))
|
||||
hasModelOnLeft = true
|
||||
if (hasModelOnRight == false && isInBoardRight(block, model, bw, width, false))
|
||||
hasModelOnRight = true
|
||||
}
|
||||
// 右边没有造型, 左边有造型,则掉头
|
||||
if (hasModelOnLeft && hasModelOnRight == false)
|
||||
{
|
||||
blocks_turn.push(block)
|
||||
}
|
||||
}
|
||||
|
||||
// 翻转小板
|
||||
for (const block of blocks_turn)
|
||||
{
|
||||
turnBlock(block)
|
||||
}
|
||||
}
|
||||
|
||||
/** 获取小板指定面造型 */
|
||||
function getModels(block: PlaceBlock, face: number, forCNC: number): BlockModel[]
|
||||
{
|
||||
let models: any = []
|
||||
if (face == 0) // 正面
|
||||
{
|
||||
models = block.modelListFaceA
|
||||
if (forCNC == 1)
|
||||
{
|
||||
const ms_A = block.isTurnOver() == false ? block.modelListOrgFaceA() : block.modelListOrgFaceB()
|
||||
models = ms_A.filter(t => t.isCutting == false).concat(block.modelListOrgTrough().filter(t => t.isCutting == false))
|
||||
}
|
||||
}
|
||||
else if (face == 1) // 反面
|
||||
{
|
||||
models = block.modelListFaceB
|
||||
if (forCNC == 1)
|
||||
{
|
||||
const ms_B = block.isTurnOver() == false ? block.modelListOrgFaceB() : block.modelListOrgFaceA()
|
||||
models = ms_B.filter(t => t.isCutting == false)
|
||||
}
|
||||
}
|
||||
else // 随意面
|
||||
{
|
||||
models = block.models().filter(t => t.isCutting != (forCNC == 1))
|
||||
}
|
||||
return models
|
||||
}
|
||||
|
||||
/** 判断是否有造型出现在无法加工的区域 */
|
||||
export function hasModelInBoardBorder(pb: PlaceBoard, width: number, face: number, forCNC: number)
|
||||
{
|
||||
pb.hasModelOnLeft = false
|
||||
pb.hasModelOnRight = false
|
||||
|
||||
const bw = pb.width
|
||||
for (const block of pb.blockList)
|
||||
{
|
||||
if (block.isUnRegular)
|
||||
continue
|
||||
if (block.placeX + block.placeWidth < width)
|
||||
continue // 小板整片板都在边缘, 转不转没意义
|
||||
if (block.placeX > bw - width)
|
||||
continue
|
||||
|
||||
const models = getModels(block, face, forCNC)
|
||||
|
||||
if (pb.hasModelOnLeft == false)
|
||||
{
|
||||
for (const model of models)
|
||||
{
|
||||
let isLeft = false
|
||||
for (const p of model.pointList)
|
||||
{
|
||||
const rp = BlockHelper.getPlaceXYInBoard(block, p.pointX, p.pointY)
|
||||
if (rp.x < width)
|
||||
{
|
||||
isLeft = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if (isLeft)
|
||||
{
|
||||
pb.hasModelOnLeft = true
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
if (pb.hasModelOnRight == false)
|
||||
{
|
||||
for (const model of models)
|
||||
{
|
||||
let isRight = false
|
||||
for (const p of model.pointList)
|
||||
{
|
||||
const rp = BlockHelper.getPlaceXYInBoard(block, p.pointX, p.pointY)
|
||||
if (rp.x > bw - width)
|
||||
{
|
||||
isRight = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if (isRight)
|
||||
{
|
||||
pb.hasModelOnRight = true
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
if (pb.hasModelOnLeft && pb.hasModelOnRight)
|
||||
return // 已经有结果了
|
||||
}
|
||||
}
|
||||
|
||||
/** 判断造型是否在大板的边缘 */
|
||||
function isInBoardBorder(block: PlaceBlock, model: BlockModel, bw: number, width: number): boolean
|
||||
{
|
||||
for (const p of model.pointList)
|
||||
{
|
||||
const rp = BlockHelper.getPlaceXYInBoard(block, p.pointX, p.pointY)
|
||||
if (rp.x < width || rp.x > bw - width)
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
/** 造型是否在大板左边 toTurn 翻转后 */
|
||||
function isInBoardLeft(block: PlaceBlock, model: BlockModel, width: number, toTurn: boolean)
|
||||
{
|
||||
for (const p of model.pointList)
|
||||
{
|
||||
const rp = BlockHelper.getPlaceXYInBlock(block, p.pointX, p.pointY, false, false)
|
||||
let rx = toTurn ? block.placeWidth - rp.x : rp.x
|
||||
rx = rx + block.placeX
|
||||
if (rx < width)
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
/** 造型 是否在大板 右边 toTurn 翻转后 */
|
||||
function isInBoardRight(block: PlaceBlock, model: BlockModel, boardWidth: number, width: number, toTurn: boolean)
|
||||
{
|
||||
for (const p of model.pointList)
|
||||
{
|
||||
const rp = BlockHelper.getPlaceXYInBlock(block, p.pointX, p.pointY, false, false)
|
||||
let rx = toTurn ? block.placeWidth - rp.x : rp.x
|
||||
rx = rx + block.placeX
|
||||
if (rx > boardWidth - width)
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
/** 判断block里有没有小板 */
|
||||
function hasChildBlock(block: PlaceBlock, blocks: PlaceBlock[]): boolean
|
||||
{
|
||||
for (const b of blocks)
|
||||
{
|
||||
if (b.blockNo == block.blockNo)
|
||||
continue
|
||||
|
||||
if (b.placeX > block.placeX && b.placeX + b.placeWidth < block.placeX + block.placeWidth && b.placeY > block.placeY && b.placeY + b.placeLength < block.placeY + block.placeLength)
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
function turnBlock(block: PlaceBlock)
|
||||
{
|
||||
// 有造型在大板边
|
||||
|
||||
const orgStyle = block.placeStyle
|
||||
const newStyle = BlockHelper.getTurnedPlaceStyle(orgStyle, 2)
|
||||
|
||||
const orgPlaceX = block.placeX - block.placeOffX
|
||||
const orgPlaceY = block.placeY - block.placeOffY
|
||||
|
||||
const offset = BlockSizePlus.getOffDis(block, newStyle)
|
||||
|
||||
// 左右上下,外扩尺寸不一样, 翻转有可能会导致 小板与其他小板 干涉。
|
||||
if (offset.left != offset.right || offset.top != offset.bottom)
|
||||
return
|
||||
|
||||
const newPlaceX = orgPlaceX + offset.x
|
||||
const newPlaceY = orgPlaceY + offset.y
|
||||
block.placeX = newPlaceX
|
||||
block.placeY = newPlaceY
|
||||
block.placeOffX = offset.x
|
||||
block.placeOffY = offset.y
|
||||
|
||||
// 修改小板的放置方式
|
||||
BlockHelper.resetPlaceStyle(block, newStyle)
|
||||
}
|
Reference in New Issue
Block a user