152 lines
6.3 KiB
TypeScript
152 lines
6.3 KiB
TypeScript
import { FaceType, PlaceBlock, PlaceBlockDetail, PlaceBorderContour, PlaceMaterial, PlaceStyle, SizeExpand } from "../confClass"
|
||
import { BlockDetailHelperBase } from "../handleAbility/blockDetailHelperBase"
|
||
import { PolylineHelper } from "../handleAbility/common/LayoutEngine/PolylineHelper"
|
||
import { KnifeHelper } from "../handleAbility/knifeHelper"
|
||
|
||
|
||
/** 小板明细 相关的计算 孔 造型 以及轮廓 */
|
||
export class BlockDetailHelper extends BlockDetailHelperBase {
|
||
/** 预铣(板件外扩)值 */
|
||
preMillingSize = 0;
|
||
|
||
constructor(config?: any) {
|
||
super()
|
||
if(config){
|
||
this.updateConfig(config)
|
||
}
|
||
}
|
||
updateConfig(config) {
|
||
if (config) {
|
||
let keys = Object.keys(config)
|
||
for (const key of keys) {
|
||
if (Reflect.has(this, key)) {
|
||
this[key] = config[key]
|
||
}
|
||
}
|
||
}
|
||
|
||
}
|
||
/** 小板初始化:1各种轮廓|走刀路径|,2尺寸扩展后的轮廓与走刀路径 */
|
||
initBlock(block: PlaceBlock, pm: PlaceMaterial) {
|
||
if (block.blockDetail == null) {
|
||
// 异常情况
|
||
console.error(`【initBlock()】${block.blockNo}没用板件明细,请检查`);
|
||
return
|
||
}
|
||
if (block.blockDetail.borderContour) return // 已初始化
|
||
|
||
// const pm = block.placeMaterial
|
||
|
||
const bd = block.blockDetail
|
||
|
||
if (pm == null) {
|
||
return // 异常
|
||
}
|
||
const cutKnifeR = pm.diameter / 2
|
||
const cutGap = pm.cutKnifeGap
|
||
// 开料偏移值 ,矩形波倒角
|
||
bd.offsetKnifeRadius = pm.diameter / 2
|
||
bd.isOffsetRounding = true // 默认要倒角
|
||
bd.preMillingSize = pm.preMillingSize
|
||
|
||
if (bd.points.length == 0) // 矩形板,设置不倒角
|
||
{
|
||
bd.isOffsetRounding = false// sysConfig.RegularBlockFilletCurve;
|
||
}
|
||
else // 异形板
|
||
{
|
||
// 异形板倒角
|
||
bd.isOffsetRounding = true // sysConfig.isUnRegularBlockChamfer
|
||
}
|
||
|
||
// 初始化 小板基础轮廓
|
||
// 1.原始轮廓,成品轮廓
|
||
|
||
const border_final = this.createFinalBorder(bd, block)
|
||
// 2.开料轮廓 <不含预铣>
|
||
const border_org = this.createOrgBorder(bd)
|
||
|
||
bd.borderContour = new PlaceBorderContour(PlaceStyle.FRONT, border_final, border_org)
|
||
|
||
// 3.开料轮廓_带预铣, 外扩尺寸
|
||
bd.borderContour.borderPreMilling = border_org
|
||
bd.preMillingExpandSize = new SizeExpand()
|
||
// console.log('开料轮廓_带预铣, 外扩尺寸', block, bd.preMillingExpandSize, sysConfig.preMillingSize)
|
||
if (this.preMillingSize > 0.0001) {
|
||
const rt = this.creatOrgBorderWithPrevCut(block, border_org, this.sysConfig.preMillingSize)
|
||
bd.borderContour.borderPreMilling = rt.newBorders
|
||
bd.preMillingExpandSize = rt.newSizeExpand
|
||
// console.log('开料轮廓_带预铣, 外扩尺寸==》after', block, rt.newSizeExpand)
|
||
}
|
||
|
||
// 4. 板内走刀路径,板内空间
|
||
const innerGroup = this.analyeInners(bd, cutKnifeR, cutGap)
|
||
|
||
bd.borderContour.borderModelThrough = innerGroup.borders_inner_org
|
||
bd.borderContour.borderModelThroughR = innerGroup.borders_inner_r
|
||
bd.borderContour.cutLinesModelThrough = innerGroup.borders_inner_cut
|
||
bd.borderContour.borderInnerPlace = innerGroup.borders_inner_place
|
||
bd.borderContour.blockInnerSpace = innerGroup.spaces
|
||
|
||
// 5 造型外扩轮廓, 外扩尺寸
|
||
const { pls_model, sizeout: sizeout_model } = this.createPolyline_model(block)
|
||
bd.borderContour.polylinesOutModel = pls_model
|
||
bd.modelExpandSize = sizeout_model
|
||
|
||
// 6. 2V刀路 外扩轮廓,外扩尺寸
|
||
const { pls_2v, sizeout_2v } = this.createPolyline_2vModel(block)
|
||
bd.borderContour.polylines2vModel = pls_2v
|
||
bd.vKnifeModelExpandSize = sizeout_2v
|
||
|
||
// 7.同刀辅助 外扩尺寸
|
||
let isUseSameKnifeToHelpCut = this.sysConfig.helpCutStyle || 0
|
||
let useSameKnifeToHelpCutGap = this.sysConfig.helpCutGap || 0
|
||
const isSameKnifeToCut = isUseSameKnifeToHelpCut && useSameKnifeToHelpCutGap > 0
|
||
if (isSameKnifeToCut == false || bd.isUseSameKnifeToHelpCut == false) {
|
||
// 未启动同刀辅助, 或 该小板 不需要同刀辅助
|
||
bd.useSameKnifeToHelpCutGap = 0
|
||
bd.sameKnfieHelpExpandSize = new SizeExpand()
|
||
}
|
||
else {
|
||
const gap = useSameKnifeToHelpCutGap
|
||
bd.useSameKnifeToHelpCutGap = gap
|
||
bd.sameKnfieHelpExpandSize = new SizeExpand({ left: gap, right: gap, under: gap, upper: gap })
|
||
}
|
||
// 2V刀路,预洗,同刀辅助开料,出板造型刀
|
||
this.resetBlock(block, pm)
|
||
}
|
||
|
||
/** 二维刀路初始化 */
|
||
init2VModel(blockDetail: PlaceBlockDetail, isCNC = false, _knifeHelper: KnifeHelper) {
|
||
for (let model of blockDetail.models) {
|
||
if (!model.isVKnifeModel)
|
||
continue
|
||
let vModels: any = []
|
||
model.VLines = vModels
|
||
let isFaceB = model.face == FaceType.BACK
|
||
if (model.pointList.length < 1)
|
||
continue
|
||
let ps = model.pointList.map((t) => { return { x: t.pointX, y: t.pointY, bul: t.curve } })
|
||
let pl = PolylineHelper.create(ps)
|
||
if (model.VLines?.length > 0)
|
||
return // 已经分析了
|
||
model.VLines = []
|
||
for (let os of model.offsetList) {
|
||
let knife1 = isCNC ? null : _knifeHelper.getModelKnifeByName(os.name) // getModelKnifeByName(os.name)
|
||
let knifeR = os.radius
|
||
let knifeId = knife1 ? knife1.knifeId : -1
|
||
try {
|
||
let vps_1 = PolylineHelper.getVModelPoints_offset(pl, os.offset, os.depth, os.angle)
|
||
let vLine = { isFaceB, name: os.name, value: os.offset, knife: knife1, knifeId, knifeRadius: knifeR, depth: os.depth, points: vps_1, offset: os }
|
||
vModels.push(vLine) // 偏移路径
|
||
model.VLines.push(vLine)
|
||
}
|
||
catch (err) {
|
||
console.log('v型刀走刀路径算法出错。' + err)
|
||
}
|
||
}
|
||
model.VLines = vModels
|
||
}
|
||
}
|
||
|
||
}
|