24 Commits
0.1 ... 0.2

Author SHA1 Message Date
c6a273930a 更新 package.json 2025-07-30 17:32:32 +08:00
9bcb60b457 Merge pull request '新增"机台加工项" ProcessItem类型,移除samples代码' (#4) from feature/process_item into main
Reviewed-on: #4
Reviewed-by: 谢凡 <xief@163.com>
2025-07-30 17:28:59 +08:00
fbb9de77f9 新增"机台加工项" ProcessItem类型,移除samples代码 2025-07-30 17:27:14 +08:00
d8c062d13e feat:提交--上传开料顺序(新)处理器使用的数据类型,并更新版本号 2025-07-30 17:20:24 +08:00
a9734ba9d4 Merge pull request '重构矩形优化处理器字段名,添加优化回调字段,删除不必要的包依赖' (#3) from opt/layout_types into main
Reviewed-on: #3
Reviewed-by: 谢凡 <xief@163.com>
2025-07-29 17:42:16 +08:00
2d3c09c0b2 重构矩形优化处理器字段名,添加优化回调字段 2025-07-29 17:34:42 +08:00
3631af79c2 Merge pull request '导出矩形优化类型' (#2) from fix/rect_layout_export into main
Reviewed-on: #2
2025-07-25 16:29:33 +08:00
c6d1ccea71 导出矩形优化类型 2025-07-25 16:28:43 +08:00
0df05f4825 Merge pull request '新增优化相关数据模型,新增矩形优化处理器数据模型' (#1) from feature/layout_model into main
Reviewed-on: #1
2025-07-25 16:22:16 +08:00
73084fe6a2 新增优化相关数据模型,新增矩形优化处理器数据模型 2025-07-25 16:19:47 +08:00
xief
160bb294ca 新增刀配置 2025-07-17 16:02:45 +08:00
03229b5f48 更改处理器上下文类型为TS接口,多项优化:
- 修复Typescript库依赖错误
- 完善注释,格式化代码
- 更新pnpm lock文件版本为9.0
2025-07-15 16:13:59 +08:00
e8ae91bb2a Merge branch 'main' of http://gitea.cf/MES-FE/cut-abstractions 2025-07-09 16:36:35 +08:00
595675a08a feat:处理器初步实现---有接上了新优化,回显需要再看下 2025-07-09 16:36:26 +08:00
xief
d9a3368185 ProcessorContext成员改为小写 2025-07-09 16:19:41 +08:00
xief
2105c4b656 更新版本号 2025-07-09 16:17:34 +08:00
xief
1adee71c7a 修复接口定义 2025-07-09 16:16:49 +08:00
xief
92b49c7035 调整文档,改进设计 2025-07-04 16:47:14 +08:00
xief
fd68920e01 更新术语表 2025-07-04 14:45:57 +08:00
xief
1954f8d612 新增处理器类型的定义 2025-07-03 10:26:03 +08:00
xief
4473a9af41 修复发布包引用问题 2025-06-24 15:27:09 +08:00
xief
d73c260fb8 文档更新 2025-06-24 14:45:53 +08:00
xief
79c3284ced 更新文档 2025-06-24 14:36:45 +08:00
xief
c43224ed4a 修复打包引用 2025-06-24 14:21:38 +08:00
21 changed files with 30527 additions and 1617 deletions

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

@@ -0,0 +1,36 @@
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Jest All",
"program": "${workspaceFolder}/node_modules/.bin/jest",
"args": ["--runInBand"],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen",
"disableOptimisticBPs": true,
"windows": {
"program": "${workspaceFolder}/node_modules/jest/bin/jest"
}
},
{
"type": "node",
"request": "launch",
"name": "Jest Current File",
"program": "${workspaceFolder}/node_modules/.bin/jest",
"args": [
"--runTestsByPath",
"${relativeFile}",
"--config",
"jest.config.js"
],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen",
"disableOptimisticBPs": true,
"windows": {
"program": "${workspaceFolder}/node_modules/jest/bin/jest"
}
}
]
}

View File

@@ -0,0 +1,97 @@
# Cut Abstractions
这是一个用于MES新版生产的抽象库提供了一套可扩展的处理器和解析器用于处理各种切割相关的指令和数据。
## 核心概念
- **处理器 (Processor)**: 负责执行具体的加工任务。每个处理器都包含名称、版本和执行方法。开发者可以继承 `ProcessorBase` 来实现自定义的处理器。
- **解析器 (Parser)**: 负责解析文本指令,并调用相应的处理代码。`ParserBase` 提供了解析和执行指令的基本框架。
- **上下文 (Context)**: 在处理器执行期间传递数据,包含输入、参数和输出。
## 主要功能
- **可扩展的处理器架构**: 允许开发者轻松添加新的加工处理器,以适应不同的业务需求。
- **灵活的指令解析**: 支持自定义指令集,可以解析文本格式的指令并执行相应的操作。
- **清晰的数据流**: 通过上下文对象在处理器之间传递数据,使得数据流清晰可控。
## 使用示例
以下是一个简单的示例,展示了如何使用本库:
```typescript
import { ProcessorBase, ProcessorContext } from 'cut-abstractions';
// 定义输入、输出和配置类型
interface MyInput {
data: string;
}
interface MyOutput {
result: string;
}
interface MyConfig {
param: string;
}
// 创建一个自定义处理器
class MyProcessor extends ProcessorBase<MyInput, MyOutput, MyConfig> {
get name() {
return 'my-processor';
}
get version() {
return '1.0.0';
}
exec(context: ProcessorContext<MyInput, MyOutput, MyConfig>) {
// 执行处理逻辑
const inputData = context.input?.data || '';
const param = context.params?.param || '';
context.output = {
result: `Processed: ${inputData} with param: ${param}`,
};
}
}
// 使用处理器
const processor = new MyProcessor();
const context: ProcessorContext<MyInput, MyOutput, MyConfig> = {
input: { data: 'hello' },
params: { param: 'world' },
};
processor.exec(context);
console.log(context.output?.result); // "Processed: hello with param: world"
```
## 模块
- `base`: 提供了处理器的基本抽象。
- `parsers`: 提供了指令解析器的基本抽象。
- `models`: 定义了项目中使用的数据模型,如 `Config``Knife``File`
## 术语表
| 中文 | CAD | MES | IMES | 备注 |
| --- | --- | --- | --- | --- |
| 房名 | RoomName | roomName | roomName | |
| 柜名 | CabinetName | boxName | bodyName | |
| 小板名 | BoardName | blockName | blockName | |
| 材质 | Material | material | material | |
| 大板名 | 无 | boardName | goodsName | |
| 余料 | 无 | scrap | remain | |
| 排单 | 无 | planOrder |planOrder | |
## 编译与发布
更新 package.json 版本号
```shell
pnpm clean
pnpm build
pnpm release
```

View File

@@ -2,5 +2,7 @@ module.exports = {
transform: {
'^.+\\.(t|j)sx?$': '@swc/jest',
},
preset: 'ts-jest',
testEnvironment: 'node',
extensionsToTreatAsEsm: ['.ts', '.tsx']
};

View File

@@ -1,16 +1,20 @@
{
"name": "cut-abstractions",
"version": "0.1.1",
"version": "0.2.0",
"description": "",
"main": "index.ts",
"files": ["dist/**/*"],
"files": [
"dist/**/*"
],
"main": "./dist/index.js",
"module": "./dist/index.js",
"types": "./dist/index.d.js",
"exports": {
".": "./dist/**/*"
".": "./dist/index.js"
},
"scripts": {
"build": "tsc",
"release": "pnpm pack --pack-destination ./dist-packs",
"clean":"rimraf ./dist",
"clean": "rimraf ./dist",
"test": "jest"
},
"keywords": [],
@@ -21,6 +25,8 @@
"@jest/globals": "^30.0.2",
"@swc/core": "^1.12.4",
"@swc/jest": "^0.2.38",
"@types/jest": "^30.0.0",
"cadapi": "http://gitea.cf/MES-FE/webcad-api/archive/0.0.60.tar.gz",
"jest": "^30.0.2",
"rimraf": "^6.0.1",
"typescript": "^5.8.3"

970
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,348 +0,0 @@
/** 内部指令 接收 */
export class CodeAction {
code?: String
order?: String
codeParams?: any
}
/**内部响应类 */
export class GCodeResType {
code: number = -1
data: any = null
msg: string = ''
logError(msg) {
console.error(msg)
}
}
// 加工项 点数据
export class CodeParams {
/** x坐标 */
x?: Number | String
/** y坐标 */
y?: Number | String
/** z坐标 */
z?: Number | String
/** 调用的代码编号 */
dir?: Number | String
/** 圆弧半径 */
r?: Number | String
/** 速度 */
f?: Number | String
/** IJK 模式的i */
i?: Number | String
/** IJK 模式的j */
j?: Number | String
/** IJK 模式的k */
k?: Number | String
/** 代码标识 */
codeKey?: String
/** x坐标 */
xKey?: String
/** y坐标 */
yKey?: String
/** z坐标 */
zKey?: String
/** 圆弧半径 */
rKey?: String
/** 速度 */
fKey?: String
/** IJK 模式的i */
iKey?: String
/** IJK 模式的j */
jKey?: String
/** IJK 模式的k */
kKey?: String
}
export type _knifeType = Partial<Knife>
/**
* 板面类型
* 0正面 1反面 2侧面 21左侧面 22右侧面 23上侧面 24下侧面 29 弧形侧面 30异形侧面
*/
export enum FaceType {
/** 正面 */
FRONT = 0,
/** 反面 */
BACK = 1,
/** 侧面 */
SIDE = 2,
/** 左侧面 */
LEFT_SIDE = 21,
/** 右侧面 */
RIGHT_SIDE = 22,
/** 上侧面 */
TOP_SIDE = 23,
/** 下侧面 */
BOTTOM_SIDE = 24,
/** 弧形侧面 */
CURVED_SIDE = 29,
/** 异形侧面 */
SPECIAL_SHAPED_SIDE = 30,
}
/** 开料刀 */
export class Knife {
/** 是否启用 */
isEnabled = true;
/** 轴号 */
axleId = 0;
/** 开料刀ID号 */
knifeId = 1;
/** 加工面(0正面 1反面 2左侧面 3右侧面 4上侧面 5下侧面 6任意) */
processFace = 0;
/** 刀名称 */
knifeName = '';
/** 刀具类型(1铣刀 2成型刀 3钻头 4锯 5刀片) */
knifeType = KnifeType.MILLING_CUTTER;
/** 功能属性(数组): 1开料/切割 2拉槽 3铣型 4铣孔 5钻孔 6拉米诺 7乐扣 8T型 */
ability: any = [];
// /** 默认开料刀 */
// isDefaultCutKnife = false;
// /** 是否可用于开料切割 */
// isCuttingKnife = false;
// /** 是否允许铣孔(knifeType为铣刀生效) */
// isMillingAllowed = false;
/** 刀直径mm */
diameter = 6;
/** 刀长(最大深度) */
length = 20;
/** 锯齿厚度,单次加工切缝宽度 */
sawThiness = 0;
/**锯向: 0横向或长边 1纵向短边 2自由角度*/
sawDirection = 0;
/**切向加工方向: 0横向左往右 2横向右往左 3纵向上往下 4纵向下往上 5随意 */
processDirection = 0;
/**进给速度, 0取系统默认 */
speed = 0;
/** 进给深度 */
stepDepth = 0;
// /** 组号 */
// groupNo = 0;
// /** 主刀 */
// isMainKnife = false;
// /** 是否高级加工 */
// isAdvancedProcessEnabled = false;
// /** 是否集合加工 */
// isBatchProcessEnabled = false;
// /** 副刀偏置长边偏移(Y轴) */
// auxKnifeOffsetY = 0;
// /** 副刀偏置短边偏移(X轴) */
// auxKnifeOffsetX = 0;
/** 偏置短边偏移(X轴)-相对于工件原点位置XY坐标的短边方向偏移量 */
offsetX = 0;
/** 偏置长边偏移(Y轴) -相对于工件原点位置XY坐标的长边方向偏移量*/
offsetY = 0;
/** 偏置垂直偏移(Z轴) -相对于工件原点位置XY坐标的垂直方向偏移量*/
offsetZ = 0;
/** 基准坐标-短边(X轴) -钻头在钻包中短边方向(纵向)的相对位置 */
baseX = 0;
/** 基准坐标-长边(Y轴) -钻头在钻包中长边方向(横向)的相对位置 */
baseY = 0;
/**组合钻 */
isModularDrill = false;
/** 是否预启动 */
isPreStartEnabled = false;
/** 预启动提前动作数 */
preStartAheadActionCount = 5;
/** 预启动延迟换刀 */
isPreStartToolChangeDelay = false;
/** 预启动延迟换刀指令 */
preStartToolChangeDelayCode = '';
/** 轴启动指令后置 */
isAxisStartCodePostpost = false;
/** 轴停止指令前置 */
isAxisStopCodePrepose = false;
/** 钻组独立指令(启用后,刀起始指令、刀结束指令使用钻组起始指令、钻组结束指令替换) */
drillGroupCode = '';
/** 轴启动代码*/
axisStartCode = "";
/** 刀启动代码 */
knifeStartCode = '';
/** 钻组起始指令 */
drillGroupStartCode = '';
/** 钻组结束指令 */
drillGroupEndCode = '';
/** 刀停止代码 */
knifeStopCode = '';
/** 轴停止指令 */
axisStopCode = '';
// /** 高级加工指令 */
// advancedCode = '';
/** 设置刀具(轴号, 刀名, 刀直径, 是否主刀, 是否铣孔, 是否开料刀) */
// set(axleId: number, name: string, diameter: number, isMainKnife: boolean, isMillingAllowed: boolean, isCuttingKnife: boolean)
/** 设置刀具(轴号, 刀名, 刀类型, 刀直径, 刀长, 是否默认刀) */
}
/** 刀类型: MILLING_CUTTER铣刀 FORMING_CUTTER成型刀 DRILL钻头 SAW锯 BLADE刀片 */
export enum KnifeType {
/** 铣刀 */
MILLING_CUTTER = 1,
/** 成型刀 */
FORMING_CUTTER = 2,
/** 钻头 */
DRILL = 3,
/** 锯 */
SAW = 4,
/** 刀片 */
BLADE = 5
}
/** 刀功能:
** 1-CUT开料/切割 2-PULLING_GROOVE拉槽 3-MILLING_MODEL铣型 4-MILLING_HOLE铣孔
** 5-DRILL_HOLE钻孔 6-RAMINO拉米诺 7-EASY_FASTEN乐扣 8-T_TYPE T型 */
export enum AbilityType {
/** 1开料/切割 */
CUT = 1,
/** 2拉槽 */
PULLING_GROOVE = 2,
/** 3铣型 */
MILLING_MODEL = 3,
/** 4铣孔 */
MILLING_HOLE = 4,
/** 5钻孔 */
DRILL_HOLE = 5,
/** 6拉米诺 */
RAMINO = 6,
/** 7乐扣 */
EASY_FASTEN = 7,
/** 8T型 */
T_TYPE = 8
}
/** 枚举 坐标轴类型 */
export enum AxisType {
/** X轴正 */
X_POS = 0,
/** X轴负 */
X_NEG = 1,
/** Y轴正 */
Y_POS = 2,
/** Y轴负 */
Y_NEG = 3,
/** 向上Z轴正 */
Z_POS = 4,
/** 向下Z轴负 */
Z_NEG = 5,
}
/** 枚举 坐标轴类型 */
export enum OriginZPosition {
/** 台面向上Z轴正 */
WorkTop = 0,
/** 板面向上Z轴正 */
BoardFace = 1,
}
// nc文件编码
export const ncEncodeMap = {
'UTF-8': 'UTF-8',
'GB2312': 'GB2312',
'UTF-8-BOM': 'UTF-8-BOM',
'GBK': 'GBK',
'Big-5': 'Big-5',
'GB18030': 'GB18030',
'Unicode': 'Unicode'
}
// 小板文件名选项
export const smallPlateOptionsMap = {
: '{0}',
: '{1}',
: '{2}',
: '{3}',
: '{4}',
: '{5}',
: '{6}',
: '{7}',
: '{8}',
: '{9}',
: '{10}',
: '{11}',
}
// zip压缩包文件名选项
export const zipFileOptionsMap = {
'板宽': '{0}',
'板长': '{1}',
'颜色': '{2}',
'材质': '{3}',
'大板号': '{4}',
'工位号': '{5}',
'板厚': '{6}',
'开料顺序': '{7}',
'批次识别': '{8}',
'小板编号': '{9}',
'全局大板号': '{10}',
'品牌': '11',
}
/** 枚举 大板边角位置 */
export enum BoardPosition {
/** 左上角 */
// LEFT_TOP = 0,
// /** 左下角 */
// LEFT_BOTTOM = 1,
// /** 右下角 */
// RIGHT_BOTTOM = 2,
// /** 右上角 */
// RIGHT_TOP = 3,
/** 左上角 */
LEFT_TOP = 3,
/** 左下角 */
LEFT_BOTTOM = 0,
/** 右下角 */
RIGHT_BOTTOM = 1,
/** 右上角 */
RIGHT_TOP = 2,
/**
* 左下角 = 0,
右下角 = 1,
右上角 = 2,
左上角 = 3
*/
}
/** 排版样式 */
export enum PlaceStyle {
/** 正面 */
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 enum EdgeType
{
/** 下=0 */
BOTTOM = 0,
/** 右=1 */
RIGHT = 1,
/** 上=2 */
TOP = 2,
/** 左=3 */
LEFT = 3,
}

View File

@@ -1,112 +0,0 @@
import { _knifeType } from "./confClass"
/** demo 刀具数据 */
export const knifeData :_knifeType= {
"isEnabled": true,
"axleId": 2,
"knifeId": 2,
"knifeName": "T1",
"knifeType": 3,
"ability": [
5
],
"diameter": 5,
"length": 20,
"sawThiness": 7,
"sawDirection": 2,
"processDirection": 4,
"speed": 0,
"stepDepth": 0,
"offsetX": 0,
"offsetY": 0,
"offsetZ": 0,
"baseX": 0,
"baseY": 0,
"isModularDrill": false,
"isPreStartEnabled": false,
"preStartAheadActionCount": 5,
"isPreStartToolChangeDelay": false,
"preStartToolChangeDelayCode": "",
"isAxisStartCodePostpost": false,
"isAxisStopCodePrepose": false,
"drillGroupCode": "",
"axisStartCode": "M03 S18000\n",
"knifeStartCode": `M06 T1\nG43 H1\n`,
"drillGroupStartCode": "T1",
"drillGroupEndCode": "",
"knifeStopCode": "",
"axisStopCode": "M05\n",
}
export const knifeData1:_knifeType = {
"isEnabled": true,
"axleId": 2,
"knifeId": 2,
"knifeName": "T2",
"knifeType": 3,
"ability": [
5
],
"diameter": 6,
"length": 20,
"sawThiness": 7,
"sawDirection": 2,
"processDirection": 4,
"speed": 0,
"stepDepth": 0,
"offsetX": 0,
"offsetY": 0,
"offsetZ": 0,
"baseX": 0,
"baseY": 0,
"isModularDrill": false,
"isPreStartEnabled": false,
"preStartAheadActionCount": 5,
"isPreStartToolChangeDelay": false,
"preStartToolChangeDelayCode": "",
"isAxisStartCodePostpost": false,
"isAxisStopCodePrepose": false,
"drillGroupCode": "",
"axisStartCode": "M03 S18000\n",
"knifeStartCode": `M06 T2\nG43 H2\n`,
"drillGroupStartCode": "T2",
"drillGroupEndCode": "",
"knifeStopCode": "",
"axisStopCode": "M05\n",
}
export const knifeData2:_knifeType = {
"isEnabled": true,
"axleId": 2,
"knifeId": 2,
"knifeName": "T3",
"knifeType": 3,
"ability": [
5
],
"diameter": 6,
"length": 20,
"sawThiness": 7,
"sawDirection": 2,
"processDirection": 4,
"speed": 0,
"stepDepth": 0,
"offsetX": 0,
"offsetY": 0,
"offsetZ": 0,
"baseX": 0,
"baseY": 0,
"isModularDrill": false,
"isPreStartEnabled": false,
"preStartAheadActionCount": 5,
"isPreStartToolChangeDelay": false,
"preStartToolChangeDelayCode": "",
"isAxisStartCodePostpost": false,
"isAxisStopCodePrepose": false,
"drillGroupCode": "",
"axisStartCode": "M03 S18000\n",
"knifeStartCode": `M06 T2\nG43 H2\n`,
"drillGroupStartCode": "T3",
"drillGroupEndCode": "",
"knifeStopCode": "",
"axisStopCode": "M05\n",
}

View File

@@ -1,124 +0,0 @@
import { ConfigBase } from "../src/base";
import { ParserBase } from "../src/parsers";
import { _knifeType, CodeParams } from "./confClass";
import { knifeData, knifeData1, knifeData2 } from "./demoKnives";
import { GCodeAction } from "./gcodes";
export class DemoParser extends ParserBase {
usedKnife?:_knifeType
knifeList:_knifeType[] = [
knifeData,
knifeData1,
knifeData2
]
constructor(config?: Record<string, ConfigBase>) {
super();
// if(config){
// if(config['knives']){
//
// }
// }
const gcodeActions = new GCodeAction();
this.codeManager['FSTART'] = {
name: 'FileStart',
// type:'Global',
// paramType:'array',
exec:(params) =>{
return `G54 G90\nM03\n`
}
};
this.codeManager['FEND'] = {
name: 'FileEnd',
exec:(params) =>{
return `M30\n`;
}
}
this.codeManager['G0'] = {
name: 'G0',
paramType: 'kv:number',
exec:(params: CodeParams) => {
return gcodeActions.G0(params) + '\n';
}
}
this.codeManager['G2'] = {
name: 'G2',
paramType: 'kv:number',
exec:(params: CodeParams)=> {
return gcodeActions.G2(params) + '\n';
}
}
this.codeManager['G3'] = {
name: 'G3',
paramType: 'kv:number',
exec:(params: CodeParams)=> {
return gcodeActions.G3(params) + '\n';
}
}
this.codeManager['TD'] = {
name: '',
exec:(diameter:number)=> {
let code = ''
let _knife: any
if (diameter) {
_knife = this.knifeList?.find(e => e.diameter == diameter)
}
if (_knife != undefined) {
code += this.checkChangeKnife(_knife)
this.usedKnife = _knife
// code += _knife.axisStartCode
code += _knife.knifeStartCode
}
return code
}
}
this.codeManager['TN'] = {
name: 'TN',
exec:(knifeName:string) =>{ /**根据刀名称找刀 换刀 */
let code = ''
let _knife: any = null
if (knifeName) {
_knife = this.knifeList?.find(e => e.knifeName == knifeName)
}
if (_knife != undefined) {
code += this.checkChangeKnife(_knife)
this.usedKnife = _knife
// code += _knife.axisStartCode
code += _knife.knifeStartCode
}
return code
}
}
this.codeManager['TE'] = {
name:'TE',
exec:()=>{
if(!this.usedKnife) return '';
return this.usedKnife.knifeStopCode+'\n';
}
}
}
/** 内部功能逻辑 换刀时判断是否需要 上一把刀的停止代码 */
private checkChangeKnife(knife: _knifeType) {
let code = '';
/** true 需要 输出停刀代码 false 不需要 */
let flag = false
// 必须要有刀
if (this.usedKnife) {
let keys = Object.keys(knife)
for (const key of keys) {
if (knife[key] != this.usedKnife[key]) {
flag = true
continue
}
}
}
if (flag) {
code += this.exec('TE',[]);
}
return code;
}
}

View File

@@ -1,528 +0,0 @@
import { CodeParams } from "./confClass"
function checkVal(val) {
let r = true
if ((val == undefined || val == '')) {
r = false
}
return r
}
/**G代码指令
* 目前 只需要做 G0 - G3
*/
export enum GCode {
/**快速定位 空程移动 范例G00 X100 Y50刀具快速移动至X100、Y50位置 */
G0 = 'G0',
/**快速定位 空程移动 范例G00 X100 Y50刀具快速移动至X100、Y50位置*/
G00 = 'G00',
/**直线 直线插补 范例G01 X200 Y300 F150刀具以150mm/min的进给速度直线移动至X200、Y300*/
G1 = 'G1',
/**直线 范例G01 X200 Y300 F150刀具以150mm/min的进给速度直线移动至X200、Y300*/
G01 = 'G01',
/** 顺时针 范例G17 G02 X150 Y50 I50 J0 F100在XY平面以半径50mm顺时针圆弧插补至X150、Y50*/
G2 = 'G2',
/** 顺时针 范例G17 G02 X150 Y50 I50 J0 F100在XY平面以半径50mm顺时针圆弧插补至X150、Y50*/
G02 = 'G02',
/** 逆时针 范例G17 G03 X150 Y50 I50 J0 F100在XY平面以半径50mm逆时针圆弧插补至X150、Y50*/
G3 = 'G3',
/** 逆时针 范例G17 G03 X150 Y50 I50 J0 F100在XY平面以半径50mm逆时针圆弧插补至X150、Y50*/
G03 = 'G03',
/**暂停 范例G04 X2暂停2秒*/
G4 = 'G4',
/**暂停 范例G04 X2暂停2秒*/
G04 = 'G04',
/** 通过中间点圆弧插补
* 1. 通过中间点圆弧插补
* 示例G05 X60 Z50 IX50 IZ60 F120 刀具从当前位置出发,经过中间点 (50, 60),最终到达终点 (60, 50),形成圆弧轨迹。
* 2. 高精轨迹控制HPCC模式
* 功能G05 可启动高精轨迹控制模式HPCC通过曲线拟合和参数优化实现高精度、高速度的轨迹加工适用于复杂曲面或高精度零件。
* 指令格式:
* 启动G05 P10000P值设为10000
* 关闭G05 P0P值设为0
* 3、注意事项
* 轴类型限制建议线性轴参与HPCC模式旋转轴需谨慎设置。
与其他功能冲突:
在HPCC模式下G61准确停止检查、G63攻螺纹等功能可能失效需退出HPCC模式后恢复。
启用 RTCP旋转刀具中心点或 STCP 模式时禁止同时启用HPCC功能。
不支持的功能:
不支持单节停止C40/M00、反向手轮模拟、图形模拟等。
剩余距离显示可能不准确,因显示的是离曲线终点的距离,而非单节终点。
* */
G5 = 'G5',
/** 通过中间点圆弧插补 */
G05 = 'G05',
/** 抛物线插补 */
G6 = 'G6',
/** 抛物线插补 */
G06 = 'G06',
/** z样条曲线插补 */
G7 = 'G7',
/** z样条曲线插补 */
G07 = 'G07',
/** 进给加速 */
G8 = 'G8',
/** 进给加速 */
G08 = 'G08',
/** 进给减速 */
G9 = 'G9',
/** 进给减速 */
G09 = 'G09',
/** 参数写入方式有效 */
G10 = 'G10',
/** 参数写入方式取消 */
G11 = 'G11',
/** 极坐标变成 */
G16 = 'G16',
/** XY平面选择 */
G17 = 'G17',
/** XZ平面选择 */
G18 = 'G18',
/** YZ平面选择 */
G19 = 'G19',
/** 英制输入 */
G20 = 'G20',
/** 公制输入 */
G21 = 'G21',
/** 半径尺寸编程方式 */
G22 = 'G22',
/** 系统操作界面上使用 */
G220 = 'G220',
/** 直径尺寸编程方式 */
G23 = 'G23',
/** 系统操作界面上使用 */
G230 = 'G230',
/** 子程序结束 */
G24 = 'G24',
/** 跳转加工 */
G25 = 'G25',
/** 循环加工 */
G26 = 'G26',
/** 参考点返回 */
G28 = 'G28',
/** 倍率注销 */
G30 = 'G30',
/** 倍率定义 */
G31 = 'G31',
/** 等螺距螺纹切削,英制 */
G32 = 'G32',
/** 等螺距螺纹切削,公制 */
G33 = 'G33',
/** 增螺距螺纹切削 */
G34 = 'G34',
/** 减螺距螺纹切削 */
G35 = 'G35',
//** 刀具半径补正取消 */
G40 = 'G40',
//** 刀具半径补正 左*/
G41 = 'G41',
//** 刀具半径补正 右*/
G42 = 'G42',
//** 刀具长度补正+ */
G43 = 'G43',
//** 刀具长度补正- */
G44 = 'G44',
//** 道具偏置+/+ */
G45 = 'G45',
//** 道具偏置+/- */
G46 = 'G46',
//** 道具偏置-/- */
G47 = 'G47',
//** 道具偏置-/+ */
G48 = 'G48',
//** 刀具长度 补正取消 */
G49 = 'G49',
//** 局部坐标系设定 */
G52 = 'G52',
//** 机床坐标系选择 */
G53 = 'G53',
//** 工件坐标系选择1 */
G54 = 'G54',
//** 工件坐标系选择2 */
G55 = 'G55',
//** 工件坐标系选择3 */
G56 = 'G56',
//** 工件坐标系选择4 */
G57 = 'G57',
//** 工件坐标系选择5 */
G58 = 'G58',
//** 工件坐标系选择6 */
G59 = 'G59',
//** 坐标系旋转有效 */
G68 = 'G68',
//** 坐标系旋转取消 */
G69 = 'G69',
/** 高速深孔钻 */
G73 = 'G73',
/** 精搪孔 */
G76 = 'G76',
/** 固定循环取消/取消循环指令 */
G80 = 'G80',
/**程序停止 */
M00 = 'M00',
/**选择性停止 */
M01 = 'M01',
/** 程序结束 */
M02 = 'M02',
/**主轴正转 */
M03 = 'M03',
/**主轴反转 */
M04 = 'M04',
/**主轴停止 */
M05 = 'M05',
/**自动换刀 */
M06 = 'M06',
}
/**G代码基类 */
export class GCodeAction {
/** 空程直线 */
G0(params: CodeParams) {
const { x, y, z, f, xKey, yKey, zKey, fKey, codeKey } = params
let val: string = GCode.G0
if (typeof (codeKey) == 'string' && codeKey != '') {
val = codeKey
}
let _xkey = xKey || 'X'
let _yKey = yKey || 'Y'
let _zKey = zKey || 'Z'
let _fKey = fKey || 'F'
if (checkVal(x)) {
val += ` ${_xkey}${x}`
}
if (checkVal(y)) {
val += ` ${_yKey}${y}`
}
if (checkVal(z)) {
val += ` ${_zKey}${z}`
}
if (checkVal(f)) {
val += ` ${_fKey}${f}`
}
return val
}
/** 空程直线 */
G00(params: CodeParams) {
const { x, y, z, f, xKey, yKey, zKey, fKey, codeKey } = params
let val: string = GCode.G00
if (typeof (codeKey) == 'string' && codeKey != '') {
val = codeKey
}
let _xkey = xKey || 'X'
let _yKey = yKey || 'Y'
let _zKey = zKey || 'Z'
let _fKey = fKey || 'F'
if (checkVal(x)) {
val += ` ${_xkey}${x}`
}
if (checkVal(y)) {
val += ` ${_yKey}${y}`
}
if (checkVal(z)) {
val += ` ${_zKey}${z}`
}
if (checkVal(f)) {
val += ` ${_fKey}${f}`
}
return val
}
/** 直线 */
G1(params: CodeParams) {
const { x, y, z, f, xKey, yKey, zKey, fKey, codeKey } = params
let val: string = GCode.G1
if (typeof (codeKey) == 'string' && codeKey != '') {
val = codeKey
}
let _xkey = xKey || 'X'
let _yKey = yKey || 'Y'
let _zKey = zKey || 'Z'
let _fKey = fKey || 'F'
if (checkVal(x)) {
val += ` ${_xkey}${x}`
}
if (checkVal(y)) {
val += ` ${_yKey}${y}`
}
if (checkVal(z)) {
val += ` ${_zKey}${z}`
}
if (checkVal(f)) {
val += ` ${_fKey}${f}`
}
return val
}
/** 直线 */
G01(params: CodeParams) {
const { x, y, z, f, xKey, yKey, zKey, fKey, codeKey } = params
let val: string = GCode.G01
if (typeof (codeKey) == 'string' && codeKey != '') {
val = codeKey
}
let _xkey = xKey || 'X'
let _yKey = yKey || 'Y'
let _zKey = zKey || 'Z'
let _fKey = fKey || 'F'
if (checkVal(x)) {
val += ` ${_xkey}${x}`
}
if (checkVal(y)) {
val += ` ${_yKey}${y}`
}
if (checkVal(z)) {
val += ` ${_zKey}${z}`
}
if (checkVal(f)) {
val += ` ${_fKey}${f}`
}
return val
}
/** 顺时针 弧线
* @param x x坐标
* @param y y坐标
* @param z z坐标
* @param i 圆弧 对于起点的偏移量 x
* @param y 圆弧 对于起点的偏移量 Y
* @param z 圆弧 对于起点的偏移量 Y
* @param f 速度
*/
G2(params: CodeParams) {
const { x, y, z, i, j, k, r, f, xKey, yKey, zKey, fKey, iKey, jKey, kKey, codeKey } = params
let val: string = GCode.G2
if (typeof (codeKey) == 'string' && codeKey != '') {
val = codeKey
}
let _xkey = xKey || 'X'
let _yKey = yKey || 'Y'
let _zKey = zKey || 'Z'
let _fKey = fKey || 'F'
let _iKey = iKey || 'I'
let _jKey = jKey || 'J'
let _kKey = kKey || 'K'
if (checkVal(x)) {
val += ` ${_xkey}${x}`
}
if (checkVal(y)) {
val += ` ${_yKey}${y}`
}
if (checkVal(z)) {
val += ` ${_zKey}${z}`
}
if (checkVal(r)) {
val += ` R${r}`
} else {
if (checkVal(i)) {
val += ` ${_iKey}${i}`
}
if (checkVal(j)) {
val += ` ${_jKey}${j}`
}
if (checkVal(k)) {
val += ` ${_kKey}${k}`
}
}
if (checkVal(f)) {
val += ` ${_fKey}${f}`
}
return val
}
/** 顺时针 弧线
* @param x x坐标
* @param y y坐标
* @param z z坐标
* @param i 圆弧 对于起点的偏移量 x
* @param y 圆弧 对于起点的偏移量 Y
* @param z 圆弧 对于起点的偏移量 Y
* @param f 速度
*/
G02(params: CodeParams) {
const { x, y, z, i, j, k, r, f, xKey, yKey, zKey, fKey, iKey, jKey, kKey, codeKey } = params
let val: string = GCode.G02
if (typeof (codeKey) == 'string' && codeKey != '') {
val = codeKey
}
let _xkey = xKey || 'X'
let _yKey = yKey || 'Y'
let _zKey = zKey || 'Z'
let _fKey = fKey || 'F'
let _iKey = iKey || 'I'
let _jKey = jKey || 'J'
let _kKey = kKey || 'K'
if (checkVal(x)) {
val += ` ${_xkey}${x}`
}
if (checkVal(y)) {
val += ` ${_yKey}${y}`
}
if (checkVal(z)) {
val += ` ${_zKey}${z}`
}
if (checkVal(r)) {
val += ` R${r}`
} else {
if (checkVal(i)) {
val += ` ${_iKey}${i}`
}
if (checkVal(j)) {
val += ` ${_jKey}${j}`
}
if (checkVal(k)) {
val += ` ${_kKey}${k}`
}
}
if (checkVal(f)) {
val += ` ${_fKey}${f}`
}
return val
}
/** 逆时针 弧线
* @param x x坐标
* @param y y坐标
* @param z z坐标
* @param i 圆弧 对于起点的偏移量 x
* @param y 圆弧 对于起点的偏移量 Y
* @param z 圆弧 对于起点的偏移量 Y
* @param f 速度
*/
G3(params: CodeParams) {
const { x, y, z, i, j, k, r, f, xKey, yKey, zKey, fKey, iKey, jKey, kKey, codeKey } = params
let val: string = GCode.G3
if (typeof (codeKey) == 'string' && codeKey != '') {
val = codeKey
}
let _xkey = xKey || 'X'
let _yKey = yKey || 'Y'
let _zKey = zKey || 'Z'
let _fKey = fKey || 'F'
let _iKey = iKey || 'I'
let _jKey = jKey || 'J'
let _kKey = kKey || 'K'
if (checkVal(x)) {
val += ` ${_xkey}${x}`
}
if (checkVal(y)) {
val += ` ${_yKey}${y}`
}
if (checkVal(z)) {
val += ` ${_zKey}${z}`
}
if (checkVal(r)) {
val += ` R${r}`
} else {
if (checkVal(i)) {
val += ` ${_iKey}${i}`
}
if (checkVal(j)) {
val += ` ${_jKey}${j}`
}
if (checkVal(k)) {
val += ` ${_kKey}${k}`
}
}
if (checkVal(f)) {
val += ` ${_fKey}${f}`
}
return val
}
/** 逆时针 弧线
* @param x x坐标
* @param y y坐标
* @param z z坐标
* @param i 圆弧 对于起点的偏移量 x
* @param y 圆弧 对于起点的偏移量 Y
* @param z 圆弧 对于起点的偏移量 Y
* @param f 速度
*/
G03(params: CodeParams) {
const { x, y, z, i, j, k, r, f, xKey, yKey, zKey, fKey, iKey, jKey, kKey, codeKey } = params
let val: string = GCode.G03
if (typeof (codeKey) == 'string' && codeKey != '') {
val = codeKey
}
let _xkey = xKey || 'X'
let _yKey = yKey || 'Y'
let _zKey = zKey || 'Z'
let _fKey = fKey || 'F'
let _iKey = iKey || 'I'
let _jKey = jKey || 'J'
let _kKey = kKey || 'K'
if (checkVal(x)) {
val += ` ${_xkey}${x}`
}
if (checkVal(y)) {
val += ` ${_yKey}${y}`
}
if (checkVal(z)) {
val += ` ${_zKey}${z}`
}
if (checkVal(r)) {
val += ` R${r}`
} else {
if (checkVal(i)) {
val += ` ${_iKey}${i}`
}
if (checkVal(j)) {
val += ` ${_jKey}${j}`
}
if (checkVal(k)) {
val += ` ${_kKey}${k}`
}
}
if (checkVal(f)) {
val += ` ${_fKey}${f}`
}
return val
}
/** 主轴正转
*
* @param s 转速
*/
M03(s: any) {
let val: string = GCode.M03
if (checkVal(s)) {
val += ` S${s}`
}
return val
}
/**主轴反向转
* @param s 转速
*/
M04(s: any) {
let val: string = GCode.M04
if (checkVal(s)) {
val += ` S${s}`
}
return val
}
/**主轴停止 */
M05() {
let val: string = GCode.M05
return val
}
/**换刀指令 */
M06(t: String) {
let val: string = GCode.M06
if (checkVal(t)) {
val += ` T${t}`
}
return val
}
}

View File

@@ -1,15 +1,42 @@
export class ConfigBase {
name: string = '';
version:string = '1.0.0';
enable:boolean = true;
[key: string]: any;
import { ConfigBase } from "./models/config";
/**
* 加工处理器上下文
*/
export interface ProcessorContext<TInput, TOutput, TConfig extends ConfigBase> {
/**
* 输入数据
*/
input?: TInput;
/**
* 合并配置文件与临时输入参
*/
params?: TConfig;
/**
* 输出数据
*/
output?: TOutput;
}
export interface FileOptions {
encode?: string;
addBOM?: boolean;
}
export interface FileInfo extends FileOptions {
name: string,
content: string | Blob | Uint8Array,
/**
* 处理器基类
*/
export abstract class ProcessorBase<TInput, TOutput, TConfig extends ConfigBase> {
/**
* 处理器名,推荐使用 kebab-case 命名规则
* @example handle-ability
*/
public abstract get name(): string;
/**
* 处理器版本,对处理器进行更新后记得修改版本号
* 格式使用 semver
* @default 1.0.0
*/
public abstract get version(): string;
/**
* 处理器执行方法
* @param context 处理器上下文
*/
public abstract exec(context: ProcessorContext<TInput, TOutput, TConfig>): Promise<void> | void;
}

7
src/index.ts Normal file
View File

@@ -0,0 +1,7 @@
export * from './base';
export * from './parsers';
export * from './models/config';
export * from './models/knife';
export * from './models/file';
export * from './models/processors/rectLayout';
export * from './models/processors/cutOrder'

28
src/models/config.ts Normal file
View File

@@ -0,0 +1,28 @@
/**
* 配置基类,下划线开头的变量不会被序列化
*/
export class ConfigBase {
name: string = '';
version:string = '1.0.0';
[key: string]: any;
/**
* 加载反序列化数据
* @param data
*/
load(data:Record<string,unknown>){
for (const key of Object.getOwnPropertyNames(this).filter(i=>i[0]!=='_')) {
if(data[key]!=undefined){
this[key] = data[key];
}
}
}
/**
* 序列化json方法
* @returns
*/
toJson(){
return JSON.stringify(this,(k,v)=>k[0]=='_'?undefined:v);
}
}

8
src/models/file.ts Normal file
View File

@@ -0,0 +1,8 @@
export interface FileOptions {
encode?: string;
addBOM?: boolean;
}
export interface FileInfo extends FileOptions {
name: string,
content: string | Blob | Uint8Array,
}

79
src/models/knife.ts Normal file
View File

@@ -0,0 +1,79 @@
// 刀配置 移除 高级排钻,小刀辅助 可替代切割刀AllowMilling替代
export enum KnifeType{
/**
* 开料
*/
Cut = 1<<0,
/**
* 排钻
*/
Hole = 1<<1,
/**
* 拉槽
*/
Model = 1<<2,
/**
* 洗形
*/
Milling = 1<<3,
}
/**
* 刀主轴
*/
export class KnifeSpindle{
id:number = 0;
/**启动代码*/
startCode = "";
/**停止代码 */
stopCode = '';
/**是否预启动 */
isPreStart = false;
}
export class Knife
{
/**刀ID */
id = 0;
/**刀名称 */
name = '';
/**轴ID旧名称axleID */
spindleId = 0;
private _spindle?:KnifeSpindle
/**
* 刀主轴
*/
get spindle(){
return this._spindle;
}
/**
* 设置刀主轴
*/
set spindle(value){
this._spindle = value;
}
/**
* 刀类型,可复选
*/
type:KnifeType = KnifeType.Cut;
/**刀直径mm */
diameter = 6;
/**最大深度 */
length = 40;
/**偏移X */
offsetX = 0;
/**偏移Y */
offsetY = 0;
/**偏移Z */
offsetZ = 0;
/**v型刀 角度 */
vKnifeAngle = 0;
/**刀运行速度 0为取系统默认 */
speed = 0;
/**下刀步进,0为不启用,例加工深度12步进5。实际加工为 5,5,2 */
depthStep :number = 0
/**刀启动代码*/
startCode = "";
/**刀停止代码 */
stopCode = '';
/**板外下刀 */
isOffBorderCut = false;
}

27
src/models/processItem.ts Normal file
View File

@@ -0,0 +1,27 @@
export interface IPoint { x: number, y: number; }
/**
* 加工数据
*/
export interface IProcessingItem {
/**
* 加工点数组
*/
pts: IPoint[];
/**
* 凸度数组
*/
buls: number[];
/**
* 加工深度
*/
depth: number;
/**
* 半径
*/
radius: number;
/**
* 刀ID
*/
knifeId?: number;
}

View File

@@ -0,0 +1,57 @@
/**
* 开料顺序(新)所使用的类型
*
*/
import { ConfigBase } from "../config";
/** 处理器入参 开料顺序(新)
* @author lx
*
* 注20250730 暂无配置 留个位置
*/
export class CutorderConfig extends ConfigBase {
// [key:string] : any
}
/**
* 处理器输入数据源 开料顺序(新)
*/
export type CutOrderInput = {
/**开料大板 宽 */
boardWidth: number,
/** 开料大板 高 */
boardHeight: number,
/** 刀头大小(含修边) */
gap: number,
/** 小板数据集合 */
blocks: CutorderInputBlock[]
}
/**
* 处理器输出数据 开料顺序(新)
*/
export type CutorderOutput = {
blocks: CutorderoutputBlock[]
}
/**
* 小板类型 输入
*/
export type CutorderInputBlock = {
/** 小板唯一标识 */
id: string | number,
/** 排版长 */
length: number,
/** 排版宽 */
width: number,
/** 板件坐标X */
x: number,
/** 板件坐标y */
y: number,
}
/**
* 小板类型 输出
*/
export type CutorderoutputBlock = CutorderInputBlock & {
cutOrder: number
}

View File

@@ -0,0 +1,130 @@
/**
* @file 矩形板件布局优化处理器使用的数据模型,包含优化输入、输出、大板、小板以及各类枚举
* @todo 目前仅适配了矩形优化,后续还需要对数据结构进行扩展
* @since 0.1.8
* @author CZY
*/
import { ConfigBase } from "../config";
export interface RectLayoutProcInput {
/** 小板列表 */
blocks: RectLayoutBlock[];
/** 余料大板列表,可选,余料大板将会被优先优化,当余料大板被用尽时,则会使用配置中的大板尺寸进行优化 */
scrapBoards?: Array<{
/** 余料大板 */
board: RectLayoutBoard,
/** 大板张数 */
count: number;
}>;
}
export class RectLayoutProcConfig extends ConfigBase {
/** 大板高度 */
boardHeight: number = 1220;
/** 大板宽度 */
boardWidth: number = 2440;
/** 优化迭代次数 */
iterations: number = 50;
/** 双面加工优先排版 */
doubleSidedFirst: boolean = false;
/** 刀路间隙 */
gap: number = 0;
/** 运行标识 (其实改成方法更合适*/
_runFlag: 'running' | 'stopped' | 'terminated' = 'running';
/** 当出现优化结果时,进行回调 */
_onMessage?: (e: LayoutResult) => void;
}
export type RectLayoutProcOutput = never;
/** 矩形优化小板输入 */
export interface RectLayoutBlock {
/** 小板ID */
id: number;
/** 长 */
length: number;
/** 宽 */
width: number;
/** 纹路类型 */
waveType: WaveType;
/** 排版面类型 */
composingType: ComposingType;
/** 孔洞类型 */
holeType: HoleType;
/** 是否为矩形板 */
isRect?: boolean;
/** 是否需要双面加工 */
isdtwosided?: boolean;
}
/** 矩形优化大板输入 */
export interface RectLayoutBoard {
length: number;
width: number;
}
/** 纹路类型 */
export enum WaveType {
/** 正纹 */
Positive = 0,
/** 反纹 */
Reverse = 1,
/** 可翻转 */
CanReversal = 2,
}
/** 排版面 */
export enum ComposingType {
/** 正面 */
Positive = 0,
Reverse = 1, //反面
Arbitrary = 2 //任意
}
/** 孔类型 */
export enum HoleType {
/** 没有孔 */
None = 0,
/** 正面 */
Positive = 1,
/** 反面 */
Reverse = 2,
/** 正反皆有 */
Two = 3
}
/** 布局大板 */
export interface LayoutResultBoard {
id: string;
/** 大板高度 */
boardLength: number;
/** 大板宽度 */
boardWidth: number;
}
/** 布局小板 */
export interface LayoutResultBlock {
id: string;
/** x坐标 */
x: number;
/** y坐标 */
y: number;
/** 高度 */
length: number;
/** 宽度 */
width: number;
/** 纹路类型 */
waveType: WaveType;
}
/** 优化布局结果 */
export type LayoutResult = {
/** 大板列表 */
boards: LayoutResultBoard[],
/** 小板列表其一维与boards长度对应二维为小板列表 */
blocks: LayoutResultBlock[][],
/** 优化中被使用的余料大板,这个列表中的每一个元素代表使用了一片该规格的大板 */
usedScrapBoard: LayoutResultBoard[];
};

View File

@@ -1,7 +1,48 @@
export abstract class ProcessorBase {
public readonly name: string = '';
public readonly version: string = '1.0.0';
public abstract exec(...args: any[]): any
import { ProcessorBase } from "./base";
import { ConfigBase } from "./models/config";
import { FileInfo } from "./models/file";
// todo: 类型参数待补完
export class BlockInfo{
}
export class BlockProcessorConfig extends ConfigBase{
}
/**
* 用户板材数据过滤与转换
*/
export abstract class BlockProcessor extends ProcessorBase<BlockInfo[],BlockInfo[],BlockProcessorConfig>{
}
export class LayoutInput {
}
export class LayoutOutput{
}
export class LyaoutProcessorConfig extends ConfigBase{
}
export abstract class LayoutProcessor extends ProcessorBase<LayoutInput,LayoutOutput,LyaoutProcessorConfig>{
}
export class ExporterInput{
}
export class ExporterProcessorConfig extends ConfigBase{
}
export abstract class ExporterProcessor extends ProcessorBase<ExporterInput,FileInfo,ExporterProcessorConfig>{
}

View File

@@ -1,5 +1,9 @@
import { test } from '@jest/globals'
import { DemoParser } from '../samples/demoParser';
import { ProcessorModule, StepControllerProcessor } from '../src/device';
import { ProcessorManager } from '../samples/demoDataHandleServer';
import { demoHandleGroupCutting } from '../samples/demoDatahandle/demoDataHandle1';
import testJson from "./test.json"
test('demoParser', () => {
const text = `FSTART
TD 5
@@ -13,4 +17,23 @@ FEND
const demoParser = new DemoParser();
const result = demoParser.execTest(text);
console.log(result);
})
test('data', async () => {
const json = testJson
// 创建处理器集合
const processorManager = new ProcessorManager<any, any>();
// 这里省略了 选择处理器的环节 --这里选了demo开料机
const cuttingHandle = new demoHandleGroupCutting()
// 注册处理器
processorManager.registerProcessor(cuttingHandle.processorName, cuttingHandle.processor)
// 使用XX处理器 会返回激活【正在使用】的 处理器
const processor = processorManager.useProcessor(cuttingHandle.processorName)
const res = await processor.process(json)
console.log('处理器所有流程都结束了', res);
})

29439
tests/test.json Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,26 +1,29 @@
{
"include": ["src"],
"exclude": ["samples","tests"],
"include": ["src/**/*"],
"exclude": ["node_modules","samples","tests"],
"compilerOptions": {
/* Visit https://aka.ms/tsconfig to read more about this file */
/* Language and Environment */
"target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
// "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
"target": "ES6",
/* Modules */
"module": "commonjs", /* Specify what module code is generated. */
// "rootDir": "./", /* Specify the root folder within your source files. */
// "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */
"lib": ["DOM", "ES6", "ES2021"],
/* Emit */
"declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
"outDir": "./dist", /* Specify an output folder for all emitted files. */
"rootDir": "./src",
"esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */
// "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
"forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */
/* Type Checking */
"strict": true, /* Enable all strict type-checking options. */
"skipLibCheck": true /* Skip type checking all .d.ts files. */
"skipLibCheck": true, /* Skip type checking all .d.ts files. */
"sourceMap": true
}
}