4 Commits

Author SHA1 Message Date
c56edf7bc8 更新:类型 TransformProcessingItem 添加 depth (可选) TransformProcessingItem ?: number
添加原因:1、后续可能有依据 Z轴做坐标转化 2、对接后续流程后发现  有depth  后续可能会少很多操作
2025-08-29 11:17:15 +08:00
6415749140 更新下字段名 2025-08-27 11:07:02 +08:00
5c0a73dafc feat: 提交 2025-08-27 08:56:23 +08:00
b4b0cea5f2 移除 ModelProcessPointsProc 功能无法覆盖业务,
新增 TransformProcessItemByPositionProc  小板翻转处理器, 可获得小板 孔、造型、轮廓 在大板上的坐标,并修改 放置方式修改后的小板其他属性
2025-08-26 18:21:32 +08:00
6 changed files with 30198 additions and 56881 deletions

21
.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,21 @@
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "启动程序",
"skipFiles": [
"<node_internals>/**"
],
"program": "${workspaceFolder}\\src\\processors\\modelProcessPoints\\modelProcessPoints.test.ts",
"outFiles": [
"${workspaceFolder}/**/*.js"
]
}
]
}

View File

@@ -1,6 +1,6 @@
{
"name": "@imes-modelprocesspoints/libs",
"version": "0.1.0",
"version": "1.1.2",
"description": "",
"type": "module",
"scripts": {
@@ -21,7 +21,7 @@
"./utils": "./src/utils/index.ts"
},
"dependencies": {
"cut-abstractions": "http://gitea.cf/MES-FE/cut-abstractions/releases/download/0.2/cut-abstractions-0.2.1.tgz"
"cut-abstractions": "http://gitea.cf/MES-FE/cut-abstractions/releases/download/0.3/cut-abstractions-0.3.4.tgz"
},
"devDependencies": {
"@types/node": "^24.0.10",

View File

@@ -1,7 +1 @@
/**
* @package @mes-modelprocesspoints/libs
* @description 工作流处理器类库,在这个文件中使用导出时,不要在路径中使用'@',否则模块无法加载
*/
// CutOrder
export * from "./processors/modelProcessPoints/modelProcessPoints";
export * from "./processors/TransformProcessItemByPosition/TransformProcessItemByPosition"

View File

@@ -1,37 +1,24 @@
import { ConfigBase, ProcessorBase, ProcessorContext } from "cut-abstractions";
import { ConfigBase, FaceType, IPoint, OffsetInfo, PositionType, ProcessorBase, ProcessorContext, RotationAction } from "cut-abstractions";
/**
*
*
*
*
*
*/
export class ModelProcessPointsProc extends ProcessorBase<ModelProcessPointsInput, ModelProcessPointsOutput, ModelProcessPointsProcConfig> {
export class TransformProcessItemByPositionProc extends ProcessorBase<TransformProcessItemByPositionInput, TransformProcessItemByPositionOutput, TransformProcessItemByPositionProcConfig> {
get name(): string {
return 'ModelProcessPoints';
return 'TransformProcessItemByPosition';
}
get version(): string {
return '1.0.0';
}
exec(context: ProcessorContext<ModelProcessPointsInput, ModelProcessPointsOutput, ModelProcessPointsProcConfig>): Promise<void> | void {
exec(context: ProcessorContext<TransformProcessItemByPositionInput, TransformProcessItemByPositionOutput, TransformProcessItemByPositionProcConfig>): Promise<void> | void {
return new Promise(async (resolve, reject) => {
try {
if (context.input) {
if (context.input.block) {
// if (Array.isArray(context.input.block.models) && context.input.block.models.length > 0) {
/** 板件的坐标X */
let placeX = context.input.block.x
/** 板件的坐标Y */
let placeY = context.input.block.y
let output: ModelProcessPointsOutput = {
block: {
id: context.input.block.id,
positionType: context.input.block.positionType || 0,
models: [],
width: context.input.block.width,
length: context.input.block.length,
offsetInfo: context.input.block.offsetInfo
}
if (context.input.blocks) {
let output: TransformProcessItemByPositionOutput = {
blocks: []
}
/**
@@ -41,16 +28,15 @@ export class ModelProcessPointsProc extends ProcessorBase<ModelProcessPointsInpu
*
*
*/
let resBlock = this.handleByPositionType(context.input.block, context.input.targetPosition)
let res1 = this.handleByPlaceXY(resBlock.models, placeX, placeY)
resBlock.models = res1
output.block = {
...output.block,
...resBlock,
for (const k in context.input.blocks) {
let block = context.input.blocks[k]
let targetPosition = block.targetPositionType || 0
let resBlock: TransformProcessItemByPositionOutputBlock = this.handleByPositionType(block, targetPosition)
resBlock = await this.handleProcessItemPointsData(resBlock)
// resBlock = res1
output.blocks.push(resBlock)
}
context.output = output
resolve()
} else {
@@ -95,15 +81,13 @@ export class ModelProcessPointsProc extends ProcessorBase<ModelProcessPointsInpu
* block.width Y轴的值
* block.length x轴的值
*/
handleByPositionType(block: ModelProcessPointsInputBlock, targetPosition: PositionType) {
/** 造型输出的数据 */
let models: ModelProcessItem[] = []
handleByPositionType(block: TransformProcessItemByPositionInputBlock, targetPosition: PositionType) {
let _width = block.width
let _length = block.length
let temp = JSON.parse(JSON.stringify(block))
let resBlock: ModelProcessPointsInputBlock = {
let resBlock: TransformProcessItemByPositionOutputBlock = {
...temp
}
/** 默认 正面 */
@@ -138,47 +122,11 @@ export class ModelProcessPointsProc extends ProcessorBase<ModelProcessPointsInpu
//#endregion
// 处理造型的部分
for (const i in resBlock.models) {
let model = { ...resBlock.models[i] }
/** 如果要 翻面 那就先把面 翻过来 */
if (isTurn) {
// 翻面 x 不变 Y 变
model = this.change_turnFace(model, _width)
// 然后 弧度值要取反
model = this.reverseBuls(model)
}
/**
*
* : 左转
*
*/
switch (action) {
case 'doNothing':
// 啥事也不做
break;
case 'turnAround':
// 翻转 x 变 y 也变
model = this.change_turnAround(model, _length, _width)
break;
case 'turnLeft':
model = this.change_turnLeft(model, _length)
break;
case 'turnRight':
model = this.change_turnRight(model, _length)
break;
default:
break;
}
models.push(model)
}
resBlock.models = this.transformByBlock(resBlock.models, isTurn, action, _width, _length)
resBlock.holes = this.transformByBlock(resBlock.holes, isTurn, action, _width, _length)
resBlock.border = this.transformByBlock(resBlock.border, isTurn, action, _width, _length)
/** 左转 或者 右转 长宽值 要互换 */
@@ -233,6 +181,62 @@ export class ModelProcessPointsProc extends ProcessorBase<ModelProcessPointsInpu
return resBlock
}
/**
*
* @param processItemList
* @param isTurn
* @param action
* @param width ---
* @param length ---
*
* @returns TransformProcessingItem[]
*/
transformByBlock(processItemList: TransformProcessingItem[], isTurn: boolean, action: RotationAction, width: number, length: number): TransformProcessingItem[] {
/** 要输出的加工项的数据 */
let newProcessItemList: TransformProcessingItem[] = []
for (const i in processItemList) {
let processItem = { ...processItemList[i] }
/** 如果要 翻面 那就先把面 翻过来 */
if (isTurn) {
// 翻面 x 不变 Y 变
processItem = this.change_turnFace(processItem, width)
// 然后 弧度值要取反
processItem = this.reverseBuls(processItem)
}
/**
*
* : 左转
*
*/
switch (action) {
case 'doNothing':
// 啥事也不做
break;
case 'turnAround':
// 翻转 x 变 y 也变
processItem = this.change_turnAround(processItem, length, width)
break;
case 'turnLeft':
processItem = this.change_turnLeft(processItem, length)
break;
case 'turnRight':
processItem = this.change_turnRight(processItem, length)
break;
default:
break;
}
newProcessItemList.push(processItem)
}
return newProcessItemList
}
/** 获取翻面 后的 放置方式 */
getPositionAfterTurnFace(v: PositionType) {
let res = transitions_PositionTurnFace[v]
@@ -254,64 +258,64 @@ export class ModelProcessPointsProc extends ProcessorBase<ModelProcessPointsInpu
* @param model
* @param valueX
*/
change_turnRight(model: ModelProcessItem, valueX: number) {
let newModel = { ...model }
for (const i in newModel.pts) {
newModel.pts[i] = {
x: valueX - newModel.pts[i].y,
y: newModel.pts[i].x
change_turnRight(processItem: TransformProcessingItem, valueX: number) {
let newProcessItem = { ...processItem }
for (const i in newProcessItem.pts) {
newProcessItem.pts[i] = {
x: valueX - newProcessItem.pts[i].y,
y: newProcessItem.pts[i].x
}
}
return newModel
return newProcessItem
}
/**
* @param model
* @param valueX
*/
change_turnLeft(model: ModelProcessItem, valueX: number) {
let newModel = { ...model }
for (const i in newModel.pts) {
newModel.pts[i] = {
x: newModel.pts[i].y,
y: valueX - newModel.pts[i].x
change_turnLeft(processItem: TransformProcessingItem, valueX: number) {
let newProcessItem = { ...processItem }
for (const i in newProcessItem.pts) {
newProcessItem.pts[i] = {
x: newProcessItem.pts[i].y,
y: valueX - newProcessItem.pts[i].x
}
}
return newModel
return newProcessItem
}
/** xy
* @param model
* @param valueX
* @param valueY
*/
change_turnAround(model: ModelProcessItem, valueX: number, valueY: number) {
let newModel = { ...model }
for (const i in newModel.pts) {
newModel.pts[i] = {
x: valueX - newModel.pts[i].x,
y: valueY - newModel.pts[i].y
change_turnAround(processItem: TransformProcessingItem, valueX: number, valueY: number) {
let newProcessItem = { ...processItem }
for (const i in newProcessItem.pts) {
newProcessItem.pts[i] = {
x: valueX - newProcessItem.pts[i].x,
y: valueY - newProcessItem.pts[i].y
}
}
return newModel
return newProcessItem
}
/**翻面 改变 y坐标 */
change_turnFace(model: ModelProcessItem, valueY: number) {
let newModel = { ...model }
for (const i in newModel.pts) {
newModel.pts[i].y = valueY - newModel.pts[i].y
change_turnFace(processItem: TransformProcessingItem, valueY: number) {
let newProcessItem = { ...processItem }
for (const i in newProcessItem.pts) {
newProcessItem.pts[i].y = valueY - newProcessItem.pts[i].y
}
return newModel
return newProcessItem
}
/** 给 弧度值 取反 */
reverseBuls(model: ModelProcessItem) {
let newModel = { ...model }
for (const i in newModel.buls) {
newModel.buls[i] = -newModel.buls[i]
reverseBuls(processItem: TransformProcessingItem) {
let newProcessItem = { ...processItem }
for (const i in newProcessItem.buls) {
newProcessItem.buls[i] = -newProcessItem.buls[i]
}
return newModel
return newProcessItem
}
/**正面的放置方式 集合*/
frontArr = [
@@ -340,36 +344,72 @@ export class ModelProcessPointsProc extends ProcessorBase<ModelProcessPointsInpu
}
return res
}
/**
*
*/
async handleProcessItemPointsData(block: TransformProcessItemByPositionOutputBlock) {
let placeX = block.x
let placeY = block.y
/** 根据 优化后的坐标XY便宜 */
handleByPlaceXY(models: ModelProcessItem[], placeX: number, placeY: number) {
let newModels: ModelProcessItem[] = []
for (const model of models) {
let newModel: ModelProcessItem = { ...model }
// 造型
let models = block.models
// 孔
let holes = block.holes
// 板件轮廓
let border = block.border
if (Array.isArray(models) && models.length > 0) {
models = await this.handleByPlaceXY(models, placeX, placeY)
} else {
models = []
}
if (Array.isArray(holes) && holes.length > 0) {
holes = await this.handleByPlaceXY(holes, placeX, placeY)
} else {
holes = []
}
if (Array.isArray(border) && border.length > 0) {
border = await this.handleByPlaceXY(border, placeX, placeY)
} else {
border = []
}
block = {
...block,
holes: holes,
models: models,
border: border
}
return block
}
/** 根据 优化后的坐标XY偏移 */
handleByPlaceXY(processItemList: TransformProcessingItem[], placeX: number, placeY: number) {
let newProcessItemList: TransformProcessingItem[] = []
for (const processItem of processItemList) {
let newProcessItem: TransformProcessingItem = { ...processItem }
let newPts = []
for (const k in newModel.pts) {
for (const k in newProcessItem.pts) {
let p = {
x: model.pts[k].x + placeX,
y: model.pts[k].y + placeY
x: newProcessItem.pts[k].x + placeX,
y: newProcessItem.pts[k].y + placeY
}
newPts.push(p)
}
newModel.pts = newPts
newModels.push(newModel)
newProcessItem.pts = newPts
newProcessItemList.push(newProcessItem)
}
return newModels
return newProcessItemList
}
}
/** 处理器输入-- 获取造型在大板的刀路 */
export type ModelProcessPointsInput = {
export type TransformProcessItemByPositionInput = {
/** 小板数据 */
block: ModelProcessPointsInputBlock,
/** 小板的最终的放置位置 */
targetPosition: PositionType
blocks: TransformProcessItemByPositionInputBlock[],
}
/** 处理器输入--小板 -- 获取造型在大板的刀路 */
export type ModelProcessPointsInputBlock = {
export type TransformProcessItemByPositionInputBlock = {
/** 板件唯一标识 */
id: string | number,
/** 板件基于大板的 坐标X */
@@ -381,48 +421,56 @@ export type ModelProcessPointsInputBlock = {
/** 板件(小板)宽 */
width: number,
/** 造型数据 依据放置方式positionType 下的造型数据 默认为 依据放置方式positionType.FRONT 的造型数据 */
models: ModelProcessItem[],
models: TransformProcessingItem[],
/** 孔数据 */
holes: TransformProcessingItem[],
/** 轮廓数据 */
border: TransformProcessingItem[],
/** 板件的原放置方式 默认为正面0 不传则为正面 原 placestyle*/
positionType?: PositionType,
/** 目标放置方式 优化后会有这个数据 或者是 手动排版 */
targetPositionType?: PositionType
/** 偏移值 */
offsetInfo: OffsetInfo
}
/** 板件 上下左右 偏移值信息 */
export type OffsetInfo = {
top: number,
bottom: number,
left: number,
right: number,
}
/** 处理器输出--小板 -- 获取造型在大板的刀路 */
export type ModelProcessPointsOutputBlock = {
/** 处理器输出--小板 修改放置方式后 内部的加工数据-- 基于大板 */
export type TransformProcessItemByPositionOutputBlock = {
/** 板件唯一标识 */
id: string | number
/** 放置方式 */
positionType: PositionType
/** 造型数据 */
models: ModelProcessItem[]
/** 造型数据 依据放置方式positionType 下的造型数据 默认为 依据放置方式positionType.FRONT 的造型数据 */
models: TransformProcessingItem[],
/** 孔数据 */
holes: TransformProcessingItem[],
/** 轮廓数据 看需求 因为存在多种类型的轮廓 所有这里为数组 */
border: TransformProcessingItem[],
/** 板件(小板)长 */
length: number,
/** 板件(小板)宽 */
width: number,
/** 板件坐标 */
x: number,
/** 板件坐标 */
y: number,
/** 偏移值 */
offsetInfo: OffsetInfo
offsetInfo: OffsetInfo,
}
/** 处理器输出-- 获取造型在大板的刀路 */
export type ModelProcessPointsOutput = {
block: ModelProcessPointsOutputBlock
export type TransformProcessItemByPositionOutput = {
blocks: TransformProcessItemByPositionOutputBlock[]
}
/** 处理器配置-- 获取造型在大板的刀路 暂无 */
export declare class ModelProcessPointsProcConfig extends ConfigBase {
export declare class TransformProcessItemByPositionProcConfig extends ConfigBase {
}
/** 造型类 */
export interface ModelProcessItem {
export interface TransformProcessingItem {
/** 加工项唯一标识 */
id?: string | number
/**
@@ -435,43 +483,9 @@ export interface ModelProcessItem {
buls: number[];
/** 加工面 */
face: FaceType
/** 加工项深度 */
depth?: number
}
/** 加工面 */
export enum FaceType {
/** 正面 */
FRONT = 0,
/** 反面 */
BACK = 1,
}
/** 点坐标类 */
export interface IPoint { x: number, y: number; }
/** 小板的放置方式 */
export enum PositionType {
/** 正面 */
FRONT = 0,
/** 正面右转 */
FRONT_TURN_RIGHT = 1,
/** 正面后转 */
FRONT_TURN_BACK = 2,
/** 正面左转 */
FRONT_TURN_LEFT = 3,
/** 反面 */
BACK = 4,
/** 反面右转 */
BACK_TURN_RIGHT = 5,
/** 反面后转 */
BACK_TURN_BACK = 6,
/** 反面左转 */
BACK_TURN_LEFT = 7,
}
/** 行为类型 */
export type RotationAction = 'doNothing' | 'turnLeft' | 'turnRight' | 'turnAround'
/**
*
*

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff