322 lines
8.6 KiB
TypeScript
322 lines
8.6 KiB
TypeScript
|
|
|||
|
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)
|
|||
|
}
|