新增NCBuilder接口 #11

Merged
xief merged 2 commits from feature/nc_builder into main 2025-08-13 17:57:59 +08:00
4 changed files with 135 additions and 9 deletions

View File

@@ -1,6 +1,6 @@
{
"name": "cut-abstractions",
"version": "0.2.2",
"version": "0.3.0",
"description": "",
"files": [
"dist/**/*"

View File

@@ -4,7 +4,7 @@ import { ConfigBase } from "./models/config";
/**
* 加工处理器上下文
*/
export interface ProcessorContext<TInput, TOutput, TConfig extends ConfigBase> {
export interface ProcessorContext<TInput = any, TOutput = any, TConfig extends ConfigBase = ConfigBase> {
/**
* 输入数据
*/

View File

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

126
src/nc/ncWriter.ts Normal file
View File

@@ -0,0 +1,126 @@
import { Knife } from "../models/knife";
/** 基础G代码 */
export const GCode = {
/**
* 快速定位
* @param X X 坐标
* @param Y Y 坐标
* @param Z Z 坐标
* @param F 给进速度 mm/min
* @example G0 X0 Y0 F25000
*/
G0: 'G0',
/**
* 直线插补
* @param X X 坐标
* @param Y Y 坐标
* @param Z Z 坐标
* @param F 给进速度 mm/min
* @example G1 X0 Y0 F25000
*/
G1: 'G1',
/**
* 顺时针圆弧插补
* @param X X 坐标
* @param Y Y 坐标
* @param Z Z 坐标
* @param I 圆心坐标模式从圆弧起点到圆心在X轴上的**增量距离**
* @param J 圆心坐标模式从圆弧起点到圆心在Y轴上的**增量距离**
* @param K 圆心坐标模式从圆弧起点到圆心在Z轴上的**增量距离**
* @param R (圆弧半径模式)指定圆弧的半径
* @example
* ; 假设当前刀具在 (X10, Y0)
* G2 X0 Y10 I-10 J0 F150 ; 顺时针圆弧到X0 Y10圆心在(0,0) (10 + (-10) = 0, 0 + 0 = 0)
* G2 X0 Y10 R10 F150 ; 顺时针圆弧到X0 Y10半径10 (小于等于180度)
*/
G2: 'G2',
/**
* 逆时针圆弧插补
* @param X X 坐标
* @param Y Y 坐标
* @param Z Z 坐标
* @param I 圆心坐标模式从圆弧起点到圆心在X轴上的**增量距离**
* @param J 圆心坐标模式从圆弧起点到圆心在Y轴上的**增量距离**
* @param K 圆心坐标模式从圆弧起点到圆心在Z轴上的**增量距离**
* @param R (圆弧半径模式)指定圆弧的半径
* @example
* ; 假设当前刀具在 (X10, Y0)
* G3 X0 Y-10 I-10 J0 F150 ; 逆时针圆弧到X0 Y-10圆心在(0,0)
* G3 X0 Y-10 R-10 F150 ; 逆时针圆弧到X0 Y-10半径10 (大于180度)
*/
G3: 'G3',
} as const;
/** */
export class GCodeParams {
/** X坐标值 mm */
x: number = 0;
/** Y坐标值 mm */
y: number = 0;
/** Z坐标值 mm */
z: number = 0;
/** 使用圆弧指令(G2,G3)的圆弧半径模式(R)时,定义圆弧半径 */
r: number = 0;
/** 使用圆弧指令(G2,G3)的圆心坐标模式(I,J,K)时定义圆心坐标在X轴上的增量距离 */
i: number = 0;
/** 使用圆弧指令(G2,G3)的圆心坐标模式(I,J,K)时定义圆心坐标在Y轴上的增量距离 */
j: number = 0;
/** 给进速度(Feed Rate) mm/min */
f: number = 0;
};
/** 单次NC加工行为 */
export interface NcAction {
readonly id: string;
readonly type: NcActionType;
readonly lineIndex: number;
}
export type NcActionType = string;
/**
* NC代码构建器接口实现该接口来定义一个处理器用的NC代码构建器
* @author CZY
* @since 0.3.0
* @version 0.1.0
*/
export interface INcWriter {
get ncActions(): NcAction[];
/** 添加G代码 */
gCode(code: keyof typeof GCode, params: Partial<Pick<GCodeParams, 'x' | 'y' | 'z' | 'f'> & { bul: number; }>): void;
/** 基于刀具实体执行换刀操作 */
changeKnife(knife: Knife): void;
/** 添加一行注释 */
comment(content: string): void;
/**
* 记录一次NC加工操作
*
* NC加工操作指的是一次完整的加工过程例如一次排钻一次造型切割或是一次小板加工
*
* 一次NC加工操作可能包含多行的GCode
*
* 该方法旨在为NC文件提供记录加工步骤的能力
*
* 返回本次NC操作的ID此ID由内部生成
* @param type NC操作类型
* @returns 本次NC操作的ID
*/
recordAction(type: NcActionType): string;
/** 直接在末尾追加任意字符串 */
append(str: string): void;
/** 直接在末尾追加一行任意字符串 */
appendLine(str: string): void;
/** 返回当前构建的NC代码 */
toString(): string;
}