feat: 提交
This commit is contained in:
		
							
								
								
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,4 @@
 | 
				
			|||||||
 | 
					*.tgz
 | 
				
			||||||
 | 
					node_modules/*
 | 
				
			||||||
 | 
					*.yaml
 | 
				
			||||||
 | 
					dist/*
 | 
				
			||||||
							
								
								
									
										111
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										111
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,111 @@
 | 
				
			|||||||
 | 
					# @mes-processors/libs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					这是一个用于处理MES(制造执行系统)相关工作流的处理器类库。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 安装
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					在内网环境下执行以下脚本进行安装
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```sh
 | 
				
			||||||
 | 
					pnpm add http://gitea.cf/MES-FE/mes-packages/releases/download/0.1/mes-processors-libs-0.1.0.tgz
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> [!CAUTION]
 | 
				
			||||||
 | 
					> 在安装库之前,请确认以下信息:  
 | 
				
			||||||
 | 
					>
 | 
				
			||||||
 | 
					> - 该库发布于内网gitea仓库的release中,所以你需要提前在gitea中进行登录,并确保你有该仓库的访问权限。  
 | 
				
			||||||
 | 
					> - 库的版本需要手动进行控制,注意上述链接中的版本信息,在安装前需要主动修改版本号,请前往<http://gitea.cf/MES-FE/mes-packages/releases>来确认最新版本。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 使用
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					该库提供了MES/iMES公用的处理器,并已配置为导出项,请参考以下Typescript代码进行使用:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```ts
 | 
				
			||||||
 | 
					// 引入矩形优化处理器
 | 
				
			||||||
 | 
					import { RectLayoutProcConfig } from 'cut-abstractions';
 | 
				
			||||||
 | 
					import { RectLayoutProc } from '@mes-processors/libs';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 实例化处理器
 | 
				
			||||||
 | 
					const proc = new RectLayoutProc();
 | 
				
			||||||
 | 
					// 构建上下文f proc.exec>[0] = {
 | 
				
			||||||
 | 
					    input: testObj,
 | 
				
			||||||
 | 
					    params: new RectLayoutProcConfig()
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					// 异步执行
 | 
				
			||||||
 | 
					const ctx: Parameters<typeo
 | 
				
			||||||
 | 
					await proc.exec(ctx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 从上下文对象中获取输出内容
 | 
				
			||||||
 | 
					console.log("RESULT: ", ctx.output);
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Q&A
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 运行某些处理器时出现404(Not Found)错误
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**错误描述**  
 | 
				
			||||||
 | 
					当执行处理器时,出现类似下面的错误:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```log
 | 
				
			||||||
 | 
					GET http://localhost:5173/node_modules/.vite/deps/assets/RectOptimizeMachine.worker-BO2fmpVH.js 404 (Not Found)
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**根本原因**  
 | 
				
			||||||
 | 
					该库中某些处理器使用了Web Worker来实现多线程异步处理(例如矩形优化处理器)。  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Web Worker为单独打包的资产文件,但某些打包工具可能会对`node_modules`中的依赖进行预构建来提高性能,如果Worker文件被视为了预构建的一部分,就可能导致处理器无法正确地处理Worker文件的相对引用路径,导致在运行时尝试从`node_modules/.vite/deps/assets/`这样的内部路径加载,而这个路径在实际部署或服务时是不存在的。  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**解决方法**  
 | 
				
			||||||
 | 
					在打包工具中对该库进行配置,禁用对该库的优化和预构建,以`vite`为例:
 | 
				
			||||||
 | 
					```ts
 | 
				
			||||||
 | 
					// vite.config.ts
 | 
				
			||||||
 | 
					...
 | 
				
			||||||
 | 
					optimizeDeps: {
 | 
				
			||||||
 | 
					    exclude: ["@mes-processors/libs"] // 从optimizeDeps中排除该库
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					...
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 开发
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 发布并打包项目
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```sh
 | 
				
			||||||
 | 
					pnpm build
 | 
				
			||||||
 | 
					pnpm pack
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> [!NOTE]
 | 
				
			||||||
 | 
					> 发布前记得更改版本号
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 约定
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**目录**
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					src
 | 
				
			||||||
 | 
					├── modules         项目模块分组
 | 
				
			||||||
 | 
					├── processors      处理器
 | 
				
			||||||
 | 
					└── utils           公用的工具类
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**导出和打包**
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- 编写的处理器请在`src/index.ts`中进行导出
 | 
				
			||||||
 | 
					- 编写的工具类请在`src/utils/index.ts`中进行导出
 | 
				
			||||||
 | 
					- 在打包时项目仅会对`src/index.ts`进行打包,工具类相关模块不会进行打包
 | 
				
			||||||
 | 
					- 关于打包相关明细请自行查看相关文件
 | 
				
			||||||
 | 
					  - [package.json](package.json) 
 | 
				
			||||||
 | 
					  - [vite.config.ts](vite.config.ts)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> [!WARNING]
 | 
				
			||||||
 | 
					> 在该工作区中编写模块时,禁止使用绝对路径进行导入,禁止在`tsconfig.json`或`vite.config.ts`中添加"@"别名,所有导入语句请使用相对路径进行引入,否则会因monorepo内部导入混乱导致模块解析失败。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 测试
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					项目使用[Vitest](http://vitest.dev/)作为单元测试框架,若要对TS文件编写单元测试,请在文件的同目录下创建`<文件名>.test.ts`文件,并遵循Vitest规范编写单元测试。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					要执行单元测试,请运行下面的命令:
 | 
				
			||||||
 | 
					```sh
 | 
				
			||||||
 | 
					pnpm test
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
							
								
								
									
										38
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,38 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "name": "@imes-holeToModel/libs",
 | 
				
			||||||
 | 
					  "version": "0.1.2",
 | 
				
			||||||
 | 
					  "description": "",
 | 
				
			||||||
 | 
					  "type": "module",
 | 
				
			||||||
 | 
					  "scripts": {
 | 
				
			||||||
 | 
					    "build": "vite build",
 | 
				
			||||||
 | 
					    "test": "vitest",
 | 
				
			||||||
 | 
					    "check": "tsc --noEmit --skipLibCheck -p tsconfig.app.json"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "files": [
 | 
				
			||||||
 | 
					    "dist",
 | 
				
			||||||
 | 
					    "package.json",
 | 
				
			||||||
 | 
					    "src",
 | 
				
			||||||
 | 
					    "tsconfig.json",
 | 
				
			||||||
 | 
					    "tsconfig.app.json",
 | 
				
			||||||
 | 
					    "tsconfig.node.json"
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "exports": {
 | 
				
			||||||
 | 
					    ".": "./src/index.ts",
 | 
				
			||||||
 | 
					    "./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"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "devDependencies": {
 | 
				
			||||||
 | 
					    "@types/node": "^24.0.10",
 | 
				
			||||||
 | 
					    "typescript": "~5.8.3",
 | 
				
			||||||
 | 
					    "vite": "^7.0.0",
 | 
				
			||||||
 | 
					    "vite-plugin-dts": "^4.5.4",
 | 
				
			||||||
 | 
					    "vite-plugin-node-polyfills": "^0.24.0",
 | 
				
			||||||
 | 
					    "vite-plugin-resolve": "^2.5.2",
 | 
				
			||||||
 | 
					    "vitest": "^3.2.4"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "keywords": [],
 | 
				
			||||||
 | 
					  "author": "",
 | 
				
			||||||
 | 
					  "license": "ISC"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										2
									
								
								src/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								src/index.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
				
			|||||||
 | 
					// holeToModel
 | 
				
			||||||
 | 
					export * from "./processors/holeToModel/holeToModel";
 | 
				
			||||||
							
								
								
									
										63
									
								
								src/processors/holeToModel/holeToModel.test.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								src/processors/holeToModel/holeToModel.test.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,63 @@
 | 
				
			|||||||
 | 
					import { test } from "vitest";
 | 
				
			||||||
 | 
					import { HoleToModelInput, HoleToModelProc, HoleToModelProcConfig, HoleToModelProcessingItem } from "./holeToModel";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const data = [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        "id": "1",
 | 
				
			||||||
 | 
					        "faceType": 0,
 | 
				
			||||||
 | 
					        "holeType": 10,
 | 
				
			||||||
 | 
					        "startX": 8,
 | 
				
			||||||
 | 
					        "startY": 549,
 | 
				
			||||||
 | 
					        "radius": 3,
 | 
				
			||||||
 | 
					        "depth": 13.5,
 | 
				
			||||||
 | 
					        "knifeRadius": 1
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        "id": "2",
 | 
				
			||||||
 | 
					        "faceType": 0,
 | 
				
			||||||
 | 
					        "holeType": 10,
 | 
				
			||||||
 | 
					        "startX": 8,
 | 
				
			||||||
 | 
					        "startY": 49,
 | 
				
			||||||
 | 
					        "radius": 3,
 | 
				
			||||||
 | 
					        "depth": 13.5,
 | 
				
			||||||
 | 
					        "knifeRadius": 2.5
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        "id": "2",
 | 
				
			||||||
 | 
					        "faceType": 0,
 | 
				
			||||||
 | 
					        "holeType": 10,
 | 
				
			||||||
 | 
					        "startX": 8,
 | 
				
			||||||
 | 
					        "startY": 209,
 | 
				
			||||||
 | 
					        "radius": 3,
 | 
				
			||||||
 | 
					        "depth": 18,
 | 
				
			||||||
 | 
					        "knifeRadius": 1
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					test('holeToModelTest', async () => {
 | 
				
			||||||
 | 
					    let holeData: HoleToModelProcessingItem[] = []
 | 
				
			||||||
 | 
					    data.forEach(e => {
 | 
				
			||||||
 | 
					        let temp: HoleToModelProcessingItem = {
 | 
				
			||||||
 | 
					            radius: e.radius,
 | 
				
			||||||
 | 
					            depth: e.depth,
 | 
				
			||||||
 | 
					            pts: [{ x: e.startX, y: e.startY }],
 | 
				
			||||||
 | 
					            buls: [0],
 | 
				
			||||||
 | 
					            knifeRadius: e.knifeRadius
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        holeData.push(temp)
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let conf: HoleToModelProcConfig = {}
 | 
				
			||||||
 | 
					    let input: HoleToModelInput = {
 | 
				
			||||||
 | 
					        thickness: 18,
 | 
				
			||||||
 | 
					        holeData
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let proc = new HoleToModelProc()
 | 
				
			||||||
 | 
					    let context = {
 | 
				
			||||||
 | 
					        input,
 | 
				
			||||||
 | 
					        params: conf
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    await proc.exec(context)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    console.log(context);
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
							
								
								
									
										218
									
								
								src/processors/holeToModel/holeToModel.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										218
									
								
								src/processors/holeToModel/holeToModel.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,218 @@
 | 
				
			|||||||
 | 
					import { ConfigBase, ProcessorBase, ProcessorContext } from "cut-abstractions";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 *  孔转造型
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export class HoleToModelProc extends ProcessorBase<HoleToModelInput, HoleToModelOutput, HoleToModelProcConfig> {
 | 
				
			||||||
 | 
					    get name(): string {
 | 
				
			||||||
 | 
					        return 'holeToModel';
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    get version(): string {
 | 
				
			||||||
 | 
					        return '1.0.0';
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    exec(context: ProcessorContext<HoleToModelInput, HoleToModelOutput, HoleToModelProcConfig>): Promise<any> | any | void {
 | 
				
			||||||
 | 
					        return new Promise(async (resolve, reject) => {
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
 | 
					                let res: HoleToModelOutput | string = ''
 | 
				
			||||||
 | 
					                if (!context.input) {
 | 
				
			||||||
 | 
					                    res = 'holeToModel: input is undefined!'
 | 
				
			||||||
 | 
					                    reject(res)
 | 
				
			||||||
 | 
					                    return res
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (Array.isArray(context.input.holeData)) {
 | 
				
			||||||
 | 
					                    let thickness = context.input.thickness
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    let modelData: HoleToModelProcessingItem[] = []
 | 
				
			||||||
 | 
					                    let noHandleItem: noHandleItemType[] = []
 | 
				
			||||||
 | 
					                    for (const hole of context.input.holeData) {
 | 
				
			||||||
 | 
					                        let data = this.toModel(thickness, hole)
 | 
				
			||||||
 | 
					                        if (data.code == 1) {
 | 
				
			||||||
 | 
					                            modelData.push(data.item)
 | 
				
			||||||
 | 
					                        } else {
 | 
				
			||||||
 | 
					                            noHandleItem.push({
 | 
				
			||||||
 | 
					                                info: data.info,
 | 
				
			||||||
 | 
					                                holeData: hole
 | 
				
			||||||
 | 
					                            })
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    let output: HoleToModelOutput = {
 | 
				
			||||||
 | 
					                        modelData,
 | 
				
			||||||
 | 
					                        noHandleItem
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    context.output = output
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    res = 'holeToModel: input.holeData is invalid!'
 | 
				
			||||||
 | 
					                    reject(res)
 | 
				
			||||||
 | 
					                    return res
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                resolve(res)
 | 
				
			||||||
 | 
					            } catch (error) {
 | 
				
			||||||
 | 
					                reject(error);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /** 
 | 
				
			||||||
 | 
					     * @param t 板件的厚度
 | 
				
			||||||
 | 
					     * @param hole 孔的 加工项
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private toModel(t: number, hole: HoleToModelProcessingItem) {
 | 
				
			||||||
 | 
					        let depth = hole.depth
 | 
				
			||||||
 | 
					        let radius = hole.radius
 | 
				
			||||||
 | 
					        let knifeRadius = hole.knifeRadius
 | 
				
			||||||
 | 
					        let resData: any = {
 | 
				
			||||||
 | 
					            code: -1,
 | 
				
			||||||
 | 
					            item: null,
 | 
				
			||||||
 | 
					            info: ''
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (radius == knifeRadius) {
 | 
				
			||||||
 | 
					            resData.code = -1
 | 
				
			||||||
 | 
					            resData.item = hole
 | 
				
			||||||
 | 
					            resData.info = 'HoleToModel =》toModel : transform fail,radius is same as knifeRadius,do not need handle.'
 | 
				
			||||||
 | 
					            return resData
 | 
				
			||||||
 | 
					        } else if (radius < knifeRadius) {
 | 
				
			||||||
 | 
					            resData.code = -1
 | 
				
			||||||
 | 
					            resData.item = hole
 | 
				
			||||||
 | 
					            resData.info = 'HoleToModel =》toModel : transform fail,knifeRadius is more then radius,can not handle.'
 | 
				
			||||||
 | 
					            return resData
 | 
				
			||||||
 | 
					        } else if (radius > knifeRadius) {
 | 
				
			||||||
 | 
					            let p = hole.pts[0]
 | 
				
			||||||
 | 
					            if (p == undefined) {
 | 
				
			||||||
 | 
					                resData.code = -1
 | 
				
			||||||
 | 
					                resData.item = hole
 | 
				
			||||||
 | 
					                resData.info = 'HoleToModel =》toModel : transform fail,hole.pts has no data,can not handle.'
 | 
				
			||||||
 | 
					                return resData
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                let model: HoleToModelProcessingItem = {
 | 
				
			||||||
 | 
					                    depth: depth,
 | 
				
			||||||
 | 
					                    radius: knifeRadius,
 | 
				
			||||||
 | 
					                    pts: [],
 | 
				
			||||||
 | 
					                    buls: [],
 | 
				
			||||||
 | 
					                    knifeRadius: knifeRadius,
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                /** 圆点 x */
 | 
				
			||||||
 | 
					                let cx = p.x
 | 
				
			||||||
 | 
					                /** 圆点 y */
 | 
				
			||||||
 | 
					                let cy = p.y
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                let r0 = hole.radius - hole.knifeRadius
 | 
				
			||||||
 | 
					                /** 最外层走一圈 */
 | 
				
			||||||
 | 
					                let bul = 0.41421356237309503
 | 
				
			||||||
 | 
					                model.pts.push({ x: cx - r0, y: cy })
 | 
				
			||||||
 | 
					                model.buls.push(-bul)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                model.pts.push({ x: cx, y: cy + r0 })
 | 
				
			||||||
 | 
					                model.buls.push(-bul)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                model.pts.push({ x: cx + r0, y: cy })
 | 
				
			||||||
 | 
					                model.buls.push(-bul)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                model.pts.push({ x: cx, y: cy - r0 })
 | 
				
			||||||
 | 
					                model.buls.push(-bul)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                model.pts.push({ x: cx - r0, y: cy })
 | 
				
			||||||
 | 
					                model.buls.push(0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (depth >= t - 0.001) {
 | 
				
			||||||
 | 
					                    // 挖穿 输出结果
 | 
				
			||||||
 | 
					                    resData.code = 1
 | 
				
			||||||
 | 
					                    resData.item = model
 | 
				
			||||||
 | 
					                    resData.info = 'success'
 | 
				
			||||||
 | 
					                    return resData
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    // 非挖穿 需要铣 
 | 
				
			||||||
 | 
					                    r0 = r0 - knifeRadius
 | 
				
			||||||
 | 
					                    while (r0 > 0) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        model.pts.push({ x: cx - r0, y: cy })
 | 
				
			||||||
 | 
					                        model.buls.push(bul)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        model.pts.push({ x: cx, y: cy - r0 })
 | 
				
			||||||
 | 
					                        model.buls.push(bul)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        model.pts.push({ x: cx + r0, y: cy })
 | 
				
			||||||
 | 
					                        model.buls.push(bul)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        model.pts.push({ x: cx, y: cy + r0 })
 | 
				
			||||||
 | 
					                        model.buls.push(bul)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        model.pts.push({ x: cx, y: cy + r0 })
 | 
				
			||||||
 | 
					                        model.buls.push(0)
 | 
				
			||||||
 | 
					                        r0 = r0 - knifeRadius
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    // 移动到圆心
 | 
				
			||||||
 | 
					                    model.pts.push({ x: cx, y: cy })
 | 
				
			||||||
 | 
					                    model.buls.push(0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    resData.code = 1
 | 
				
			||||||
 | 
					                    resData.item = model
 | 
				
			||||||
 | 
					                    resData.info = 'success'
 | 
				
			||||||
 | 
					                    return resData
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/** 处理器输入 -孔转造型*/
 | 
				
			||||||
 | 
					export type HoleToModelInput = {
 | 
				
			||||||
 | 
					    /** 孔信息 */
 | 
				
			||||||
 | 
					    holeData: HoleToModelProcessingItem[],
 | 
				
			||||||
 | 
					    /** 孔所在板件的优化后的坐标 X (可选)*/
 | 
				
			||||||
 | 
					    placeX?: number,
 | 
				
			||||||
 | 
					    /** 孔所在板件的优化后的坐标 Y (可选)*/
 | 
				
			||||||
 | 
					    placeY?: number,
 | 
				
			||||||
 | 
					    /** 孔所在板件的 厚度 */
 | 
				
			||||||
 | 
					    thickness: number
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/** 处理器输出-- 获取造型在大板的刀路 */
 | 
				
			||||||
 | 
					export type HoleToModelOutput = {
 | 
				
			||||||
 | 
					    /** 孔转造型 后的 造型数据 */
 | 
				
			||||||
 | 
					    modelData: HoleToModelProcessingItem[],
 | 
				
			||||||
 | 
					    /** 未处理的孔数据 以及信息 */
 | 
				
			||||||
 | 
					    noHandleItem: noHandleItemType[]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					export type noHandleItemType = {
 | 
				
			||||||
 | 
					    /** 未处理的孔信息 */
 | 
				
			||||||
 | 
					    holeData: HoleToModelProcessingItem,
 | 
				
			||||||
 | 
					    /** 未处理 说明 */
 | 
				
			||||||
 | 
					    info: string
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/** 处理器配置-- 获取造型在大板的刀路  */
 | 
				
			||||||
 | 
					export declare class HoleToModelProcConfig extends ConfigBase {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * 点阵数据 加工项
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export interface IProcessingItem {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 加工点数组
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    pts: IPoint[];
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 凸度数组
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    buls: number[];
 | 
				
			||||||
 | 
					    /** 半径 (孔)  */
 | 
				
			||||||
 | 
					    radius: number,
 | 
				
			||||||
 | 
					    /** 深度 */
 | 
				
			||||||
 | 
					    depth: number
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/** 加工项的类型  */
 | 
				
			||||||
 | 
					export type HoleToModelProcessingItem = IProcessingItem & {
 | 
				
			||||||
 | 
					    /** 使用刀具的刀半径 */
 | 
				
			||||||
 | 
					    knifeRadius: number
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export interface IPoint { x: number, y: number; }
 | 
				
			||||||
							
								
								
									
										1
									
								
								src/vite-env.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								src/vite-env.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					/// <reference types="vite/client" />
 | 
				
			||||||
							
								
								
									
										39
									
								
								tsconfig.app.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								tsconfig.app.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,39 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  // TODO: Warn: 在进行TS类型检查的时候会检查到workflow工作区中的文件,原因未知
 | 
				
			||||||
 | 
					  "compilerOptions": {
 | 
				
			||||||
 | 
					    "lib": [
 | 
				
			||||||
 | 
					      "ES2020",
 | 
				
			||||||
 | 
					      "ES2021",
 | 
				
			||||||
 | 
					      "ESNext",
 | 
				
			||||||
 | 
					      "DOM",
 | 
				
			||||||
 | 
					      "DOM.Iterable"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "noEmit": true,
 | 
				
			||||||
 | 
					    "target": "esnext",
 | 
				
			||||||
 | 
					    "module": "ESNext",
 | 
				
			||||||
 | 
					    "moduleResolution": "Bundler",
 | 
				
			||||||
 | 
					    "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
 | 
				
			||||||
 | 
					    "baseUrl": ".",
 | 
				
			||||||
 | 
					    "paths": {
 | 
				
			||||||
 | 
					      // 为了保证导入不与被引入项目冲突,不应该配置'@/*'别名
 | 
				
			||||||
 | 
					      "@libs/*": [
 | 
				
			||||||
 | 
					        "./src/*"
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    /* Linting */
 | 
				
			||||||
 | 
					    "strict": true,
 | 
				
			||||||
 | 
					    "erasableSyntaxOnly": false,
 | 
				
			||||||
 | 
					    "noFallthroughCasesInSwitch": true,
 | 
				
			||||||
 | 
					    "noUncheckedSideEffectImports": true,
 | 
				
			||||||
 | 
					    "composite": true
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "include": [
 | 
				
			||||||
 | 
					    "src/**/*.ts",
 | 
				
			||||||
 | 
					    "src/**/*.tsx",
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "exclude": [
 | 
				
			||||||
 | 
					    "src/**/__tests__/*",
 | 
				
			||||||
 | 
					    "dist",
 | 
				
			||||||
 | 
					    "node_modules/**"
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										7
									
								
								tsconfig.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								tsconfig.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "files": [],
 | 
				
			||||||
 | 
					  "references": [
 | 
				
			||||||
 | 
					    { "path": "./tsconfig.app.json" },
 | 
				
			||||||
 | 
					    { "path": "./tsconfig.node.json" }
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										25
									
								
								tsconfig.node.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								tsconfig.node.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,25 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "compilerOptions": {
 | 
				
			||||||
 | 
					    "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
 | 
				
			||||||
 | 
					    "target": "ES2023",
 | 
				
			||||||
 | 
					    "lib": ["ES2023"],
 | 
				
			||||||
 | 
					    "module": "ESNext",
 | 
				
			||||||
 | 
					    "skipLibCheck": true,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Bundler mode */
 | 
				
			||||||
 | 
					    "moduleResolution": "bundler",
 | 
				
			||||||
 | 
					    "allowImportingTsExtensions": true,
 | 
				
			||||||
 | 
					    "verbatimModuleSyntax": true,
 | 
				
			||||||
 | 
					    "moduleDetection": "force",
 | 
				
			||||||
 | 
					    "noEmit": true,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Linting */
 | 
				
			||||||
 | 
					    "strict": true,
 | 
				
			||||||
 | 
					    "noUnusedLocals": true,
 | 
				
			||||||
 | 
					    "noUnusedParameters": true,
 | 
				
			||||||
 | 
					    "erasableSyntaxOnly": true,
 | 
				
			||||||
 | 
					    "noFallthroughCasesInSwitch": true,
 | 
				
			||||||
 | 
					    "noUncheckedSideEffectImports": true,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "include": ["vite.config.ts"]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										34
									
								
								vite.config.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								vite.config.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
				
			|||||||
 | 
					/// <reference types="vitest/config" />
 | 
				
			||||||
 | 
					import { defineConfig } from 'vite'
 | 
				
			||||||
 | 
					import { nodePolyfills } from 'vite-plugin-node-polyfills';
 | 
				
			||||||
 | 
					import { resolve } from 'node:path';
 | 
				
			||||||
 | 
					import dts from 'vite-plugin-dts';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let basePath = process.env.basePath ?? '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// https://vite.dev/config/
 | 
				
			||||||
 | 
					export default defineConfig({
 | 
				
			||||||
 | 
					  base: basePath,
 | 
				
			||||||
 | 
					  plugins: [
 | 
				
			||||||
 | 
					    nodePolyfills(),
 | 
				
			||||||
 | 
					    dts({rollupTypes: true, tsconfigPath: './tsconfig.app.json',insertTypesEntry: true}),
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  build: {
 | 
				
			||||||
 | 
					    modulePreload: {
 | 
				
			||||||
 | 
					      resolveDependencies() {
 | 
				
			||||||
 | 
					        return [];
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    lib: {
 | 
				
			||||||
 | 
					      entry: resolve(__dirname, 'src/index.ts'),
 | 
				
			||||||
 | 
					      name: 'MesCutorder',
 | 
				
			||||||
 | 
					      fileName(format) {
 | 
				
			||||||
 | 
					          return `mes-cutorder.${format}.js`
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      formats: ['es', 'umd', 'iife']
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  esbuild: {
 | 
				
			||||||
 | 
					    drop: process.env.NODE_ENV === 'production' ? ['console', 'debugger'] : [],
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
		Reference in New Issue
	
	Block a user