Compare commits
3 Commits
dev_li
...
e7a26ae602
Author | SHA1 | Date | |
---|---|---|---|
e7a26ae602 | |||
![]() |
160bb294ca | ||
03229b5f48 |
92
README.md
92
README.md
@@ -1,7 +1,81 @@
|
|||||||
## 生产接口协议
|
# Cut Abstractions
|
||||||
本项目使用typescript编写,IDE推荐使用vscode。
|
|
||||||
|
这是一个用于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 | 备注 |
|
| 中文 | CAD | MES | IMES | 备注 |
|
||||||
| --- | --- | --- | --- | --- |
|
| --- | --- | --- | --- | --- |
|
||||||
| 房名 | RoomName | roomName | roomName | |
|
| 房名 | RoomName | roomName | roomName | |
|
||||||
@@ -11,15 +85,3 @@
|
|||||||
| 大板名 | 无 | boardName | goodsName | |
|
| 大板名 | 无 | boardName | goodsName | |
|
||||||
| 余料 | 无 | scrap | remain | |
|
| 余料 | 无 | scrap | remain | |
|
||||||
| 排单 | 无 | planOrder |planOrder | |
|
| 排单 | 无 | planOrder |planOrder | |
|
||||||
|
|
||||||
|
|
||||||
### 编译与发布
|
|
||||||
更新 package.json 版本号
|
|
||||||
```shell
|
|
||||||
pnpm clean
|
|
||||||
pnpm build
|
|
||||||
pnpm release
|
|
||||||
```
|
|
||||||
|
|
||||||
### 开发建议
|
|
||||||
MES与IMES存在不少命名上的差异,可以考虑 接口类型独立, 参数与配置单独创建类型
|
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "cut-abstractions",
|
"name": "cut-abstractions",
|
||||||
"version": "0.1.5",
|
"version": "0.1.8",
|
||||||
"description": "",
|
"description": "",
|
||||||
"files": [
|
"files": [
|
||||||
"dist/**/*"
|
"dist/**/*"
|
||||||
|
3404
pnpm-lock.yaml
generated
3404
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
27
src/base.ts
27
src/base.ts
@@ -4,26 +4,39 @@ import { ConfigBase } from "./models/config";
|
|||||||
/**
|
/**
|
||||||
* 加工处理器上下文
|
* 加工处理器上下文
|
||||||
*/
|
*/
|
||||||
export abstract class ProcessorContext<TInput,TOutput,TConfig extends ConfigBase>{
|
export interface ProcessorContext<TInput, TOutput, TConfig extends ConfigBase> {
|
||||||
/**
|
/**
|
||||||
* 输入数据
|
* 输入数据
|
||||||
*/
|
*/
|
||||||
public input?:TInput;
|
input?: TInput;
|
||||||
/**
|
/**
|
||||||
* 合并配置文件与临时输入参
|
* 合并配置文件与临时输入参
|
||||||
*/
|
*/
|
||||||
public params?:TConfig;
|
params?: TConfig;
|
||||||
/**
|
/**
|
||||||
* 输出数据
|
* 输出数据
|
||||||
*/
|
*/
|
||||||
public output?:TOutput;
|
output?: TOutput;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 处理器基类
|
* 处理器基类
|
||||||
*/
|
*/
|
||||||
export abstract class ProcessorBase<TInput,TOutput,TConfig extends ConfigBase> {
|
export abstract class ProcessorBase<TInput, TOutput, TConfig extends ConfigBase> {
|
||||||
public abstract get name():string;
|
/**
|
||||||
|
* 处理器名,推荐使用 kebab-case 命名规则
|
||||||
|
* @example handle-ability
|
||||||
|
*/
|
||||||
|
public abstract get name(): string;
|
||||||
|
/**
|
||||||
|
* 处理器版本,对处理器进行更新后记得修改版本号
|
||||||
|
* 格式使用 semver
|
||||||
|
* @default 1.0.0
|
||||||
|
*/
|
||||||
public abstract get version(): string;
|
public abstract get version(): string;
|
||||||
public abstract exec(context:ProcessorContext<TInput,TOutput,TConfig>):Promise<void>|void
|
/**
|
||||||
|
* 处理器执行方法
|
||||||
|
* @param context 处理器上下文
|
||||||
|
*/
|
||||||
|
public abstract exec(context: ProcessorContext<TInput, TOutput, TConfig>): Promise<void> | void;
|
||||||
}
|
}
|
@@ -1,4 +1,5 @@
|
|||||||
export * from './base';
|
export * from './base';
|
||||||
export * from './parsers';
|
export * from './parsers';
|
||||||
export * from './models/config';
|
export * from './models/config';
|
||||||
|
export * from './models/knife';
|
||||||
export * from './models/file';
|
export * from './models/file';
|
79
src/models/knife.ts
Normal file
79
src/models/knife.ts
Normal 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;
|
||||||
|
}
|
125
src/models/processors/rectLayout.ts
Normal file
125
src/models/processors/rectLayout.ts
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
/**
|
||||||
|
* @file 矩形板件布局优化处理器使用的数据模型,包含优化输入、输出、大板、小板以及各类枚举
|
||||||
|
* @todo 目前仅适配了矩形优化,后续还需要对数据结构进行扩展
|
||||||
|
* @since 0.1.8
|
||||||
|
* @author CZY
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { ConfigBase } from "../config";
|
||||||
|
|
||||||
|
export interface RectLayoutProcInput {
|
||||||
|
/** 小板列表 */
|
||||||
|
blocks: LayoutBlock[];
|
||||||
|
/** 余料大板列表,可选,余料大板将会被优先优化,当余料大板被用尽时,则会使用配置中的大板尺寸进行优化 */
|
||||||
|
scrapBoards?: Array<{
|
||||||
|
/** 余料大板 */
|
||||||
|
board: LayoutBoard,
|
||||||
|
/** 大板张数 */
|
||||||
|
count: number;
|
||||||
|
}>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class RectLayoutProcConfig extends ConfigBase {
|
||||||
|
/** 大板高度 */
|
||||||
|
boardHeight: number = 1220;
|
||||||
|
/** 大板宽度 */
|
||||||
|
boardWidth: number = 2440;
|
||||||
|
/** 优化迭代次数 */
|
||||||
|
iterations: number = 50;
|
||||||
|
/** 双面加工优先排版 */
|
||||||
|
doubleSidedFirst: boolean = false;
|
||||||
|
/** 刀路间隙 */
|
||||||
|
gap: number = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
export type RectLayoutProcOutput = LayoutResult;
|
||||||
|
|
||||||
|
/** 优化小板输入 */
|
||||||
|
export interface LayoutBlock {
|
||||||
|
/** 小板ID */
|
||||||
|
id: number;
|
||||||
|
/** 长 */
|
||||||
|
length: number;
|
||||||
|
/** 宽 */
|
||||||
|
width: number;
|
||||||
|
/** 纹路类型 */
|
||||||
|
waveType: WaveType;
|
||||||
|
/** 排版面类型 */
|
||||||
|
composingType: ComposingType;
|
||||||
|
/** 孔洞类型 */
|
||||||
|
holeType: HoleType;
|
||||||
|
/** 是否为矩形板 */
|
||||||
|
isRect?: boolean;
|
||||||
|
/** 是否需要双面加工 */
|
||||||
|
isdtwosided?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 优化大板输入 */
|
||||||
|
export interface LayoutBoard {
|
||||||
|
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;
|
||||||
|
/** 大板宽度 */
|
||||||
|
boardWidth: number;
|
||||||
|
/** 大板高度 */
|
||||||
|
boardHeight: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 布局小板 */
|
||||||
|
export interface LayoutResultBlock {
|
||||||
|
id: string;
|
||||||
|
/** x坐标 */
|
||||||
|
x: number;
|
||||||
|
/** y坐标 */
|
||||||
|
y: number;
|
||||||
|
/** 宽度 */
|
||||||
|
width: number;
|
||||||
|
/** 高度 */
|
||||||
|
height: number;
|
||||||
|
/** 纹路类型 */
|
||||||
|
waveType: WaveType;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 优化布局结果 */
|
||||||
|
export type LayoutResult = {
|
||||||
|
/** 大板列表 */
|
||||||
|
boards: LayoutResultBoard[],
|
||||||
|
/** 小板列表,其一维与boards长度对应,二维为小板列表 */
|
||||||
|
blocks: LayoutResultBlock[][],
|
||||||
|
/** 优化中被使用的余料大板,这个列表中的每一个元素代表使用了一片该规格的大板 */
|
||||||
|
usedScrapBoard: LayoutResultBoard[];
|
||||||
|
};
|
@@ -11,6 +11,7 @@
|
|||||||
"module": "commonjs", /* Specify what module code is generated. */
|
"module": "commonjs", /* Specify what module code is generated. */
|
||||||
// "rootDir": "./", /* Specify the root folder within your source files. */
|
// "rootDir": "./", /* Specify the root folder within your source files. */
|
||||||
// "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */
|
// "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */
|
||||||
|
"lib": ["DOM", "ES6", "ES2021"],
|
||||||
|
|
||||||
/* Emit */
|
/* Emit */
|
||||||
"declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
|
"declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
|
||||||
|
Reference in New Issue
Block a user