import { Processor, ProcessorModule } from "../../src/device"; import { ErrorInfo } from "../../src/device"; import { BoardPosition, PlaceBlock, PlaceBoard, PlaceMaterial, PlaceStyle } from "../confClass"; import { ArrayExt } from "../handleAbility/common/ArrayExt"; /** 模块 检查是否 板材尺寸大于机台尺寸 * * input 入参 */ class Point { /** 坐标x */ x: number /** 坐标y */ y: number constructor(x: number, y: number) { this.x = x this.y = y } } /** 检查是否 板材尺寸大于机台尺寸 */ export const handlePlaceResultToPlaceMaterial: ProcessorModule = { moduleName: "handlePlaceResultToPlaceMaterial", moduleVersion: '20250714', config: { boardWidth: 0, boardLength: 0, placeStyle: 1, }, setConfig(config) { this.config = { ...this.config, ...config }; }, // 会在处理器自动执行 /** * * @param input 输入数据 * @param next 下一个流程的函数 * @param context 上下文 * @returns */ process(input, next, context) { // const { placeResult,pm } = input let pm: PlaceMaterial = context.MaterialPlaceResult.pm pm.tempBestPlaceResult = context.MaterialPlaceResult.placeResult // 没发现优化结果 if (!pm.tempBestPlaceResult) { let errInfo: ErrorInfo = { moduleName: this.moduleName, info: '没有优化数据' } return errInfo } let placeResult = pm.tempBestPlaceResult let orgBoardList = pm.boardList let dic: any = [] // 存放当前 优化的小板 pm.boardList = [] let boardId = 1 // 第一次 false if (pm.tempPlaceResultOnyUnlockedBoard) { for (let pb of orgBoardList) { if (pb.isLocked == false && pb.cutedType == 0) // 未锁定 { pb.blockList.forEach(i => dic[i.blockNo] = i) } else // 锁定 { if (pb.isAdnormal) { let sb = pm.remainBoardList.find(t => t.id == Number(pb.boardNo)) if (sb) sb.isUsed = true } pb.boardId = boardId pm.boardList.push(pb) boardId++ } } } else { pm.blockList.forEach(i => dic[i.blockNo] = i) } // 0904 修复 需求改造后 导致 这里的dic 最终为空 if (Object.keys(dic).length == 0) { pm.blockList.forEach(i => dic[i.blockNo] = i) } let locator = this.boardLocation // 大板优化结果 for (let bpr of placeResult.boards) { boardId++ // bpr.isRemainBoard false let bW = bpr.isRemainBoard ? bpr.width : pm.width let bL = bpr.isRemainBoard ? bpr.length : pm.length let pb = new PlaceBoard(boardId, bW, bL, bpr.remainId, bpr.remainNo) pb.isCreateRemainSpace = true for (let bInfo of bpr.blocks) { let block: PlaceBlock = dic[bInfo.blockId] if (block) { block.isPlaced = true block.boardId = boardId block.placeId = bInfo.placeId block.placeX = bInfo.placeX block.placeY = bInfo.placeY // console.log('重置 开料面 开料信息 after', block.boardId, block.blockNo, block, block.placeStyle, bInfo.placeStyle) /** * 雕刻机(钻孔、拉槽、开料)优化排版,开料排版面(开料正面)选择顺序:排版面>>造型>>排钻>>设计正面 1. 排版面 小板设计排版面为正面或反面,设置对应面为开料排版面, 小板设计排版面为随意面,则继续; 2. 造型 小板只有单面造型,设置对应面为开料排版面, 小板双面无造型或双面有造型,则继续; 3. 排钻 小板有大孔(偏心轮锁孔),设置对应面为开料排版面, 小板无大孔(偏心轮锁孔),则设置孔多的面为开料排版面, 小板无孔,则继续; 4. 设计正面 默认设置设计正面为开料排版面。 */ block.placeStyle = bInfo.placeStyle let posOff = this.getOffDis(block) block.placeOffX = posOff.x block.placeOffY = posOff.y block.placeX = bInfo.placeX + posOff.x block.placeY = bInfo.placeY + posOff.y if (bInfo.placeStyle == PlaceStyle.FRONT || bInfo.placeStyle == PlaceStyle.FRONT_TURN_BACK || bInfo.placeStyle == PlaceStyle.BACK || bInfo.placeStyle == PlaceStyle.BACK_TURN_BACK) { block.placeWidth = block.cutWidth block.placeLength = block.cutLength } else { block.placeWidth = block.cutLength block.placeLength = block.cutWidth } block.isAutoPlaced = true block.isOverlap = false block.cutOrder = 0 pb.blockList.push(block) pb.blockCount++ pb.blockArea += block.area delete dic[bInfo.blockId] // 移除block; } else { } } if (bpr.isScrap) { // 设置前余料板的使用状态,将不需要的释放. console.log('设置前余料板的使用状态,将不需要的释放.') let sb = pm.remainBoardList.find(t => t.id == bpr.remainId) if (sb) { sb.isUsed = true if (sb.placeStyle % 2 != 0) { pb.width = sb.length pb.length = sb.width } let pl = sb.placePolyline pb.points = sb?.placePolyline?.LineData.map((t) => { return { x: t.pt.x, y: t.pt.y, bul: t.bul } }) || [] // pb.StoreNo = sb.StoreHouse; } } pb.usageRate = Math.round(10000 * pb.blockArea / pb.area) / 100 pm.boardList.push(pb) console.log('大板靠板翻转', pb.boardId, locator) // 大板靠板翻转 this.turnPlacePosition(pb, locator) for (let block of pb.blockList) { // 重置 开料面 开料信息 // console.log('重置 开料面 开料信息', block.boardId, block.blockNo, block, block.placeStyle) if (block.placeStyle == null || block.placeStyle == undefined) { console.log('handleTempPlaceResultToPlaceMaterial error !block.placeStyle is null or undefined') } else { this.resetPlaceStyle(block, block.placeStyle) } } } //【功能】 大板长边两侧 width 范围内 避免出现造型 DisPoseModelInBoardBorderWidth > 0 生效 // this.DisPoseModelInBoardBorder( // pm, // this.boardBorderModelRange, // this.boardBorderModelModeToFace, // this.boardBorderModelByMachine, // this.modelNearBoardBorder, // ) // for (let pb of pm.boardList) { // // 重设大板汇总 重设 大板开料 顺序,下刀点 // this.resetPlaceBoard(pm, pb) // // 检查干涉 // if (pb.isLocked == false && pb.cutedType == 0) // this.checkOverlapInBoard(pm, pb) // } let rBoardCount = placeResult.boardCount let rUseSize_avg = placeResult.avgUsageRateAll let rUseSize_noLast = placeResult.avgUsageRateExcludeLastBoard let rUseSize_last = placeResult.usageRateLastBoard pm.avgUsageRateAll = rUseSize_avg pm.avgUsageRateExcludeLastBoard = rUseSize_noLast pm.usageRateLastBoard = rUseSize_last pm.boardCount = pm.boardList.length pm.remainBoardCount = placeResult.remainBoardCount pm.minBoardId = 1 pm.maxBoardId = pm.boardCount //【功能】 获取封边长度 // pm.edgeSealLengthList = this.getMaterialSealEdge(pm.blockList) pm.boardCountFlipFace = ArrayExt.count(pm.boardList, t => t.isTwoFaceProcessing) pm.isOptimized = true pm.tempBestPlaceResult = null pm.tempPlaceResultError = '' let mesg = '' let c = 0 for (let v in dic) { mesg += `${v} ` c++ } mesg = `有${c}片小板未能排入大板,有可能是尖角导致优化失败.${mesg}` if (c > 0) { console.log(pm) // createMessage.error(mesg) throw new Error(mesg) } // return pm let res = { module:this.moduleName, pm } Reflect.set(context,this.moduleName,res) return next ? next(input) : input; }, onError(error) { console.error('出错了哦', error); }, /** 获得板件偏移值 */ getOffDis(block: PlaceBlock, placeStyle?: PlaceStyle): any { // console.log('获得板件偏移值') if (placeStyle == null || placeStyle == undefined) { placeStyle = block.placeStyle } let expandSize: any = block.sizeExpand let posOff = { x: 0, y: 0, left: 0, right: 0, top: 0, bottom: 0 } if (expandSize) { switch (placeStyle) { case PlaceStyle.FRONT: // 正面 posOff.x = expandSize.left posOff.y = expandSize.bottom posOff.left = expandSize.left posOff.right = expandSize.right posOff.bottom = expandSize.bottom posOff.top = expandSize.top break case PlaceStyle.FRONT_TURN_RIGHT: // 正面右转 posOff.x = expandSize.bottom posOff.y = expandSize.right posOff.left = expandSize.bottom posOff.right = expandSize.top posOff.bottom = expandSize.right posOff.top = expandSize.left break case PlaceStyle.FRONT_TURN_BACK: // 正面后转 posOff.x = expandSize.right posOff.y = expandSize.top posOff.left = expandSize.right posOff.right = expandSize.left posOff.bottom = expandSize.top posOff.top = expandSize.bottom break case PlaceStyle.FRONT_TURN_LEFT: // 正面左转 posOff.x = expandSize.top posOff.y = expandSize.left posOff.left = expandSize.top posOff.right = expandSize.bottom posOff.bottom = expandSize.left posOff.top = expandSize.right break case PlaceStyle.BACK: // 反面 posOff.x = expandSize.right posOff.y = expandSize.bottom posOff.left = expandSize.right posOff.right = expandSize.left posOff.bottom = expandSize.bottom posOff.top = expandSize.top break case PlaceStyle.BACK_TURN_RIGHT: // 反面右转 posOff.x = expandSize.bottom posOff.y = expandSize.left posOff.left = expandSize.bottom posOff.right = expandSize.top posOff.bottom = expandSize.left posOff.top = expandSize.right break case PlaceStyle.BACK_TURN_BACK: // 反面后转 posOff.x = expandSize.left posOff.y = expandSize.top posOff.left = expandSize.left posOff.right = expandSize.right posOff.bottom = expandSize.top posOff.top = expandSize.bottom break case PlaceStyle.BACK_TURN_LEFT: // 反面左转 posOff.x = expandSize.top posOff.y = expandSize.right posOff.left = expandSize.bottom posOff.right = expandSize.bottom posOff.bottom = expandSize.right posOff.top = expandSize.left break default: break } } return posOff }, /**翻转 */ turnPlacePosition(pb: PlaceBoard, newlocator: BoardPosition) { if (this.placeOriginByBoardLocation == false) return if (pb.isAdnormal()) return // 余料板是余料板,不参与翻转 let width = pb.width let length = pb.length // RIGHT_BOTTOM, 靠板 if (newlocator == BoardPosition.RIGHT_BOTTOM) { for (let block of pb.blockList) { let x = width - block.placeX - block.placeWidth let y = block.placeY let placeStyle = this.getPlaceStyle_zy(block) block.placeX = x block.placeY = y block.placeStyle = placeStyle } } // RIGHT_TOP, 靠板 if (newlocator == BoardPosition.RIGHT_TOP) { console.log('BoardPosition=BoardPosition.RIGHT_TOP') for (let block of pb.blockList) { let x = width - block.placeX - block.placeWidth let y = length - block.placeLength - block.placeY let placeStyle = this.getPlaceStyle_dj(block) block.placeX = x block.placeY = y block.placeStyle = placeStyle } } // 左上角, 靠板 if (newlocator == BoardPosition.LEFT_TOP) { console.log('BoardPosition=BoardPosition.左上角') for (let block of pb.blockList) { let x = block.placeX let y = length - block.placeLength - block.placeY let placeStyle = this.getPlaceStyle_sx(block) block.placeX = x block.placeY = y block.placeStyle = placeStyle } } }, /** 板放置后,重置placeWidth, placeLength, 封边, 正反面, 面孔, 造型等 */ resetPlaceStyle(_block: PlaceBlock, newStyle: PlaceStyle) { let block = new PlaceBlock(_block) block = { ..._block } // console.debug('resetPlaceStyle test!!!',newStyle) block.placeStyle = newStyle // tryFix let _width = block.cutWidth let _lenth = block.cutLength if (block.width > block.length) { block.cutWidth = Math.max(_width, _lenth) block.cutLength = Math.min(_width, _lenth) } else { block.cutWidth = Math.min(_width, _lenth) block.cutLength = Math.max(_width, _lenth) } switch (newStyle) { case PlaceStyle.FRONT: // 正面 block.placeWidth = block.cutWidth block.placeLength = block.cutLength block.placeSealLeft = block.sealLeft block.placeSealRight = block.sealRight block.placeSealTop = block.sealTop block.placeSealBottom = block.sealBottom block.holeCountSideLeft = block?.blockDetail?.holeCountLeft || 0 block.holeCountSideRight = block?.blockDetail?.holeCountRight || 0 block.holeCountSideTop = block?.blockDetail?.holeCountTop || 0 block.holeCountSideBottom = block?.blockDetail?.holeCountBottom || 0 block.placeDirection = '→' block.placeDirection_Length = block.length > block.width - 0.001 ? '→' : '↓' break case PlaceStyle.FRONT_TURN_RIGHT: // 正面右转 block.placeWidth = block.cutLength block.placeLength = block.cutWidth block.placeSealLeft = block.sealBottom block.placeSealRight = block.sealTop block.placeSealTop = block.sealLeft block.placeSealBottom = block.sealRight block.holeCountSideLeft = block?.blockDetail?.holeCountBottom || 0 block.holeCountSideRight = block?.blockDetail?.holeCountTop || 0 block.holeCountSideTop = block?.blockDetail?.holeCountLeft || 0 block.holeCountSideBottom = block?.blockDetail?.holeCountRight || 0 block.placeDirection = '↓' block.placeDirection_Length = block.length > block.width - 0.001 ? '↓' : '←' break case PlaceStyle.FRONT_TURN_BACK: // 正面后转 block.placeWidth = block.cutWidth block.placeLength = block.cutLength block.placeSealLeft = block.sealRight block.placeSealRight = block.sealLeft block.placeSealTop = block.sealBottom block.placeSealBottom = block.sealTop block.holeCountSideLeft = block?.blockDetail?.holeCountRight || 0 block.holeCountSideRight = block?.blockDetail?.holeCountLeft || 0 block.holeCountSideTop = block?.blockDetail?.holeCountBottom || 0 block.holeCountSideBottom = block?.blockDetail?.holeCountTop || 0 block.placeDirection = '←' block.placeDirection_Length = block.length > block.width - 0.001 ? '←' : '↑' break case PlaceStyle.FRONT_TURN_LEFT: // 正面左转 block.placeWidth = block.cutLength block.placeLength = block.cutWidth block.placeSealLeft = block.sealTop block.placeSealRight = block.sealBottom block.placeSealTop = block.sealRight block.placeSealBottom = block.sealLeft block.holeCountSideLeft = block?.blockDetail?.holeCountTop || 0 block.holeCountSideRight = block?.blockDetail?.holeCountBottom || 0 block.holeCountSideTop = block?.blockDetail?.holeCountRight || 0 block.holeCountSideBottom = block?.blockDetail?.holeCountLeft || 0 block.placeDirection = '↑' block.placeDirection_Length = block.length > block.width - 0.001 ? '↑' : '→' break case PlaceStyle.BACK: // 反面 block.placeWidth = block.cutWidth block.placeLength = block.cutLength block.placeSealLeft = block.sealRight block.placeSealRight = block.sealLeft block.placeSealTop = block.sealTop block.placeSealBottom = block.sealBottom block.holeCountSideLeft = block?.blockDetail?.holeCountRight || 0 block.holeCountSideRight = block?.blockDetail?.holeCountLeft || 0 block.holeCountSideTop = block?.blockDetail?.holeCountTop || 0 block.holeCountSideBottom = block?.blockDetail?.holeCountBottom || 0 block.placeDirection = '→' block.placeDirection_Length = block.length > block.width - 0.001 ? '→' : '↑' break case PlaceStyle.BACK_TURN_RIGHT: // 反面右转 block.placeWidth = block.cutLength block.placeLength = block.cutWidth block.placeSealLeft = block.sealBottom block.placeSealRight = block.sealTop block.placeSealTop = block.sealRight block.placeSealBottom = block.sealLeft block.holeCountSideLeft = block?.blockDetail?.holeCountBottom || 0 block.holeCountSideRight = block?.blockDetail?.holeCountTop || 0 block.holeCountSideTop = block?.blockDetail?.holeCountRight || 0 block.holeCountSideBottom = block?.blockDetail?.holeCountLeft || 0 block.placeDirection = '↓' block.placeDirection_Length = block.length > block.width - 0.001 ? '↓' : '→' break case PlaceStyle.BACK_TURN_BACK: // 反面后转 block.placeWidth = block.cutWidth block.placeLength = block.cutLength block.placeSealLeft = block.sealLeft block.placeSealRight = block.sealRight block.placeSealTop = block.sealTop block.placeSealBottom = block.sealBottom block.holeCountSideLeft = block?.blockDetail?.holeCountLeft || 0 block.holeCountSideRight = block?.blockDetail?.holeCountRight || 0 block.holeCountSideTop = block?.blockDetail?.holeCountTop || 0 block.holeCountSideBottom = block?.blockDetail?.holeCountBottom || 0 block.placeDirection = '←' block.placeDirection_Length = block.length > block.width - 0.001 ? '←' : '↓' break case PlaceStyle.BACK_TURN_LEFT: // 反面左转 block.placeWidth = block.cutLength block.placeLength = block.cutWidth block.placeSealLeft = block.sealTop block.placeSealRight = block.sealBottom block.placeSealTop = block.sealLeft block.placeSealBottom = block.sealRight block.holeCountSideLeft = block?.blockDetail?.holeCountTop || 0 block.holeCountSideRight = block?.blockDetail?.holeCountBottom || 0 block.holeCountSideTop = block?.blockDetail?.holeCountLeft || 0 block.holeCountSideBottom = block?.blockDetail?.holeCountRight || 0 block.placeDirection = '↑' block.placeDirection_Length = block.length > block.width - 0.001 ? '↑' : '←' break default: break } this.resetDoFace_HoleModel(block) }, resetDoFace_HoleModel(block: PlaceBlock) { let isTurnOver = block.isTurnOver if (block.blockDetail == null) { console.error('resetDoFace_HoleModel error,with out blockDetail'); return } let orgMA = block.blockDetail.modelListFaceA let orgMB = block.blockDetail.modelListFaceB let orgMT = block.blockDetail.modelListThrough let orgHA = block.blockDetail.holeListFaceA let orgHB = block.blockDetail.holeListFaceB let orgHT = block.blockDetail.holeListThrough if (isTurnOver) { block.modelListFaceA = orgMB.concat(orgMT); block.modelListFaceB = orgMA; block.holeListFaceA = orgHB.concat(orgHT); block.holeListFaceB = orgHA; } else { block.modelListFaceA = orgMA.concat(orgMT); block.modelListFaceB = orgMB; block.holeListFaceA = orgHA.concat(orgHT);; block.holeListFaceB = orgHB; } //获取贴标位置 let p = this.getPlaceXYInBlock(block, block.blockDetail.labelPosX, block.blockDetail.labelPosY, false, false); block.labelPosX = p.x; block.labelPosY = p.y; }, getPlaceXYInBlock(block: PlaceBlock, x: number, y: number, isSealed: boolean, isFaceB = false, preCutValueOff = null): Point { let bwidth = block.cutWidth let blength = block.cutLength let x0: any = x let y0: any = y if (isSealed) // 已封边 { bwidth = block.width blength = block.length x0 += block.offsetX y0 += block.offsetY } if (!isSealed && preCutValueOff) // 没封边,且有封边 { bwidth += preCutValueOff.w blength += preCutValueOff.l x0 += preCutValueOff.x y0 += preCutValueOff.y } let _point: any = this.getPlacedPostionInBlock(block.placeStyle, bwidth, blength, x0, y0, isFaceB) return _point }, /** 获得翻转后的新坐标 */ getPlacedPostionInBlock(placeStyle: PlaceStyle, bwidth: number, blength: number, x0: number, y0: number, isFaceB: boolean): Point { let posX = x0 let posY = y0 let placeWidth = bwidth switch (placeStyle) { case PlaceStyle.FRONT: break case PlaceStyle.FRONT_TURN_RIGHT: posX = y0 posY = bwidth - x0 placeWidth = blength break case PlaceStyle.FRONT_TURN_BACK: posX = bwidth - x0 posY = blength - y0 break case PlaceStyle.FRONT_TURN_LEFT: posX = blength - y0 posY = x0 placeWidth = blength break case PlaceStyle.BACK: posX = bwidth - x0 posY = y0 break case PlaceStyle.BACK_TURN_RIGHT: posX = y0 posY = x0 placeWidth = blength break case PlaceStyle.BACK_TURN_BACK: posX = x0 posY = blength - y0 break case PlaceStyle.BACK_TURN_LEFT: posX = blength - y0 posY = bwidth - x0 placeWidth = blength break default: break } if (isFaceB) { posX = placeWidth - posX } return new Point(posX, posY) } }