From f4bb32d32a7e0cc62f821cd6f57f396b89caa9d1 Mon Sep 17 00:00:00 2001 From: lixiang <504331699@qq.com> Date: Wed, 3 Sep 2025 17:24:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=EF=BC=9A1=E3=80=81=E5=AF=BCX?= =?UTF-8?q?ML=E6=A0=BC=E5=BC=8F=E7=9A=84CNC=202=E3=80=81NCwriter=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E5=A1=AB=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 + README.md | 111 + package.json | 39 + pnpm-lock.yaml | 2471 +++++++++ src/cncTest.test.ts | 68 + src/index.ts | 5 + src/modules/README.md | 2 + src/modules/rect-layout/KLSCclass.ts | 1523 ++++++ .../rect-layout/RectOptimizeMachine.ts | 1993 ++++++++ .../rect-layout/RectOptimizeMachine.worker.ts | 17 + src/modules/rect-layout/bang.ts | 42 + src/modules/rect-layout/utils.ts | 29 + src/processors/CncConverter/CncConverter.ts | 149 + .../NcConverter/NcConverter.test.ts | 5 + src/processors/NcConverter/NcConverter.ts | 794 +++ .../processCodeConverter.test.ts | 4528 +++++++++++++++++ .../processCodeConverter.ts | 114 + src/utils/corsWorker.ts | 25 + src/utils/helper.array.ts | 116 + src/utils/helper.async.ts | 21 + src/utils/helper.lang.ts | 128 + src/utils/helper.string.ts | 33 + src/utils/helper.version.ts | 35 + src/utils/index.ts | 14 + src/utils/utilTypes.ts | 27 + src/vite-env.d.ts | 1 + tsconfig.app.json | 39 + tsconfig.json | 7 + tsconfig.node.json | 25 + vite.config.ts | 34 + 30 files changed, 12398 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 src/cncTest.test.ts create mode 100644 src/index.ts create mode 100644 src/modules/README.md create mode 100644 src/modules/rect-layout/KLSCclass.ts create mode 100644 src/modules/rect-layout/RectOptimizeMachine.ts create mode 100644 src/modules/rect-layout/RectOptimizeMachine.worker.ts create mode 100644 src/modules/rect-layout/bang.ts create mode 100644 src/modules/rect-layout/utils.ts create mode 100644 src/processors/CncConverter/CncConverter.ts create mode 100644 src/processors/NcConverter/NcConverter.test.ts create mode 100644 src/processors/NcConverter/NcConverter.ts create mode 100644 src/processors/processCodeConverter/processCodeConverter.test.ts create mode 100644 src/processors/processCodeConverter/processCodeConverter.ts create mode 100644 src/utils/corsWorker.ts create mode 100644 src/utils/helper.array.ts create mode 100644 src/utils/helper.async.ts create mode 100644 src/utils/helper.lang.ts create mode 100644 src/utils/helper.string.ts create mode 100644 src/utils/helper.version.ts create mode 100644 src/utils/index.ts create mode 100644 src/utils/utilTypes.ts create mode 100644 src/vite-env.d.ts create mode 100644 tsconfig.app.json create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..225cbe9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +mes-processors-libs-*.tgz +node_modules +dist/* \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..81638bc --- /dev/null +++ b/README.md @@ -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中进行登录,并确保你有该仓库的访问权限。 +> - 库的版本需要手动进行控制,注意上述链接中的版本信息,在安装前需要主动修改版本号,请前往来确认最新版本。 + +## 使用 + +该库提供了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 [!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 +``` diff --git a/package.json b/package.json new file mode 100644 index 0000000..92f95ef --- /dev/null +++ b/package.json @@ -0,0 +1,39 @@ +{ + "name": "@mes-process-code-converter/libs", + "version": "0.1.4", + "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.3/cut-abstractions-0.3.3.tgz", + "mes-processors":"http://gitea.cf/MES-FE/mes-packages/releases/download/0.2/mes-processors-libs-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" +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..8d1b9be --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,2471 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + cut-abstractions: + specifier: http://gitea.cf/MES-FE/cut-abstractions/releases/download/0.3/cut-abstractions-0.3.3.tgz + version: '@gitea.cf/MES-FE/cut-abstractions/releases/download/0.3/cut-abstractions-0.3.3.tgz' + mes-processors: + specifier: http://gitea.cf/MES-FE/mes-packages/releases/download/0.2/mes-processors-libs-0.2.1.tgz + version: '@gitea.cf/MES-FE/mes-packages/releases/download/0.2/mes-processors-libs-0.2.1.tgz' + +devDependencies: + '@types/node': + specifier: ^24.0.10 + version: 24.2.1 + typescript: + specifier: ~5.8.3 + version: 5.8.3 + vite: + specifier: ^7.0.0 + version: 7.1.2(@types/node@24.2.1) + vite-plugin-dts: + specifier: ^4.5.4 + version: 4.5.4(@types/node@24.2.1)(typescript@5.8.3)(vite@7.1.2) + vite-plugin-node-polyfills: + specifier: ^0.24.0 + version: 0.24.0(vite@7.1.2) + vite-plugin-resolve: + specifier: ^2.5.2 + version: 2.5.2 + vitest: + specifier: ^3.2.4 + version: 3.2.4(@types/node@24.2.1) + +packages: + + /@babel/helper-string-parser@7.27.1: + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier@7.27.1: + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/parser@7.28.3: + resolution: {integrity: sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.28.2 + dev: true + + /@babel/types@7.28.2: + resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + dev: true + + /@esbuild/aix-ppc64@0.25.9: + resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.25.9: + resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.25.9: + resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.25.9: + resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.25.9: + resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.25.9: + resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.25.9: + resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.25.9: + resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.25.9: + resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.25.9: + resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.25.9: + resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.25.9: + resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.25.9: + resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.25.9: + resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.25.9: + resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.25.9: + resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.25.9: + resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-arm64@0.25.9: + resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.25.9: + resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-arm64@0.25.9: + resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.25.9: + resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openharmony-arm64@0.25.9: + resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.25.9: + resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.25.9: + resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.25.9: + resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.25.9: + resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@isaacs/balanced-match@4.0.1: + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + dev: true + + /@isaacs/brace-expansion@5.0.0: + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + dependencies: + '@isaacs/balanced-match': 4.0.1 + dev: true + + /@jridgewell/sourcemap-codec@1.5.5: + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + dev: true + + /@microsoft/api-extractor-model@7.30.7(@types/node@24.2.1): + resolution: {integrity: sha512-TBbmSI2/BHpfR9YhQA7nH0nqVmGgJ0xH0Ex4D99/qBDAUpnhA2oikGmdXanbw9AWWY/ExBYIpkmY8dBHdla3YQ==} + dependencies: + '@microsoft/tsdoc': 0.15.1 + '@microsoft/tsdoc-config': 0.17.1 + '@rushstack/node-core-library': 5.14.0(@types/node@24.2.1) + transitivePeerDependencies: + - '@types/node' + dev: true + + /@microsoft/api-extractor@7.52.10(@types/node@24.2.1): + resolution: {integrity: sha512-LhKytJM5ZJkbHQVfW/3o747rZUNs/MGg6j/wt/9qwwqEOfvUDTYXXxIBuMgrRXhJ528p41iyz4zjBVHZU74Odg==} + hasBin: true + dependencies: + '@microsoft/api-extractor-model': 7.30.7(@types/node@24.2.1) + '@microsoft/tsdoc': 0.15.1 + '@microsoft/tsdoc-config': 0.17.1 + '@rushstack/node-core-library': 5.14.0(@types/node@24.2.1) + '@rushstack/rig-package': 0.5.3 + '@rushstack/terminal': 0.15.4(@types/node@24.2.1) + '@rushstack/ts-command-line': 5.0.2(@types/node@24.2.1) + lodash: 4.17.21 + minimatch: 10.0.3 + resolve: 1.22.10 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.8.2 + transitivePeerDependencies: + - '@types/node' + dev: true + + /@microsoft/tsdoc-config@0.17.1: + resolution: {integrity: sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==} + dependencies: + '@microsoft/tsdoc': 0.15.1 + ajv: 8.12.0 + jju: 1.4.0 + resolve: 1.22.10 + dev: true + + /@microsoft/tsdoc@0.15.1: + resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} + dev: true + + /@rollup/plugin-inject@5.0.5: + resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.2.0 + estree-walker: 2.0.2 + magic-string: 0.30.17 + dev: true + + /@rollup/pluginutils@5.2.0: + resolution: {integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + dev: true + + /@rollup/rollup-android-arm-eabi@4.46.2: + resolution: {integrity: sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-android-arm64@4.46.2: + resolution: {integrity: sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-arm64@4.46.2: + resolution: {integrity: sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-x64@4.46.2: + resolution: {integrity: sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-freebsd-arm64@4.46.2: + resolution: {integrity: sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg==} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-freebsd-x64@4.46.2: + resolution: {integrity: sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw==} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.46.2: + resolution: {integrity: sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==} + cpu: [arm] + os: [linux] + libc: [glibc] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-musleabihf@4.46.2: + resolution: {integrity: sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==} + cpu: [arm] + os: [linux] + libc: [musl] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.46.2: + resolution: {integrity: sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==} + cpu: [arm64] + os: [linux] + libc: [glibc] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-musl@4.46.2: + resolution: {integrity: sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==} + cpu: [arm64] + os: [linux] + libc: [musl] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-loongarch64-gnu@4.46.2: + resolution: {integrity: sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==} + cpu: [loong64] + os: [linux] + libc: [glibc] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-ppc64-gnu@4.46.2: + resolution: {integrity: sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.46.2: + resolution: {integrity: sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-riscv64-musl@4.46.2: + resolution: {integrity: sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==} + cpu: [riscv64] + os: [linux] + libc: [musl] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-s390x-gnu@4.46.2: + resolution: {integrity: sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==} + cpu: [s390x] + os: [linux] + libc: [glibc] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.46.2: + resolution: {integrity: sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==} + cpu: [x64] + os: [linux] + libc: [glibc] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-musl@4.46.2: + resolution: {integrity: sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==} + cpu: [x64] + os: [linux] + libc: [musl] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.46.2: + resolution: {integrity: sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.46.2: + resolution: {integrity: sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-x64-msvc@4.46.2: + resolution: {integrity: sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rushstack/node-core-library@5.14.0(@types/node@24.2.1): + resolution: {integrity: sha512-eRong84/rwQUlATGFW3TMTYVyqL1vfW9Lf10PH+mVGfIb9HzU3h5AASNIw+axnBLjnD0n3rT5uQBwu9fvzATrg==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + dependencies: + '@types/node': 24.2.1 + ajv: 8.13.0 + ajv-draft-04: 1.0.0(ajv@8.13.0) + ajv-formats: 3.0.1(ajv@8.13.0) + fs-extra: 11.3.1 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.10 + semver: 7.5.4 + dev: true + + /@rushstack/rig-package@0.5.3: + resolution: {integrity: sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==} + dependencies: + resolve: 1.22.10 + strip-json-comments: 3.1.1 + dev: true + + /@rushstack/terminal@0.15.4(@types/node@24.2.1): + resolution: {integrity: sha512-OQSThV0itlwVNHV6thoXiAYZlQh4Fgvie2CzxFABsbO2MWQsI4zOh3LRNigYSTrmS+ba2j0B3EObakPzf/x6Zg==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + dependencies: + '@rushstack/node-core-library': 5.14.0(@types/node@24.2.1) + '@types/node': 24.2.1 + supports-color: 8.1.1 + dev: true + + /@rushstack/ts-command-line@5.0.2(@types/node@24.2.1): + resolution: {integrity: sha512-+AkJDbu1GFMPIU8Sb7TLVXDv/Q7Mkvx+wAjEl8XiXVVq+p1FmWW6M3LYpJMmoHNckSofeMecgWg5lfMwNAAsEQ==} + dependencies: + '@rushstack/terminal': 0.15.4(@types/node@24.2.1) + '@types/argparse': 1.0.38 + argparse: 1.0.10 + string-argv: 0.3.2 + transitivePeerDependencies: + - '@types/node' + dev: true + + /@types/argparse@1.0.38: + resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} + dev: true + + /@types/chai@5.2.2: + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + dependencies: + '@types/deep-eql': 4.0.2 + dev: true + + /@types/deep-eql@4.0.2: + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + dev: true + + /@types/estree@1.0.8: + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + dev: true + + /@types/node@24.2.1: + resolution: {integrity: sha512-DRh5K+ka5eJic8CjH7td8QpYEV6Zo10gfRkjHCO3weqZHWDtAaSTFtl4+VMqOJ4N5jcuhZ9/l+yy8rVgw7BQeQ==} + dependencies: + undici-types: 7.10.0 + dev: true + + /@vitest/expect@3.2.4: + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + dependencies: + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.2.1 + tinyrainbow: 2.0.0 + dev: true + + /@vitest/mocker@3.2.4(vite@7.1.2): + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + dependencies: + '@vitest/spy': 3.2.4 + estree-walker: 3.0.3 + magic-string: 0.30.17 + vite: 7.1.2(@types/node@24.2.1) + dev: true + + /@vitest/pretty-format@3.2.4: + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + dependencies: + tinyrainbow: 2.0.0 + dev: true + + /@vitest/runner@3.2.4: + resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + dependencies: + '@vitest/utils': 3.2.4 + pathe: 2.0.3 + strip-literal: 3.0.0 + dev: true + + /@vitest/snapshot@3.2.4: + resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + dependencies: + '@vitest/pretty-format': 3.2.4 + magic-string: 0.30.17 + pathe: 2.0.3 + dev: true + + /@vitest/spy@3.2.4: + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + dependencies: + tinyspy: 4.0.3 + dev: true + + /@vitest/utils@3.2.4: + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + dependencies: + '@vitest/pretty-format': 3.2.4 + loupe: 3.2.0 + tinyrainbow: 2.0.0 + dev: true + + /@volar/language-core@2.4.23: + resolution: {integrity: sha512-hEEd5ET/oSmBC6pi1j6NaNYRWoAiDhINbT8rmwtINugR39loROSlufGdYMF9TaKGfz+ViGs1Idi3mAhnuPcoGQ==} + dependencies: + '@volar/source-map': 2.4.23 + dev: true + + /@volar/source-map@2.4.23: + resolution: {integrity: sha512-Z1Uc8IB57Lm6k7q6KIDu/p+JWtf3xsXJqAX/5r18hYOTpJyBn0KXUR8oTJ4WFYOcDzWC9n3IflGgHowx6U6z9Q==} + dev: true + + /@volar/typescript@2.4.23: + resolution: {integrity: sha512-lAB5zJghWxVPqfcStmAP1ZqQacMpe90UrP5RJ3arDyrhy4aCUQqmxPPLB2PWDKugvylmO41ljK7vZ+t6INMTag==} + dependencies: + '@volar/language-core': 2.4.23 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + dev: true + + /@vue/compiler-core@3.5.18: + resolution: {integrity: sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==} + dependencies: + '@babel/parser': 7.28.3 + '@vue/shared': 3.5.18 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + dev: true + + /@vue/compiler-dom@3.5.18: + resolution: {integrity: sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==} + dependencies: + '@vue/compiler-core': 3.5.18 + '@vue/shared': 3.5.18 + dev: true + + /@vue/compiler-vue2@2.7.16: + resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + dev: true + + /@vue/language-core@2.2.0(typescript@5.8.3): + resolution: {integrity: sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@volar/language-core': 2.4.23 + '@vue/compiler-dom': 3.5.18 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.5.18 + alien-signals: 0.4.14 + minimatch: 9.0.5 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + typescript: 5.8.3 + dev: true + + /@vue/shared@3.5.18: + resolution: {integrity: sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==} + dev: true + + /acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /ajv-draft-04@1.0.0(ajv@8.13.0): + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.13.0 + dev: true + + /ajv-formats@3.0.1(ajv@8.13.0): + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.13.0 + dev: true + + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + + /ajv@8.13.0: + resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + + /alien-signals@0.4.14: + resolution: {integrity: sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==} + dev: true + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: true + + /asn1.js@4.10.1: + resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} + dependencies: + bn.js: 4.12.2 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + dev: true + + /assert@2.1.0: + resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} + dependencies: + call-bind: 1.0.8 + is-nan: 1.3.2 + object-is: 1.1.6 + object.assign: 4.1.7 + util: 0.12.5 + dev: true + + /assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + dev: true + + /available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + dependencies: + possible-typed-array-names: 1.1.0 + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true + + /bn.js@4.12.2: + resolution: {integrity: sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==} + dev: true + + /bn.js@5.2.2: + resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} + dev: true + + /brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + dependencies: + balanced-match: 1.0.2 + dev: true + + /brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + dev: true + + /browser-resolve@2.0.0: + resolution: {integrity: sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==} + dependencies: + resolve: 1.22.10 + dev: true + + /browserify-aes@1.2.0: + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + dependencies: + buffer-xor: 1.0.3 + cipher-base: 1.0.6 + create-hash: 1.2.0 + evp_bytestokey: 1.0.3 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /browserify-cipher@1.0.1: + resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} + dependencies: + browserify-aes: 1.2.0 + browserify-des: 1.0.2 + evp_bytestokey: 1.0.3 + dev: true + + /browserify-des@1.0.2: + resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} + dependencies: + cipher-base: 1.0.6 + des.js: 1.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /browserify-rsa@4.1.1: + resolution: {integrity: sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==} + engines: {node: '>= 0.10'} + dependencies: + bn.js: 5.2.2 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + dev: true + + /browserify-sign@4.2.3: + resolution: {integrity: sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==} + engines: {node: '>= 0.12'} + dependencies: + bn.js: 5.2.2 + browserify-rsa: 4.1.1 + create-hash: 1.2.0 + create-hmac: 1.1.7 + elliptic: 6.6.1 + hash-base: 3.0.5 + inherits: 2.0.4 + parse-asn1: 5.1.7 + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + dev: true + + /browserify-zlib@0.2.0: + resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} + dependencies: + pako: 1.0.11 + dev: true + + /buffer-xor@1.0.3: + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + dev: true + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + + /builtin-status-codes@3.0.0: + resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} + dev: true + + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + + /call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + dev: true + + /call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + dev: true + + /call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + dev: true + + /chai@5.2.1: + resolution: {integrity: sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==} + engines: {node: '>=18'} + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.2.0 + pathval: 2.0.1 + dev: true + + /check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + dev: true + + /cipher-base@1.0.6: + resolution: {integrity: sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==} + engines: {node: '>= 0.10'} + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /compare-versions@6.1.1: + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} + dev: true + + /confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + dev: true + + /confbox@0.2.2: + resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} + dev: true + + /console-browserify@1.2.0: + resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} + dev: true + + /constants-browserify@1.0.0: + resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} + dev: true + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true + + /create-ecdh@4.0.4: + resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} + dependencies: + bn.js: 4.12.2 + elliptic: 6.6.1 + dev: true + + /create-hash@1.1.3: + resolution: {integrity: sha512-snRpch/kwQhcdlnZKYanNF1m0RDlrCdSKQaH87w1FCFPVPNCQ/Il9QJKAX2jVBZddRdaHBMC+zXa9Gw9tmkNUA==} + dependencies: + cipher-base: 1.0.6 + inherits: 2.0.4 + ripemd160: 2.0.1 + sha.js: 2.4.12 + dev: true + + /create-hash@1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + dependencies: + cipher-base: 1.0.6 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.2 + sha.js: 2.4.12 + dev: true + + /create-hmac@1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + dependencies: + cipher-base: 1.0.6 + create-hash: 1.2.0 + inherits: 2.0.4 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.12 + dev: true + + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + + /crypto-browserify@3.12.1: + resolution: {integrity: sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==} + engines: {node: '>= 0.10'} + dependencies: + browserify-cipher: 1.0.1 + browserify-sign: 4.2.3 + create-ecdh: 4.0.4 + create-hash: 1.2.0 + create-hmac: 1.1.7 + diffie-hellman: 5.0.3 + hash-base: 3.0.5 + inherits: 2.0.4 + pbkdf2: 3.1.3 + public-encrypt: 4.0.3 + randombytes: 2.1.0 + randomfill: 1.0.4 + dev: true + + /de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + dev: true + + /debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + + /deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + dev: true + + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + dev: true + + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + dev: true + + /des.js@1.1.0: + resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + dev: true + + /diffie-hellman@5.0.3: + resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} + dependencies: + bn.js: 4.12.2 + miller-rabin: 4.0.1 + randombytes: 2.1.0 + dev: true + + /domain-browser@4.22.0: + resolution: {integrity: sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==} + engines: {node: '>=10'} + dev: true + + /dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + dev: true + + /elliptic@6.6.1: + resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} + dependencies: + bn.js: 4.12.2 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + dev: true + + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: true + + /es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + dev: true + + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + dev: true + + /es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + dev: true + + /es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + dev: true + + /esbuild@0.25.9: + resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} + engines: {node: '>=18'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.9 + '@esbuild/android-arm': 0.25.9 + '@esbuild/android-arm64': 0.25.9 + '@esbuild/android-x64': 0.25.9 + '@esbuild/darwin-arm64': 0.25.9 + '@esbuild/darwin-x64': 0.25.9 + '@esbuild/freebsd-arm64': 0.25.9 + '@esbuild/freebsd-x64': 0.25.9 + '@esbuild/linux-arm': 0.25.9 + '@esbuild/linux-arm64': 0.25.9 + '@esbuild/linux-ia32': 0.25.9 + '@esbuild/linux-loong64': 0.25.9 + '@esbuild/linux-mips64el': 0.25.9 + '@esbuild/linux-ppc64': 0.25.9 + '@esbuild/linux-riscv64': 0.25.9 + '@esbuild/linux-s390x': 0.25.9 + '@esbuild/linux-x64': 0.25.9 + '@esbuild/netbsd-arm64': 0.25.9 + '@esbuild/netbsd-x64': 0.25.9 + '@esbuild/openbsd-arm64': 0.25.9 + '@esbuild/openbsd-x64': 0.25.9 + '@esbuild/openharmony-arm64': 0.25.9 + '@esbuild/sunos-x64': 0.25.9 + '@esbuild/win32-arm64': 0.25.9 + '@esbuild/win32-ia32': 0.25.9 + '@esbuild/win32-x64': 0.25.9 + dev: true + + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: true + + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + dependencies: + '@types/estree': 1.0.8 + dev: true + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + dev: true + + /evp_bytestokey@1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + dependencies: + md5.js: 1.3.5 + safe-buffer: 5.2.1 + dev: true + + /expect-type@1.2.2: + resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} + engines: {node: '>=12.0.0'} + dev: true + + /exsolve@1.0.7: + resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} + dev: true + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fdir@6.5.0(picomatch@4.0.3): + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + dependencies: + picomatch: 4.0.3 + dev: true + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + dev: true + + /fs-extra@11.3.1: + resolution: {integrity: sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + dev: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: true + + /get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + dev: true + + /get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + dev: true + + /gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + dev: true + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + dependencies: + es-define-property: 1.0.1 + dev: true + + /has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + dev: true + + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.1.0 + dev: true + + /hash-base@2.0.2: + resolution: {integrity: sha512-0TROgQ1/SxE6KmxWSvXHvRj90/Xo1JvZShofnYF+f6ZsGtR4eES7WfrQzPalmyagfKZCXpVnitiRebZulWsbiw==} + dependencies: + inherits: 2.0.4 + dev: true + + /hash-base@3.0.5: + resolution: {integrity: sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==} + engines: {node: '>= 0.10'} + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + dev: true + + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: true + + /he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + dev: true + + /hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + dev: true + + /https-browserify@1.0.0: + resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} + dev: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true + + /import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /is-arguments@1.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + dev: true + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: true + + /is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + dependencies: + hasown: 2.0.2 + dev: true + + /is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + dev: true + + /is-nan@1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + dev: true + + /is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + dev: true + + /is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.19 + dev: true + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: true + + /isomorphic-timers-promises@1.0.1: + resolution: {integrity: sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==} + engines: {node: '>=10'} + dev: true + + /jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + dev: true + + /js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + dev: true + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true + + /jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + dev: true + + /lib-esm@0.4.2: + resolution: {integrity: sha512-VGqaEGuryUbT7FLGxXg46nrSzkhLzyk+JQjYoYEORH5UtdIu3yf6DCOqh65FOR3bWOHHGINQH/vR5YGGIFBgJw==} + dev: true + + /local-pkg@1.1.1: + resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==} + engines: {node: '>=14'} + dependencies: + mlly: 1.7.4 + pkg-types: 2.2.0 + quansync: 0.2.10 + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /loupe@3.2.0: + resolution: {integrity: sha512-2NCfZcT5VGVNX9mSZIxLRkEAegDGBpuQZBy13desuHeVORmBDyAET4TkJr4SjqQy3A8JDofMN6LpkK8Xcm/dlw==} + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + dev: true + + /math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + dev: true + + /md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + dependencies: + hash-base: 3.0.5 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /miller-rabin@4.0.1: + resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} + hasBin: true + dependencies: + bn.js: 4.12.2 + brorand: 1.1.0 + dev: true + + /minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + dev: true + + /minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + dev: true + + /minimatch@10.0.3: + resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} + engines: {node: 20 || >=22} + dependencies: + '@isaacs/brace-expansion': 5.0.0 + dev: true + + /minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.2 + dev: true + + /mlly@1.7.4: + resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + dependencies: + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.1 + dev: true + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + + /muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + dev: true + + /nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /node-stdlib-browser@1.3.1: + resolution: {integrity: sha512-X75ZN8DCLftGM5iKwoYLA3rjnrAEs97MkzvSd4q2746Tgpg8b8XWiBGiBG4ZpgcAqBgtgPHTiAc8ZMCvZuikDw==} + engines: {node: '>=10'} + dependencies: + assert: 2.1.0 + browser-resolve: 2.0.0 + browserify-zlib: 0.2.0 + buffer: 5.7.1 + console-browserify: 1.2.0 + constants-browserify: 1.0.0 + create-require: 1.1.1 + crypto-browserify: 3.12.1 + domain-browser: 4.22.0 + events: 3.3.0 + https-browserify: 1.0.0 + isomorphic-timers-promises: 1.0.1 + os-browserify: 0.3.0 + path-browserify: 1.0.1 + pkg-dir: 5.0.0 + process: 0.11.10 + punycode: 1.4.1 + querystring-es3: 0.2.1 + readable-stream: 3.6.2 + stream-browserify: 3.0.0 + stream-http: 3.2.0 + string_decoder: 1.3.0 + timers-browserify: 2.0.12 + tty-browserify: 0.0.1 + url: 0.11.4 + util: 0.12.5 + vm-browserify: 1.1.2 + dev: true + + /object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + dev: true + + /object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + dev: true + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true + + /object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + dev: true + + /os-browserify@0.3.0: + resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} + dev: true + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + dev: true + + /parse-asn1@5.1.7: + resolution: {integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==} + engines: {node: '>= 0.10'} + dependencies: + asn1.js: 4.10.1 + browserify-aes: 1.2.0 + evp_bytestokey: 1.0.3 + hash-base: 3.0.5 + pbkdf2: 3.1.3 + safe-buffer: 5.2.1 + dev: true + + /path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + dev: true + + /pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} + engines: {node: '>= 14.16'} + dev: true + + /pbkdf2@3.1.3: + resolution: {integrity: sha512-wfRLBZ0feWRhCIkoMB6ete7czJcnNnqRpcoWQBLqatqXXmelSRqfdDK4F3u9T2s2cXas/hQJcryI/4lAL+XTlA==} + engines: {node: '>=0.12'} + dependencies: + create-hash: 1.1.3 + create-hmac: 1.1.7 + ripemd160: 2.0.1 + safe-buffer: 5.2.1 + sha.js: 2.4.12 + to-buffer: 1.2.1 + dev: true + + /picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + dev: true + + /picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + dev: true + + /pkg-dir@5.0.0: + resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} + engines: {node: '>=10'} + dependencies: + find-up: 5.0.0 + dev: true + + /pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + dependencies: + confbox: 0.1.8 + mlly: 1.7.4 + pathe: 2.0.3 + dev: true + + /pkg-types@2.2.0: + resolution: {integrity: sha512-2SM/GZGAEkPp3KWORxQZns4M+WSeXbC2HEvmOIJe3Cmiv6ieAJvdVhDldtHqM5J1Y7MrR1XhkBT/rMlhh9FdqQ==} + dependencies: + confbox: 0.2.2 + exsolve: 1.0.7 + pathe: 2.0.3 + dev: true + + /possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + dev: true + + /postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + dev: true + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: true + + /public-encrypt@4.0.3: + resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} + dependencies: + bn.js: 4.12.2 + browserify-rsa: 4.1.1 + create-hash: 1.2.0 + parse-asn1: 5.1.7 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + dev: true + + /punycode@1.4.1: + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + dev: true + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + dev: true + + /qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.1.0 + dev: true + + /quansync@0.2.10: + resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} + dev: true + + /querystring-es3@0.2.1: + resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==} + engines: {node: '>=0.4.x'} + dev: true + + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /randomfill@1.0.4: + resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} + dependencies: + randombytes: 2.1.0 + safe-buffer: 5.2.1 + dev: true + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: true + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: true + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true + + /resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /ripemd160@2.0.1: + resolution: {integrity: sha512-J7f4wutN8mdbV08MJnXibYpCOPHR+yzy+iQ/AsjMv2j8cLavQ8VGagDFUwwTAdF8FmRKVeNpbTTEwNHCW1g94w==} + dependencies: + hash-base: 2.0.2 + inherits: 2.0.4 + dev: true + + /ripemd160@2.0.2: + resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + dependencies: + hash-base: 3.0.5 + inherits: 2.0.4 + dev: true + + /rollup@4.46.2: + resolution: {integrity: sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.46.2 + '@rollup/rollup-android-arm64': 4.46.2 + '@rollup/rollup-darwin-arm64': 4.46.2 + '@rollup/rollup-darwin-x64': 4.46.2 + '@rollup/rollup-freebsd-arm64': 4.46.2 + '@rollup/rollup-freebsd-x64': 4.46.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.46.2 + '@rollup/rollup-linux-arm-musleabihf': 4.46.2 + '@rollup/rollup-linux-arm64-gnu': 4.46.2 + '@rollup/rollup-linux-arm64-musl': 4.46.2 + '@rollup/rollup-linux-loongarch64-gnu': 4.46.2 + '@rollup/rollup-linux-ppc64-gnu': 4.46.2 + '@rollup/rollup-linux-riscv64-gnu': 4.46.2 + '@rollup/rollup-linux-riscv64-musl': 4.46.2 + '@rollup/rollup-linux-s390x-gnu': 4.46.2 + '@rollup/rollup-linux-x64-gnu': 4.46.2 + '@rollup/rollup-linux-x64-musl': 4.46.2 + '@rollup/rollup-win32-arm64-msvc': 4.46.2 + '@rollup/rollup-win32-ia32-msvc': 4.46.2 + '@rollup/rollup-win32-x64-msvc': 4.46.2 + fsevents: 2.3.3 + dev: true + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + + /safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + dev: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + dev: true + + /setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + dev: true + + /sha.js@2.4.12: + resolution: {integrity: sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==} + engines: {node: '>= 0.10'} + hasBin: true + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + to-buffer: 1.2.1 + dev: true + + /side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + dev: true + + /side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + dev: true + + /side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + dev: true + + /side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + dev: true + + /siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + dev: true + + /source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: true + + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + + /std-env@3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + dev: true + + /stream-browserify@3.0.0: + resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: true + + /stream-http@3.2.0: + resolution: {integrity: sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==} + dependencies: + builtin-status-codes: 3.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + xtend: 4.0.2 + dev: true + + /string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + dev: true + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /strip-literal@3.0.0: + resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} + dependencies: + js-tokens: 9.0.1 + dev: true + + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /timers-browserify@2.0.12: + resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} + engines: {node: '>=0.6.0'} + dependencies: + setimmediate: 1.0.5 + dev: true + + /tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + dev: true + + /tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + dev: true + + /tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + engines: {node: '>=12.0.0'} + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + dev: true + + /tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} + dev: true + + /tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@4.0.3: + resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} + engines: {node: '>=14.0.0'} + dev: true + + /to-buffer@1.2.1: + resolution: {integrity: sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==} + engines: {node: '>= 0.4'} + dependencies: + isarray: 2.0.5 + safe-buffer: 5.2.1 + typed-array-buffer: 1.0.3 + dev: true + + /tty-browserify@0.0.1: + resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} + dev: true + + /typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + dev: true + + /typescript@5.8.2: + resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + dev: true + + /undici-types@7.10.0: + resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} + dev: true + + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + dev: true + + /url@0.11.4: + resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} + engines: {node: '>= 0.4'} + dependencies: + punycode: 1.4.1 + qs: 6.14.0 + dev: true + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + dependencies: + inherits: 2.0.4 + is-arguments: 1.2.0 + is-generator-function: 1.1.0 + is-typed-array: 1.1.15 + which-typed-array: 1.1.19 + dev: true + + /vite-node@3.2.4(@types/node@24.2.1): + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.4.1 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 7.1.2(@types/node@24.2.1) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + dev: true + + /vite-plugin-dts@4.5.4(@types/node@24.2.1)(typescript@5.8.3)(vite@7.1.2): + resolution: {integrity: sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg==} + peerDependencies: + typescript: '*' + vite: '*' + peerDependenciesMeta: + vite: + optional: true + dependencies: + '@microsoft/api-extractor': 7.52.10(@types/node@24.2.1) + '@rollup/pluginutils': 5.2.0 + '@volar/typescript': 2.4.23 + '@vue/language-core': 2.2.0(typescript@5.8.3) + compare-versions: 6.1.1 + debug: 4.4.1 + kolorist: 1.8.0 + local-pkg: 1.1.1 + magic-string: 0.30.17 + typescript: 5.8.3 + vite: 7.1.2(@types/node@24.2.1) + transitivePeerDependencies: + - '@types/node' + - rollup + - supports-color + dev: true + + /vite-plugin-node-polyfills@0.24.0(vite@7.1.2): + resolution: {integrity: sha512-GA9QKLH+vIM8NPaGA+o2t8PDfFUl32J8rUp1zQfMKVJQiNkOX4unE51tR6ppl6iKw5yOrDAdSH7r/UIFLCVhLw==} + peerDependencies: + vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + dependencies: + '@rollup/plugin-inject': 5.0.5 + node-stdlib-browser: 1.3.1 + vite: 7.1.2(@types/node@24.2.1) + transitivePeerDependencies: + - rollup + dev: true + + /vite-plugin-resolve@2.5.2: + resolution: {integrity: sha512-8twv20M+KIMxkZzAoF1eAUxxxB56NxKdYjIJ309A/30lZ3GAqgiAeGFjVVlLLEpeAcbAwfl9p7jztsQEw7C3Jg==} + dependencies: + lib-esm: 0.4.2 + dev: true + + /vite@7.1.2(@types/node@24.2.1): + resolution: {integrity: sha512-J0SQBPlQiEXAF7tajiH+rUooJPo0l8KQgyg4/aMunNtrOa7bwuZJsJbDWzeljqQpgftxuq5yNJxQ91O9ts29UQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + dependencies: + '@types/node': 24.2.1 + esbuild: 0.25.9 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.46.2 + tinyglobby: 0.2.14 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vitest@3.2.4(@types/node@24.2.1): + resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.2.4 + '@vitest/ui': 3.2.4 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + dependencies: + '@types/chai': 5.2.2 + '@types/node': 24.2.1 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@7.1.2) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.2.1 + debug: 4.4.1 + expect-type: 1.2.2 + magic-string: 0.30.17 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.14 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 7.1.2(@types/node@24.2.1) + vite-node: 3.2.4(@types/node@24.2.1) + why-is-node-running: 2.3.0 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + dev: true + + /vm-browserify@1.1.2: + resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} + dev: true + + /vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + dev: true + + /which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + dev: true + + /why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + dev: true + + /xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + dev: true + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true + + '@gitea.cf/MES-FE/cut-abstractions/releases/download/0.3/cut-abstractions-0.3.3.tgz': + resolution: {tarball: http://gitea.cf/MES-FE/cut-abstractions/releases/download/0.3/cut-abstractions-0.3.3.tgz} + name: cut-abstractions + version: 0.3.3 + dev: false + + '@gitea.cf/MES-FE/mes-packages/releases/download/0.2/mes-processors-libs-0.2.1.tgz': + resolution: {tarball: http://gitea.cf/MES-FE/mes-packages/releases/download/0.2/mes-processors-libs-0.2.1.tgz} + name: '@mes-processors/libs' + version: 0.2.1 + dependencies: + cut-abstractions: '@gitea.cf/MES-FE/cut-abstractions/releases/download/0.3/cut-abstractions-0.3.3.tgz' + dev: false diff --git a/src/cncTest.test.ts b/src/cncTest.test.ts new file mode 100644 index 0000000..67f628b --- /dev/null +++ b/src/cncTest.test.ts @@ -0,0 +1,68 @@ +import { test } from "vitest"; +import { CncConverter, CncTemplateParams, TemplateEndTargetType } from "./processors/CncConverter/CncConverter"; + +test('cncTest', async () => { + const testData: CncTemplateParams = { + templateName: 'MicroDrawBan_XML', + propertyList: [{ + propertyName: 'Version', + propertyValue: '3.0', + }, { + propertyName: 'Time', + propertyValue: '20250903', + }, { + propertyName: 'Source', + propertyValue: '福州晨丰科技有限公司', + }, { + propertyName: 'SourceType', + propertyValue: 'CNC-Drilling', + }], + children: [{ + templateName: 'Plane', + propertyList: [{ + propertyName: 'Name', + propertyValue: '板名称', + }, { + propertyName: 'Code', + propertyValue: '板编号', + }, + { + propertyName: 'Order', + propertyValue: '生产单号', + }], + children: [{ + templateName: 'Outline', + propertyList: [], + children: [ + { + templateName: 'Point', + propertyList: [{ + propertyName:'Value', + propertyValue: 213, + }], + children: [], + templateEndType: TemplateEndTargetType.SingleEnd + } + ], + templateEndType: TemplateEndTargetType.DoubleEnd + }, + { + templateName:'HoleV', + propertyList:[ + { + propertyName:'Name', + propertyValue:"HoleV" + }, + ], + children:[], + templateEndType: TemplateEndTargetType.SingleEnd + } + ], + templateEndType: TemplateEndTargetType.DoubleEnd + }], + templateEndType: TemplateEndTargetType.DoubleEnd + } + let cncWriter = new CncConverter() + await cncWriter.doXML([testData]) + debugger +}) \ No newline at end of file diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..61e5353 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,5 @@ + + +// processors +export * from "./processors/processCodeConverter/processCodeConverter"; +export * from "./processors/NcConverter/NcConverter" \ No newline at end of file diff --git a/src/modules/README.md b/src/modules/README.md new file mode 100644 index 0000000..6d39661 --- /dev/null +++ b/src/modules/README.md @@ -0,0 +1,2 @@ +### react-layout +矩形优化算法(陈总新优化) \ No newline at end of file diff --git a/src/modules/rect-layout/KLSCclass.ts b/src/modules/rect-layout/KLSCclass.ts new file mode 100644 index 0000000..1687070 --- /dev/null +++ b/src/modules/rect-layout/KLSCclass.ts @@ -0,0 +1,1523 @@ + + +//import { DrawRect } from "../DrawRect"; +export class KLSC +{ + xbang: YH_bang[];//小板集合 + Bakbang: YH_bang[];//备份小板集合 + HB_bang: number[] = [];//合并的板 + HB: number[][] = [];//合并板的数组 + B_k: number;//大板宽 + B_g: number;//大板高 + dt: number; //刀头大小(含修边) + wzx: number; //临时用于打印 + wzy: number; //临时用于打印 + jl_mz: number; //用于测试距离或者面积优选 + SCid: number[] = []; //用于存化顺序的板的bangid + //f = () => 5; + constructor(xbang: YH_bang[], Bang_k: number, Bang_g: number, dt: number, wzx: number, wzy: number, JL_MZ: number) //false JL ture MZ + { + + this.xbang = JSON.parse(JSON.stringify(xbang)); + //this.xbang = [...xbang]; + this.Bakbang = JSON.parse(JSON.stringify(xbang)); + this.B_g = Bang_g; + this.B_k = Bang_k; + this.dt = dt; + this.wzx = wzx; + this.wzy = wzy; + this.jl_mz = JL_MZ; + this.XDscjs(); + }; + + //查找距离中心最近,且跟最大的板相差不大于容差面积 rcmz 的板 返加YH_bang[].bangid + MaxMZ = (rcmz: number): number => + { + let tmepckb: number; + let tmepckb1: number; + let tempxbang: YH_bang[] = []; + this.xbang.sort((b, a) => a.pbg * a.pbk - b.pbg * b.pbk); + let maxmz = this.xbang[0].pbg * this.xbang[0].pbk / 1000000; + let maxbangid = this.xbang[0].bangid; + for (let i = 0; i < this.xbang.length; i++) + { + if (this.xbang[i].pbg > this.xbang[i].pbk) + { + tmepckb = this.xbang[i].pbg / this.xbang[i].pbk; + } + else + { + tmepckb = this.xbang[i].pbk / this.xbang[i].pbg; + } + if (this.xbang[0].pbg > this.xbang[0].pbk) + { + tmepckb1 = this.xbang[0].pbg / this.xbang[0].pbk; + } + else + { + tmepckb1 = this.xbang[0].pbk / this.xbang[0].pbg; + } + + if (equaln(this.xbang[i].pbg * this.xbang[i].pbk / 1000000, maxmz, rcmz) && equaln(tmepckb, tmepckb1, 2)) + { + tempxbang.push(this.xbang[i]); + } + } + if (tempxbang.length > 0) + { + return this.minJL(tempxbang); + } + else + { + return maxbangid; + } + + }; + + //查找指定Bangid的板 返回在数组中的位置ID f = () => 5; + getID = (bangid: number): number => this.xbang.findIndex((n) => n.bangid == bangid); + + //查找备份板Bangid的板 返回在数组中的位置ID f = () => 5; + getID_Bkb = (bangid: number): number => this.Bakbang.findIndex((n) => n.bangid == bangid); + + + //查找距离最近的板 返加YH_bang[].bangid + minJL = (xbang: YH_bang[]): number => { xbang.sort((b, a) => Math.hypot(this.B_k / 2 - b.x - b.pbk / 2, this.B_g / 2 - b.y - b.pbg / 2) - Math.hypot(this.B_k / 2 - a.x - a.pbk / 2, this.B_g / 2 - a.y - a.pbg / 2)); return xbang[0].bangid; }; + + //查找左边且Y位置一样的板,, 返加YH_bang[].bangid + F_Left = (bangid: number): number|undefined => + { + let a = this.xbang.find((n) => equaln(n.x + n.pbk + this.dt, this.xbang[this.getID(bangid)].x, 0.001) + && equaln(n.y, this.xbang[this.getID(bangid)].y, 0.001) && n.ishb == false); + if (a == undefined) { return; } return a.bangid; + }; + //查找左边关连的板,并写入 + F_GL_LR = () => + { + let temp: number; + let bangIndex: number; + let maxkd: number = 0; + let maxid: number; //bangid + if (this.xbang.length > 1) + { + for (let i = 0; i < this.xbang.length; i++) + { + bangIndex = i; + while (1) //左边 + { + if (this.xbang[bangIndex].pbg > this.xbang[bangIndex].pbk && this.xbang[bangIndex].pbk < 200 && this.xbang[bangIndex].ishb == false) + { + temp = this.xbang.findIndex(n => n.x + n.pbk < this.xbang[bangIndex].x && n.y <= this.xbang[bangIndex].y && this.XJcd(n.bangid, this.xbang[bangIndex].bangid)[1] > this.xbang[bangIndex].pbk); + if (temp != -1) + { + if (this.xbang[temp].pbk > maxkd) + { + maxkd = this.xbang[temp].pbk; + maxid = this.xbang[temp].bangid; + } + if (this.xbang[temp].pbk > 200) + { + this.xbang[temp].isgr = true; + this.xbang[temp].gr!.push(this.xbang[bangIndex].bangid); + this.xbang[bangIndex].grid = this.xbang[temp].bangid; + break; + } + else + { + bangIndex = temp; + } + + } + else + { + break; + } + } + else + { + break; + } + + } + bangIndex = i; + while (1) //右边 + { + if (this.xbang[bangIndex].pbg > this.xbang[bangIndex].pbk && this.xbang[bangIndex].pbk < 200 && this.xbang[bangIndex].ishb == false) + { + temp = this.xbang.findIndex(n => n.x > this.xbang[bangIndex].x + this.xbang[bangIndex].pbk + && this.LR_is(this.xbang[bangIndex].bangid, n.bangid) == false + && n.pbg > 300 + && this.XJcd(n.bangid, this.xbang[bangIndex].bangid)[1] > this.xbang[bangIndex].pbk); + if (temp != -1) + { + if (this.xbang[temp].pbk > maxkd) + { + maxkd = this.xbang[temp].pbk; + maxid = this.xbang[temp].bangid; + } + if (this.xbang[temp].pbk > 200) + { + this.xbang[temp].isgr = true; + this.xbang[temp].gr!.push(this.xbang[bangIndex].bangid); + this.xbang[bangIndex].grid = this.xbang[temp].bangid; + break; + } + else + { + bangIndex = temp; + } + + } + else + { + break; + } + } + else + { + break; + } + + } + + + } + }; + }; + + //查找上下边关连的板,并写入 + F_GL_TD = () => + { + let temp: number; + let bangIndex: number; + let maxkd: number = 0; + let maxid: number; //bangid + if (this.xbang.length > 1) + { + for (let i = 0; i < this.xbang.length; i++) + { + bangIndex = i; + while (1) //上面 + { + if (this.xbang[bangIndex].pbg < this.xbang[bangIndex].pbk && this.xbang[bangIndex].pbg < 200 && this.xbang[bangIndex].ishb == false) + { + temp = this.xbang.findIndex(n => n.y > this.xbang[bangIndex].y + this.xbang[bangIndex].pbg && n.x + 0.01 <= this.xbang[bangIndex].x + && this.XJcd(n.bangid, this.xbang[bangIndex].bangid)[0] > this.xbang[bangIndex].pbg); + if (temp != -1) + { + if (this.xbang[temp].pbg > maxkd) + { + maxkd = this.xbang[temp].pbg; + maxid = this.xbang[temp].bangid; + } + if (this.xbang[temp].pbg > 200) + { + this.xbang[temp].isgr = true; + this.xbang[temp].gr!.push(this.xbang[bangIndex].bangid); + this.xbang[bangIndex].grid = this.xbang[temp].bangid; + break; + } + else + { + bangIndex = temp; + } + + } + else + { + break; + } + } + else + { + break; + } + + } + bangIndex = i; + while (1) //下面 + { + + if (this.xbang[bangIndex].pbg < this.xbang[bangIndex].pbk && this.xbang[bangIndex].pbg < 200 && this.xbang[bangIndex].ishb == false) + { + + temp = this.xbang.findIndex(n => n.y + n.pbg < this.xbang[bangIndex].y + this.xbang[bangIndex].pbg && n.x - 0.01 <= this.xbang[bangIndex].x + && this.XJcd(n.bangid, this.xbang[bangIndex].bangid)[0] > this.xbang[bangIndex].pbg); + if (temp != -1) + { + if (this.xbang[temp].pbg > maxkd) + { + maxkd = this.xbang[temp].pbg; + maxid = this.xbang[temp].bangid; + } + if (this.xbang[temp].pbg > 200) + { + this.xbang[temp].isgr = true; + this.xbang[temp].gr!.push(this.xbang[bangIndex].bangid); + this.xbang[bangIndex].grid = this.xbang[temp].bangid; + break; + } + else + { + bangIndex = temp; + } + + } + else + { + break; + } + } + else + { + break; + } + + } + + + } + }; + }; + + //查找有异形交集关连的板,并写入 + F_GL_JJB = () => + { + let temp: number; + if (this.xbang.length > 1) + { + for (let i = 0; i < this.xbang.length; i++) + { + temp = this.xbang.findIndex(n => this.XJcd(n.bangid, this.xbang[i].bangid)[0] > 50 + && this.XJcd(n.bangid, this.xbang[i].bangid)[1] > 50 && n.bangid != this.xbang[i].bangid); + if (temp != -1) + { + if (this.xbang[i].pbg * this.xbang[i].pbk > this.xbang[temp].pbg * this.xbang[temp].pbk) + { + this.xbang[i].isgr = true; + this.xbang[i].gr!.push(this.xbang[temp].bangid); + this.xbang[temp].grid = this.xbang[i].bangid; + } + else if (equaln(this.xbang[i].pbg * this.xbang[i].pbk, this.xbang[temp].pbg * this.xbang[temp].pbk, 0.01)) + { + if (this.xbang[temp].x > this.xbang[i].x) + { + + this.xbang[i].isgr = true; + this.xbang[i].gr!.push(this.xbang[temp].bangid); + this.xbang[temp].grid = this.xbang[i].bangid; + } + else + { + this.xbang[temp].isgr = true; + this.xbang[temp].gr!.push(this.xbang[i].bangid); + this.xbang[i].grid = this.xbang[temp].bangid; + } + } + else + { + this.xbang[temp].isgr = true; + this.xbang[temp].gr!.push(this.xbang[i].bangid); + this.xbang[i].grid = this.xbang[temp].bangid; + } + + } + } + }; + for (let k = 0; k < this.xbang.length; k++) + { + let newgr = [... new Set(this.xbang[k].gr)]; + this.xbang[k].gr = newgr; + } + }; + + //判断有关联的板跟大板之间是否有交集,如果有取消这块板的关联 + Is_big_gr = () => + { + for (let k = 0; k < this.xbang.length; k++) + { + let newgr = [... new Set(this.xbang[k].gr)]; + this.xbang[k].gr = newgr; + } + let tempx: number; + let tempy: number; + let bangIndex1 = this.xbang[this.getID(this.HB[0][0])]; + let bangIndex2: number; + for (let i = 0; i < this.xbang.length; i++) + { + if (this.xbang[i].isgr == true) + { + tempx = 0; + tempy = 0; + for (let j = 0; j < this.xbang[i].gr!.length; j++) + { + bangIndex2 = this.getID(this.xbang[i].gr![j]); + if (this.xbang[i].bangid == 10)////////////////////用于调试 + { + // console.log(this.xbang[i].bangid); + } + if (this.xbang[bangIndex2].pbg > this.xbang[bangIndex2].pbk) + { + tempy = this.Jcxj(bangIndex1.y, bangIndex1.pbg, this.xbang[bangIndex2].y, this.xbang[bangIndex2].pbg); + } + else + { + tempx = this.Jcxj(bangIndex1.x, bangIndex1.pbk, this.xbang[bangIndex2].x, this.xbang[bangIndex2].pbk); + } + } + if (tempx > 50 || tempy > 50) + { + this.xbang[i].isgr = false; + } + } + } + + }; + + + //检测两块板之间的右上角是否有板 false 没有 true 有 + LR_is = (bangid1: number, bangid2: number): boolean => + { + let tb: YH_bang[] = []; + tb.push(this.xbang[this.getID(bangid1)]); + tb.push(this.xbang[this.getID(bangid2)]); + if (tb[0].pbg + tb[0].y > tb[1].pbg + tb[1].y)//右上空间 左边高 + { + return this.JCQY_is_bang(tb[1].x, tb[1].y + tb[1].pbg + this.dt, tb[1].pbk, tb[0].pbg - tb[1].pbg - this.dt); + } + else + { + return false; + } + }; + + //检测两块板之间的右上角是否有板 false 没有 true 有 + TD_is = (bangid1: number, bangid2: number): boolean => + { + let tb: YH_bang[] = []; + tb.push(this.xbang[this.getID(bangid1)]); + tb.push(this.xbang[this.getID(bangid2)]); + if (tb[0].pbk + tb[0].x > tb[1].pbk + tb[1].x)//右下空间 左边高 + { + return this.JCQY_is_bang(tb[1].x, tb[1].y + tb[1].pbg + this.dt, tb[1].pbk, tb[0].pbg - tb[1].pbg - this.dt); + } + else + { + return false; + } + }; + + //查找左边且Y位置一样的板,, 返加YH_bang[].bangid + F_Left_Big = (bangid: number, gbcd: number): number => + { + let tempjh: YH_bang[] = []; + for (let i = 0; i < this.xbang.length; i++) + { + if (this.xbang[i].x + this.xbang[i].pbk < this.xbang[this.getID(bangid)].x && this.XJcd(this.xbang[i].bangid, this.xbang[this.getID(bangid)].bangid)[1] > gbcd) + { + tempjh.push(this.xbang[i]); + } + } + if (tempjh.length > 0) + { + tempjh.sort((a, b) => a.x - b.x); + return tempjh[0].bangid; + } + else + { + return -1; + } + }; + + //找到左右靠边最长的高度 返回 [0]长度 [1] y位置 [2] 0左边 1 右边 + L_R_kbcd = (bangid: number): [number, number|undefined, number] => + { + let l_b: YH_bang[] = []; + let cd_l = 0; let cd_r: number = 0; let wzl: number|undefined ; let wzr: number|undefined; + let tb = [...this.xbang]; + let tempx: number = this.xbang[this.getID(bangid)].x; + let tempy: number = this.xbang[this.getID(bangid)].y; + let tempk: number = this.xbang[this.getID(bangid)].pbk; + let tempid: number; + let isend: boolean = true; + for (let i = 0; i < 2; i++) + { + l_b = []; + tb = [...this.xbang]; + isend = true; + while (isend == true) + { + if (i == 0) { tempid = tb.findIndex((n) => equaln(n.x + n.pbk + this.dt, tempx, 0.001) && (n.y <= tempy)); } + else { tempid = tb.findIndex((n) => equaln(n.x, tempx + tempk + this.dt, 0.001) && (n.y <= tempy)); } + + if (tempid != -1) + { + l_b.push(tb[tempid]); + tb.splice(tempid, 1); + } + else + { + isend = false; + } + } + if (l_b.length > 0) + { + l_b.sort((a, b) => b.pbg - a.pbg); + if (i == 0) { cd_l = l_b[0].pbg; wzl = l_b[0].y; } else { cd_r = l_b[0].pbg; wzr = l_b[0].y; } + } + } + if (cd_l > cd_r || cd_l == cd_r && cd_l > 0) + { + return [cd_l, wzl, 0]; + } + else if (cd_l < cd_r) + { + return [cd_r, wzr, 1]; + } + else + { + return [0, 0, 0]; + } + + }; + + //查找右边且Y位置一样的板,, 返加YH_bang[].bangid + F_Right = (bangid: number): number|undefined => + { + let a = this.xbang.find((n) => equaln(n.x, this.xbang[this.getID(bangid)].x + this.xbang[this.getID(bangid)].pbk + this.dt, 0.001) + && equaln(n.y, this.xbang[this.getID(bangid)].y, 0.001) && n.ishb == false); + if (a == undefined) { return; } return a.bangid; + }; + + //查找右边且Y位置一样的板,, 返加YH_bang[].bangid + F_Right_Big = (bangid: number, gbcd: number): number => + { + let tempjh: YH_bang[] = []; + for (let i = 0; i < this.xbang.length; i++) + { + if (this.xbang[i].x > this.xbang[this.getID(bangid)].x + this.xbang[this.getID(bangid)].pbk && this.XJcd(this.xbang[i].bangid, this.xbang[this.getID(bangid)].bangid)[1] > gbcd) + { + tempjh.push(this.xbang[i]); + } + } + if (tempjh.length > 0) + { + tempjh.sort((a, b) => a.x - b.x); + return tempjh[0].bangid; + } + else + { + return -1; + } + }; + + //查找下边且X位置一样的板,, 返加YH_bang[].bangid + F_Down = (bangid: number): number|undefined => + { + let a = this.xbang.find((n) => equaln(n.y + n.pbg + this.dt, this.xbang[this.getID(bangid)].y, 0.001) + // && n.x > 10 + && equaln(n.x, this.xbang[this.getID(bangid)].x, 0.001) && n.ishb == false); + if (a == undefined) { return; } return a.bangid; + }; + + //查找上边且X位置一样的板,, 返加YH_bang[].bangid + F_TOP = (bangid: number): number|undefined => + { + let a = this.xbang.find((n) => equaln(n.y, this.xbang[this.getID(bangid)].y + this.xbang[this.getID(bangid)].pbg + this.dt, 0.001) + //&& n.x > 10 + && equaln(n.x, this.xbang[this.getID(bangid)].x, 0.001) && n.ishb == false); + if (a == undefined) { return; } return a.bangid; + }; + + + //查找上边且X位置一样的板,, 返加YH_bang[].bangid hbcd为大于共边的长度 + F_Top_Big = (bangid: number, gbcd: number): number => + { + let tempjh: YH_bang[] = []; + for (let i = 0; i < this.xbang.length; i++) + { + if (this.xbang[i].y > this.xbang[this.getID(bangid)].y + this.xbang[this.getID(bangid)].pbg + && this.xbang[i].x + this.xbang[i].pbk <= this.xbang[this.getID(bangid)].x + this.xbang[this.getID(bangid)].pbk + 0.1 + && this.XJcd(this.xbang[i].bangid, this.xbang[this.getID(bangid)].bangid)[0] > gbcd) + { + tempjh.push(this.xbang[i]); + } + } + if (tempjh.length > 0) + { + tempjh.sort((a, b) => a.x - b.x); + return tempjh[0].bangid; + } + else + { + return -1; + } + }; + + + //查找下边且X位置一样的板,, 返加YH_bang[].bangid + F_Down_Big = (bangid: number, gbcd: number): number => + { + let tempjh: YH_bang[] = []; + for (let i = 0; i < this.xbang.length; i++) + { + for (let i = 0; i < this.xbang.length; i++) + { + if (this.xbang[i].y + this.xbang[i].pbg < this.xbang[this.getID(bangid)].y + && this.xbang[i].x >= this.xbang[this.getID(bangid)].x && this.xbang[i].pbg > 300 + && this.XJcd(this.xbang[i].bangid, this.xbang[this.getID(bangid)].bangid)[0] > gbcd) + { + tempjh.push(this.xbang[i]); + } + } + } + if (tempjh.length > 0) + { + tempjh.sort((a, b) => a.x - b.x); + return tempjh[0].bangid; + } + else + { + return -1; + } + }; + + + //合并同高相邻的板 isbig: true 为第一回合并的大板 wz为方位 L 左 R右 T上 D下 返回是否有合并过 false 为没有合并过 true 有合并过 + HB_LR = (bangid: number, isbig: boolean): boolean => + { + let isend: boolean = true; + let tempbangid: number|undefined; + let ishb: boolean = false; + + while (isend == true) + { + tempbangid = this.F_Left(bangid); + if (tempbangid != undefined) + { + let temp = this.JC_is_bang(bangid, tempbangid); //[f/t,1:x,2:y,3:k,4:g] + if (temp[0] == false) + { + this.addbang(bangid, tempbangid, temp[1], temp[2], temp[3], temp[4], isbig); + ishb = true; + } + else + { + isend = false; + } + } + else + { + isend = false; + } + } + isend = true; + while (isend == true) + { + tempbangid = this.F_Right(bangid); + if (tempbangid != undefined) + { + let temp = this.JC_is_bang(bangid, tempbangid); //[f/t,1:x,2:y,3:k,4:g] + if (temp[0] == false) + { + this.addbang(bangid, tempbangid, temp[1], temp[2], temp[3], temp[4], isbig); + ishb = true; + } + else + { + isend = false; + } + } + else + { + isend = false; + } + } + return ishb; + }; + + //合并同宽相邻的板 isbig: true 为第一回合并的大板 wz为方位 L 左 R右 T上 D下 返回是否有合并过 false 为没有合并过 true 有合并过 + HB_TD = (bangid: number, isbig: boolean): boolean => + { + let isend: boolean = true; + let tempbangid: number|undefined; + let ishb: boolean = false; + while (isend == true) + { + tempbangid = this.F_Down(bangid); + if (tempbangid != undefined) + { + let temp = this.JC_is_bang(bangid, tempbangid); //[f/t,1:x,2:y,3:k,4:g] + if (temp[0] == false) + { + this.addbang(bangid, tempbangid, temp[1], temp[2], temp[3], temp[4], isbig); + ishb = true; + } + else + { + isend = false; + } + + } + else + { + isend = false; + } + } + isend = true; + while (isend == true) + { + tempbangid = this.F_TOP(bangid); + if (tempbangid != undefined) + { + let temp = this.JC_is_bang(bangid, tempbangid); //[f/t,1:x,2:y,3:k,4:g] + if (temp[0] == false) + { + this.addbang(bangid, tempbangid, temp[1], temp[2], temp[3], temp[4], isbig); + ishb = true; + } + else + { + isend = false; + } + } + else + { + isend = false; + } + } + return ishb; + }; + + addbang = (id1: number, id2: number, x: number, y: number, k: number, g: number, isbig: boolean) => //把合并的板写入,并改板的大小 + { + let tempid1 = this.getID(id1); + let tempid2 = this.getID(id2); + if (this.xbang[tempid1].ishb == false) + { + this.HB_bang.push(id1); + } + this.HB_bang.push(id2); + this.xbang[tempid1].x = x; + this.xbang[tempid1].y = y; + this.xbang[tempid1].pbk = k; + this.xbang[tempid1].pbg = g; + this.xbang[tempid1].ishb = true; + this.xbang[tempid2].ishb = true; + if (isbig == true) { this.xbang[tempid1].isbig = true; this.xbang[tempid2].isbig = true; } + }; + //计算相邻两块板中有空位的地方是否有其它小板 返回 false 为没有其它板,true 有其它板 x,y,k,g + JC_is_bang = (bangid1: number, bangid2: number): [boolean, number, number, number, number] => + { + let tb: YH_bang[] = []; + tb.push(this.xbang[this.getID(bangid1)]); + tb.push(this.xbang[this.getID(bangid2)]); + if (equaln(tb[0].y, tb[1].y, 0.01)) //左右相邻 + { + tb.sort((a, b) => a.x - b.x); + if (tb[0].pbg < tb[1].pbg)//左上空间 右边高 + { + return [this.JCQY_is_bang(tb[0].x, tb[0].y + tb[0].pbg + this.dt, tb[0].pbk, tb[1].pbg - tb[0].pbg - this.dt), + tb[0].x, tb[0].y, tb[0].pbk + tb[1].pbk + this.dt, tb[1].pbg]; + } + else if (tb[0].pbg > tb[1].pbg)//右上空间 左边高 + { + return [this.JCQY_is_bang(tb[1].x, tb[1].y + tb[1].pbg + this.dt, tb[1].pbk, tb[0].pbg - tb[1].pbg - this.dt), + tb[0].x, tb[0].y, tb[0].pbk + tb[1].pbk + this.dt, tb[0].pbg]; + } + else //一样高 + { + return [false, tb[0].x, tb[0].y, tb[0].pbk + tb[1].pbk + this.dt, tb[0].pbg]; + } + } + else //上下空间 + { + tb.sort((b, a) => a.y - b.y); + if (tb[0].pbk < tb[1].pbk)//右上空间 上边短 + { + return [this.JCQY_is_bang(tb[0].x + tb[0].pbk + this.dt, tb[0].y, tb[1].pbk - tb[0].pbk - this.dt, tb[0].pbg), + tb[1].x, tb[1].y, tb[1].pbk, tb[0].pbg + tb[1].pbg + this.dt]; + } + else if (tb[0].pbk > tb[1].pbk)//右下空间 下边短 + { + return [this.JCQY_is_bang(tb[1].x + tb[1].pbk + this.dt, tb[1].y, tb[0].pbk - tb[1].pbk - this.dt, tb[1].pbg), + tb[1].x, tb[1].y, tb[0].pbk, tb[0].pbg + tb[1].pbg + this.dt]; + } + else //一样高 + { + return [false, tb[1].x, tb[1].y, tb[0].pbk, tb[0].pbg + tb[1].pbg + this.dt]; + } + } + }; + + //检测两块板之间相交的长度且两块板之间没有其它板 ,返回长度,第一个为X相交长度 第二个为Y相交长度 + XJcd = (bangid1: number, bangid2: number): [number, number] => + { + let tempbang: YH_bang[] = []; + tempbang.push(this.xbang[this.getID(bangid1)]); + tempbang.push(this.xbang[this.getID(bangid2)]); + + let tempx = this.Jcxj(tempbang[0].x, tempbang[0].pbk, tempbang[1].x, tempbang[1].pbk); + let tempy = this.Jcxj(tempbang[0].y, tempbang[0].pbg, tempbang[1].y, tempbang[1].pbg); + if (tempx > 0 && tempy > 0) + { + return [tempx, tempy]; + } + else if (tempx > 0) + { + tempbang.sort((a, b) => a.x - b.x); + if (tempbang[0].y > tempbang[1].y) + { + if (this.JCQY_is_bang(tempbang[1].x, tempbang[1].y + tempbang[1].pbg, tempx, tempbang[0].y - tempbang[1].y - tempbang[1].pbg) == false) + { + return [tempx, 0]; + } + else + { + return [0, 0]; + } + } + else + { + if (this.JCQY_is_bang(tempbang[1].x, tempbang[0].y + tempbang[0].pbg, tempx, tempbang[1].y - tempbang[0].y - tempbang[0].pbg) == false) + { + return [tempx, 0]; + } + else + { + return [0, 0]; + } + } + + } + else if (tempy > 0) + { + tempbang.sort((a, b) => a.x - b.x); + if (tempbang[0].y > tempbang[1].y) + { + if (this.JCQY_is_bang(tempbang[0].x + tempbang[0].pbk, tempbang[0].y, tempbang[1].x - tempbang[0].x - tempbang[0].pbk, tempy) == false) + { + return [0, tempy]; + } + else + { + return [0, 0]; + } + } + else + { + if (this.JCQY_is_bang(tempbang[0].x + tempbang[0].pbk, tempbang[1].y, tempbang[1].x - tempbang[0].x - tempbang[0].pbk, tempy) == false) + { + return [0, tempy]; + } + else + { + return [0, 0]; + } + } + } + else + { + return [0, 0]; + } + }; + + //检测指定区域内否有其它小板 返回 false 为没有其它板,true 有其它板 + JCQY_is_bang = (x: number, y: number, k: number, g: number): boolean => + { + let result = this.xbang.findIndex((n) => (k + n.pbk - Math.abs(x - n.x) - Math.abs(x - n.x + k - n.pbk)) / 2 > 0.01 && + (g + n.pbg - Math.abs(y - n.y) - Math.abs(y - n.y + g - n.pbg)) / 2 > 0.01); + if (result == -1) { return false; } else { return true; } + }; + + //计算两边相交长度/ + Jcxj = (wz1: number, l1: number, wz2: number, l2: number): number => { return (l1 + l2 - Math.abs(wz1 - wz2) - Math.abs(wz1 - wz2 + l1 - l2)) / 2; }; + + Find_BS = (): number[] => + { + let temp = this.Find_BS_gr(); + if (temp[0] > 2) + { + return this.Find_BS_wgr()[1]; + } + else + { + if (temp[1][0] == 0) + { + return this.Find_BS_wgr()[1]; + } + else + { + return temp[1]; + } + + + } + }; + //找到共边最少的板的集合 订算有关系的板 + Find_BS_gr = (): [number, number[]] => + { + let bs: number = 6; + let id: number[] = []; + let tempsl: number[]; + if (this.xbang.length == 1) + { + return [0, [0]]; + } + else + { + for (let i = 0; i < this.xbang.length; i++) + { + if (this.xbang[i].isgr == false && this.xbang[i].ishb == false && this.xbang[i].isqg == false) + { + tempsl = this.JSgbsl(this.xbang[i].bangid); + if (bs == tempsl[0]) + { + id.push(this.xbang[i].bangid); + } + else if (bs > tempsl[0]) + { + bs = tempsl[0]; + id = []; + id.push(this.xbang[i].bangid); + } + + } + } + if (id.length > 0) + { return [bs, id]; } + else + { + //console.log("没找到最少边"); + return [0, [0]]; + } + + } + }; + + //找到共边最少的板的集合 订算没有算关系的板 + Find_BS_wgr = (): [number, number[]] => + { + let bs: number = 6; + let id: number[] = []; + let tempsl: number[]; + if (this.xbang.length == 1) + { + return [0, [0]]; + } + else + { + for (let i = 0; i < this.xbang.length; i++) + { + if (this.xbang[i].ishb == false && this.xbang[i].isqg == false) + { + tempsl = this.JSgbsl(this.xbang[i].bangid); + if (bs == tempsl[0]) + { + id.push(this.xbang[i].bangid); + } + else if (bs > tempsl[0]) + { + bs = tempsl[0]; + id = []; + id.push(this.xbang[i].bangid); + } + } + } + if (id.length > 0) { return [bs, id]; } else { return [0, [0]]; } + + } + }; + + + //计算这块板的与其它板的相交的边数,及每条边数跟权重 0数量 1左 2右 3上 4下 5权重 + JSgbsl = (bangid: number): [number, number, number, number, number, number] => + { + let left = 0, right = 0, top = 0, down = 0, qz = 0; + let bangIndex = this.getID(bangid); + for (let j = 0; j < this.xbang.length; j++) + { + if (bangIndex != j && this.xbang[j].isqg == false) + { + let jjy = this.Jcxj(this.xbang[bangIndex].y, this.xbang[bangIndex].pbg, this.xbang[j].y, this.xbang[j].pbg); + let jjx = this.Jcxj(this.xbang[bangIndex].x, this.xbang[bangIndex].pbk, this.xbang[j].x, this.xbang[j].pbk); + if (this.xbang[bangIndex].pbg > this.xbang[bangIndex].pbk) + { + if (jjy < this.xbang[bangIndex].pbk && jjy < 50) { jjy = 0; } + } + if (this.xbang[bangIndex].pbk > this.xbang[bangIndex].pbg) + { + if (jjx < this.xbang[bangIndex].pbg && jjx < 50) { jjx = 0; } + } + if (jjy > 0 && this.xbang[bangIndex].x > this.xbang[j].x + this.xbang[j].pbk) { left = 1; } + if (jjy > 0 && this.xbang[j].x > this.xbang[bangIndex].x + this.xbang[bangIndex].pbk) { right = 1; } + if (jjx > 0 && this.xbang[bangIndex].y > this.xbang[j].y + this.xbang[j].pbg) { down = 1; } + if (jjx > 0 && this.xbang[j].y > this.xbang[bangIndex].y + this.xbang[bangIndex].pbg) { top = 1; } + if ((left == 1 && right == 1) || (down == 1 && top == 1)) { qz = 1; } + } + } + return [left + right + top + down + qz, left, right, top, down, qz]; + }; + Jcsb = (bangid1: number, bangid2: number): boolean => // 把bang1 要去掉, bang2 是否少边 返加True 有少边 False 没有少边 + { + let xj = this.XJcd(bangid1, bangid2); + let jjx = xj[0]; let jjy = xj[1]; + + + if (jjx > 0 && this.xbang[this.getID(bangid1)].pbg < this.xbang[this.getID(bangid2)].pbg) + { + return true; + } + else if (jjx > 0 && jjx > 0 && this.xbang[this.getID(bangid1)].pbk * this.xbang[this.getID(bangid1)].pbg < this.xbang[this.getID(bangid2)].pbk * this.xbang[this.getID(bangid2)].pbg) + { + return false; + } + else if (jjy > 0 && this.xbang[this.getID(bangid1)].pbg < this.xbang[this.getID(bangid2)].pbg) + { + return false; + } + else if (jjy > 0 && this.xbang[this.getID(bangid1)].pbg > this.xbang[this.getID(bangid2)].pbg) + { + return true; + } + // else if (jjy > 0 && this.xbang[this.getID(bangid2)].pbk > this.xbang[this.getID(bangid2)].pbg + // && this.xbang[this.getID(bangid2)].pbk * this.xbang[this.getID(bangid2)].pbg < this.xbang[this.getID(bangid1)].pbk * this.xbang[this.getID(bangid1)].pbg) + // { + // return true; + // } + else + { + return false; + } + + + + // if (bangid1 == 2 && bangid2 == 10) + // { + // console.log(bangid1); + // } + // let bs1 = this.JSgbsl(bangid1)[0]; + // let bs2 = this.JSgbsl(bangid2)[0]; + // let sb2 = this.is_sb(bangid1, bangid2)[0]; + // let sb1 = this.is_sb(bangid2, bangid1)[0]; + + // if (sb2 < bs1 && sb1 < bs2) + // { + // return true; + // } + // else + // { + // return false; + // } + + }; + + //检测所有会让其它板少条且最小的的板 + JS_sb_minmz = (): number => + { + let Bangidzh = this.Find_BS(); + if (Bangidzh[0] != 0) + { + let tempbang: YH_bang[] = []; + for (let m = 0; m < Bangidzh.length; m++) + { + tempbang.push(this.xbang[this.getID(Bangidzh[m])]); + } + if (tempbang.length > 0) + { + tempbang.sort((a, b) => a.pbg * a.pbk - b.pbg * b.pbk); + return tempbang[0].bangid; + } + else if (tempbang.length == 1) + { + return tempbang[0].bangid; + } + else + { + return -1; + } + } + else + { + return -1; + } + }; + //合并所有的板 + HB_b = () => + { + let jshb_lr: boolean = true; + let jshb_td: boolean = true; + let jshb: boolean; + for (let i = 0; i < this.xbang.length; i++) + { + if (this.xbang[i].ishb == false) { jshb = true; } else { jshb = false; } + while (jshb == true) + { + if (this.xbang[i].pbg > this.xbang[i].pbk && this.xbang[i].pbk > 100) //左右 + { + jshb_lr = this.HB_LR(this.xbang[i].bangid, false); + } + else + { + jshb_lr = false; + } + + if ((this.xbang[i].pbg < this.xbang[i].pbk && this.xbang[i].pbg > 100)) //上下合并 + { + jshb_td = this.HB_TD(this.xbang[i].bangid, false); + } + else + { + jshb_td = false; + } + if (jshb_lr == true || jshb_td == true) + { + jshb = true; + } + else if (jshb_lr == false || jshb_td == false) + { + if ((this.xbang[i].pbg > 100 && this.xbang[i].pbk > 100)) //上下合并 + { + jshb_lr = this.HB_LR(this.xbang[i].bangid, false); + jshb_td = this.HB_TD(this.xbang[i].bangid, false); + if (jshb_lr == true || jshb_td == true) { jshb = true; } else { jshb = false; } + } + else + { + jshb = false; + } + } + else + { + jshb = true; + } + } + if (this.HB_bang.length > 0) + { + this.HB.push(this.HB_bang); + this.HB_bang = []; + } + } + }; + + //合并指定的板 第一步 + HB_Max_bang = (Bangid: number) => + { + if (Bangid > 0) + { + let jshb_lr: boolean = true; + let jshb_td: boolean = true; + let jshb: boolean; + let bangid = this.getID(Bangid); + if (this.xbang[bangid].ishb == false) { jshb = true; } else { jshb = false; } + while (jshb == true) + { + if (this.xbang[bangid].pbg > this.xbang[bangid].pbk && this.xbang[bangid].pbk > 100) //左右 + { + jshb_lr = this.HB_LR(this.xbang[bangid].bangid, false); + } + else + { + jshb_lr = false; + } + + if ((this.xbang[bangid].pbg < this.xbang[bangid].pbk && this.xbang[bangid].pbg > 100)) //上下合并 + { + jshb_td = this.HB_TD(this.xbang[bangid].bangid, false); + } + else + { + jshb_td = false; + } + if (jshb_lr == true || jshb_td == true) + { + jshb = true; + } + else if (jshb_lr == false || jshb_td == false) + { + if ((this.xbang[bangid].pbg > 100 && this.xbang[bangid].pbk > 100)) //上下合并 + { + jshb_lr = this.HB_LR(this.xbang[bangid].bangid, false); + jshb_td = this.HB_TD(this.xbang[bangid].bangid, false); + if (jshb_lr == true || jshb_td == true) { jshb = true; } else { jshb = false; } + } + else + { + jshb = false; + } + } + else + { + jshb = true; + } + } + if (this.HB_bang.length > 0) + { + this.HB.push(this.HB_bang); + this.HB_bang = []; + } + else + { + this.HB.push([Bangid]); + this.xbang[bangid].ishb = true; + } + } + }; + + + //合并上面的大板 cd为共边长度 + HB_top = (bangid: number, cd: number) => + { + let hbbang: number[] = []; + let fid: number = bangid; + while (fid > -1) + { + fid = this.F_Top_Big(fid, cd); + if (fid > -1) + { + this.xbang[this.getID(fid)].ishb = true; + hbbang.push(fid); + //this.printstr(fid, 1, "大合", -30, 80, 50); + } + } + if (hbbang.length > 0) { this.HB.push(hbbang); } + }; + //合并下面的大板 cd为共边长度 + HB_down = (bangid: number, cd: number) => + { + let hbbang: number[] = []; + let fid: number = bangid; + while (fid > -1) + { + fid = this.F_Down_Big(fid, cd); + if (fid > -1) + { + this.xbang[this.getID(fid)].ishb = true; + hbbang.push(fid); + // this.printstr(fid, 1, "大合", 10, 80, 50); + } + } + if (hbbang.length > 0) { this.HB.push(hbbang); } + }; + + //寻找最后一块要切割的板 + F_last_mz = (jlID: number): number => + { + let bangid: number; + let temp: number[]; + let index: number = 1; + let lastId: number; + if (jlID == 0) { lastId = this.F_minMZ(); } else { lastId = jlID; } + while (true) + { + if (lastId == -1) { break; } + bangid = this.JS_sb_Bxl(lastId); //检测所有会让其它板少条且有两块或者多块边相邻的板 + if (bangid > -1) + { this.add_last(bangid, index); index++; lastId = bangid; } + else + { + bangid = this.JS_sb_minmz(); //检测所有会让其它板少条且最小的的板 + if (bangid > -1) + { this.add_last(bangid, index); index++; lastId = bangid; } + else + { + if (lastId == -1) { break; } + bangid = this.F_minJL(lastId); + if (bangid > -1) { this.add_last(bangid, index); index++; lastId = bangid; } + else + { + bangid = this.F_minMZ(); //找到面积最小的板 + this.add_last(bangid, index); + index++; + lastId = bangid; + } + } + } + // bangid = this.F_minJL(bangid); + //if (bangid > -1) { this.add_last(bangid, index); index++; } + + temp = this.Find_BS(); + + if (temp[0] == 0) + { + break; + } + } + return index; + + }; + + + //寻找最后一块要切割的板 + F_last_jl = (jlID: number): number => + { + let bangid: number; + let temp: number[]; + let index: number = 1; + let lastId: number; + if (jlID == 0) { lastId = this.F_minMZ(); } else { lastId = jlID; } + let tempend: boolean = false; + while (true) + { + if (lastId == -1) { break; } + bangid = this.JS_sb_Bxl(lastId); //检测所有会让其它板少条且有两块或者多块边相邻的板 + if (bangid > -1) + { this.add_last(bangid, index); index++; lastId = bangid; } + else + { + if (lastId == -1) { break; } + bangid = this.F_minJL(lastId); + if (bangid > -1) + { this.add_last(bangid, index); index++; lastId = bangid; } + else + { + //bangid = this.F_minMZ(); //找到面积最小的板 + // if (lastId == -1) { break; } + // bangid = this.F_minJL(lastId); + bangid = this.JS_sb_minmz(); //检测所有会让其它板少条且最小的的板 + + if (bangid > -1) { this.add_last(bangid, index); index++; lastId = bangid; } + else + { + bangid = this.F_minMZ(); //找到面积最小的板 + this.add_last(bangid, index); + index++; + lastId = bangid; + } + } + } + // bangid = this.F_minJL(bangid); + //if (bangid > -1) { this.add_last(bangid, index); index++; } + + temp = this.Find_BS(); + + if (temp[0] == 0) + { + break; + } + + } + return index; + + }; + + //打印并添加最后一块 + add_last = (bangid: number, index: number) => + { + let tempx: number; + //if (index > 9) { tempx = 27; } else { tempx = 10; } 这两行用于测试打印 + //this.printstr(bangid, 1, index.toString(), this.xbang[this.getID(bangid)].pbk / 2 - tempx, this.xbang[this.getID(bangid)].pbg / 2 - 20, 50); + this.SCid.push(bangid); + this.xbang[this.getID(bangid)].isqg = true; + let tempid = this.xbang[this.getID(bangid)].grid; + if (this.xbang[this.getID(bangid)].grid > -1) + { + let tempin = this.xbang[this.getID(tempid)].gr!.findIndex((n) => n == bangid); + if (tempin > -1) + { + this.xbang[this.getID(tempid)].gr!.splice(tempin, 1); + if (this.xbang[this.getID(tempid)].gr!.length == 0) { this.xbang[this.getID(tempid)].isgr = false; } + } + } + }; + + //找到面积最小的板 + F_minMZ = (): number => + { + let jhb = this.Find_BS(); + if (jhb[0] != 0) + { + let tempBang: YH_bang[] = []; + if (jhb.length == 1) + { + return jhb[0]; + } + else + { + for (let i = 0; i < jhb.length; i++) + { + tempBang.push(this.xbang[this.getID(jhb[i])]); + } + tempBang = tempBang.sort((a, b) => + { + if (a.pbg * a.pbk == b.pbg * b.pbk) + { + return Math.hypot(this.B_k - a.x - a.pbk / 2, this.B_g - a.y - a.pbg / 2) - Math.hypot(this.B_k - b.x - b.pbk / 2, this.B_g - b.y - b.pbg / 2); + } + else + { + return a.pbg * a.pbk - b.pbg * b.pbk ? -1 : 1; + } + }); + + return tempBang[0].bangid; + } + } + else + { + return -1; + } + }; + + //按位置最近排序 + F_minJL = (bangid: number): number => + { + let jhb = this.Find_BS(); + // if (jhb.length[0] != 0) // 判断有误 + // { + let tempBang: YH_bang[] = []; + if (jhb.length > 0) + { + for (let i = 0; i < jhb.length; i++) + { + tempBang.push(this.xbang[this.getID(jhb[i])]); + } + let wzx = this.xbang[this.getID(bangid)].x + this.xbang[this.getID(bangid)].pbk / 2; + let wzy = this.xbang[this.getID(bangid)].y + this.xbang[this.getID(bangid)].pbg / 2; + tempBang.sort((a, b) => a.pbk * a.pbg - b.pbk * b.pbg); + if (tempBang[tempBang.length - 1].pbg * tempBang[tempBang.length - 1].pbk / 1000000 - tempBang[0].pbg * tempBang[0].pbk / 1000000 > 0.2) + { + return tempBang[0].bangid; + } + else + { + tempBang.sort((a, b) => Math.hypot(wzx - a.x - a.pbk / 2, wzy - a.y - a.pbg / 2) - Math.hypot(wzx - b.x - b.pbk / 2, wzy - b.y - b.pbg / 2)); + return tempBang[0].bangid; + } + } + else if (jhb.length == 1) + { + return jhb[0]; + } + else + { + return -1; + } + // } + // else + // { + // return -1; + // } + }; + //检测所有会让其它板少条且有两块或者多块边相邻的板 + JS_sb_Bxl = (bangid: number): number => + { + let Bangidzh = this.Find_BS(); + if (Bangidzh[0] != 0) + { + let tempbang: YH_bang[] = []; + let tempxj: YH_bang[] = []; + let temp: YH_bang; + for (let m = 0; m < Bangidzh.length; m++) + { + for (let n = 0; n < Bangidzh.length; n++) + { + if (m != n) + { + if (this.Jcsb(Bangidzh[m], Bangidzh[n]) == true) + { + tempbang.push(this.xbang[this.getID(Bangidzh[m])]); + } + } + } + } + if (tempbang.length == 1) + { + return tempbang[0].bangid; + } + else if (tempbang.length == 0) + { + return -1; + } + else //(tempbang.length > 1); + { + let wzx = this.xbang[this.getID(bangid)].x + this.xbang[this.getID(bangid)].pbk / 2; + let wzy = this.xbang[this.getID(bangid)].y + this.xbang[this.getID(bangid)].pbg / 2; + tempbang.sort((a, b) => Math.hypot(wzx - a.x - a.pbk / 2, wzy - a.y - a.pbg / 2) - Math.hypot(wzx - b.x - b.pbk / 2, wzy - b.y - b.pbg / 2)); + return tempbang[0].bangid; + + } + } + else + { + return -1; + } + + }; + + //用于计算下刀顺序 + XDscjs = () => + { + let bangid = this.MaxMZ(0.05); + this.HB_Max_bang(bangid); + this.HB_top(bangid, 200); + this.HB_down(bangid, 200); + this.F_GL_LR(); + this.F_GL_TD(); + this.Is_big_gr(); + this.F_GL_JJB(); + + let index: number; + + if (this.jl_mz == 1) + { + index = this.F_last_jl(0); + } else + { + index = this.F_last_mz(0); + } + this.printHBCS(index); + + + }; + printHBCS = (index: number) => + { + for (let m = this.HB.length - 1; m >= 0; m--) + { + for (let n = this.HB[m].length - 1; n >= 0; n--) + { + //this.printstr(this.HB[m][n], 1, index.toString(), this.Bakbang[this.getID_Bkb(this.HB[m][n])].pbk / 2, this.Bakbang[this.getID_Bkb(this.HB[m][n])].pbg / 2, 50); + this.SCid.push(this.HB[m][n]); + index++; + }; + } + }; +}; + + + +function equaln(v1: number, v2: number, fuzz = 1e-5) +{ + return Math.abs(v1 - v2) <= fuzz; +} + +export interface YH_bang +{ + bangid: number; + line: number ; + x: number; + y: number; + /** + * 排板高 + */ + pbg: number; + /** + * 排板高 + */ + pbk: number; + /**是否参与合并的板*/ + ishb?: boolean; + /**合在并的板 */ + hb?: number[]; + /**是否关连 */ + isgr?: boolean; //是否关连 + /**关联的板的集合 */ + gr?: number[]; + /**跟别的板关联的ID */ + grid: number; + /**是否为合并的大板 */ + isbig?: boolean; + /**是否被切掉的板 */ + isqg?: boolean; + +} diff --git a/src/modules/rect-layout/RectOptimizeMachine.ts b/src/modules/rect-layout/RectOptimizeMachine.ts new file mode 100644 index 0000000..d841ee8 --- /dev/null +++ b/src/modules/rect-layout/RectOptimizeMachine.ts @@ -0,0 +1,1993 @@ + +import { WaveType } from "cut-abstractions"; +import {type Big_bang,type Con, type Inv, type xbang } from "./bang"; +import { arrayLast, arrayMax, Sleep } from "./utils"; + +type RectLayoutCallback = (best: Inv, yl: Big_bang[], fit: number) => void | Promise + +export class RectOptimizeMachine +{ + private _Stop = false; + /** + * + */ + constructor(callback:RectLayoutCallback) { + this.CallBak = callback; + } + + public CallBak:RectLayoutCallback; + + Stop() { this._Stop = true; } + + /** + * @param xbangs 小板 + * @param bigBang 大板 + * @param xyhcs 小优化次数 + */ + + async Start(xbangs: xbang[], bigBang: Big_bang[], Bigbangsl: number[], xyhcs: number, isdtwosided: boolean, gap: number, hssf: boolean, YuLiaoBoardDo2FaceBlock: boolean) + { + this._Stop = false; + + + let besetFit = Infinity;//最佳的利用率 35*10 + 最后一张板 + let bestInv: Inv; + + let i = 0; + while (!this._Stop) + { + let qfsh = i % 2 === 0; + if (hssf) qfsh = false; //电子锯算法, 永远不合并空间 + let [inv, re_ylb] = SnameYH(xbangs.slice(), bigBang, Bigbangsl, xyhcs, qfsh, isdtwosided, gap, YuLiaoBoardDo2FaceBlock); + let fit = GetInvFit(inv); + if (fit < besetFit) + { + besetFit = fit; + bestInv = inv; + + console.log(`新优化 ${i} 次,得到更优解 ${Math.floor(fit / 10) + 1}张板,最后一张利用率${fit - (Math.floor(fit / 10) * 10)}`); + + this.CallBak(inv, re_ylb, fit); + } + + if ((i % 50) == 0) { + // console.log(i); + } + + if (globalThis.document) + await Sleep(0); + i++; + } + + } +} +//优化所有余料 +function YLYH_all(xbangs: xbang[], yuliao_bang: Big_bang[], ylzs: number[], xyhcs: number, qfsh: boolean, isdtwosided: boolean, gap: number, YuLiaoBoardDo2FaceBlock: boolean): [Inv, xbang[], Big_bang[]] //余料优化 +{ + let get_regelt: Inv = []; + let temp_yan_bang: Big_bang[] = []; + let re_Bigbang: Big_bang[] = []; + temp_yan_bang = []; + for (let i = 0; i < ylzs.length; i++) + { + if (xbangs.length == 0) + { + break; + } + else + { + temp_yan_bang = []; + for (let sl = 0; sl < ylzs[i]; sl++) + { + temp_yan_bang.push(yuliao_bang[i]); + } + let temp = []; + temp = ylyh(xbangs, temp_yan_bang, xyhcs, qfsh, isdtwosided, gap, YuLiaoBoardDo2FaceBlock); + for (let yhsl = 0; yhsl < temp[0].length; yhsl++) + { + get_regelt.push(temp[0][yhsl]); + } + for (let ylsl = 0; ylsl < temp[2].length; ylsl++) + { + re_Bigbang.push(temp[2][ylsl]); + } + xbangs = temp[1].slice(); + //re_Bigbang.push(temp[2].slice()); + } + } + return [get_regelt, xbangs, re_Bigbang]; +} +//优化余料中的一个尺寸的小板 +function ylyh(xbangs: xbang[], yuliao_bang: Big_bang[], xyhcs: number, qfsh: boolean, isdtwosided: boolean, gap: number, YuLiaoBoardDo2FaceBlock: boolean): [Inv, xbang[], Big_bang[]] //余料优化 +{ + let finbang: xbang[]; + let yh_result: Inv = []; + let l: number; + let w: number; + let ylzs: number;//余料张数 + let temp_yan_bang: Big_bang[] = []; + let re_yan_bang: Big_bang[] = []; + let temp_max_YH: Inv = []; + temp_yan_bang = []; + temp_yan_bang.push(yuliao_bang[0]); + l = yuliao_bang[0].l; + w = yuliao_bang[0].w; + + if (YuLiaoBoardDo2FaceBlock) //余料板允许加入双面小板 + { + finbang = find_bang_k_g(l, w, xbangs, false).slice(); + } + else + { + finbang = find_bang_k_g(l, w, xbangs, true).slice(); + } + + if (finbang.length > 0) + { + if (YuLiaoBoardDo2FaceBlock) //余料板允许加入双面小板 + { + temp_max_YH = YHJS(finbang, temp_yan_bang, xyhcs, qfsh, isdtwosided, gap); //余料板 不优先 双面加工板 + + } + else + { + temp_max_YH = YHJS(finbang, temp_yan_bang, xyhcs, qfsh, false, gap); + } + + + if (yuliao_bang.length > temp_max_YH.length) + { + ylzs = temp_max_YH.length; + } + else + { + ylzs = yuliao_bang.length; + } + for (let i = 0; i < ylzs; i++) + { + yh_result.push(temp_max_YH[i]); + re_yan_bang.push(yuliao_bang[0]); + for (let n = 0; n < temp_max_YH[i].length; n++) + { + for (let bsl = xbangs.length - 1; bsl >= 0; bsl--) + if (temp_max_YH[i][n].bangid == xbangs[bsl].id) + { + xbangs.splice(bsl, 1); + } + } + } + } + return [yh_result, xbangs, re_yan_bang]; +} +//相同板材优化 +function SnameYH(xbangs: xbang[], B_bang: Big_bang[], ylsl: number[], xyhcs: number, qfsh: boolean, isdtwosided: boolean, gap: number, YuLiaoBoardDo2FaceBlock: boolean): [Inv, Big_bang[]] +{ + let same_yh_bang: Inv = []; + let temp_max_YH: Inv = []; + let ylbang_max_yh: Big_bang[] = []; + let temp_same_yh: [Inv, xbang[]]; + let isend: boolean = false; + let Bigbang: Big_bang[] = []; + Bigbang.push(B_bang[B_bang.length - 1]); + + let ylbang: Big_bang[] = B_bang.slice(); + ylbang.pop(); + + let tempresult = []; + tempresult = YLYH_all(xbangs, ylbang, ylsl, xyhcs, qfsh, isdtwosided, gap, YuLiaoBoardDo2FaceBlock); //余料优化 + for (let i = 0; i < tempresult[0].length; i++) + { + same_yh_bang.push(tempresult[0][i]); + } + xbangs = tempresult[1].slice(); + ylbang_max_yh = tempresult[2].slice(); + + + while (isend === false) + { + if (xbangs.length == 0) { break; } + temp_max_YH = YHJS(xbangs, Bigbang, xyhcs, qfsh, isdtwosided, gap); + temp_same_yh = Get_bs_bang(temp_max_YH, xbangs, isdtwosided); + for (let i = 0; i < temp_same_yh[0].length; i++) + { + same_yh_bang.push(temp_same_yh[0][i]); + xbangs = temp_same_yh[1].slice(); + } + } + return [same_yh_bang, ylbang_max_yh]; +} + +//优化计算. +function YHJS(xbangs: xbang[], B_bang: Big_bang[], cs: number, qfsh: boolean, isdtwosided: boolean, gap: number): Inv +{ + let xbangs_bak = xbangs.slice(); + let bestFit = Infinity; + let bestInv: Inv = []; + for (let i = 0; i < cs; i++) + { + xbangs = xbangs_bak.slice(); + + let result_yh: Inv; + if (qfsh) + result_yh = CBJS(xbangs, B_bang, gap, isdtwosided); + else + result_yh = CBJS1(xbangs, B_bang, gap, isdtwosided); + + let fit = GetInvFit(result_yh); + if (fit < bestFit) + { + bestFit = fit; + bestInv = result_yh; + } + } + return bestInv; +} + +//得到利用率最高板材,及返回倍数板及剩下的小板 +function Get_bs_bang(inv: Inv, listbang: xbang[], isdtwosided: boolean): [Inv, xbang[]] +{ + let [bestCon] = arrayMax(inv, GetConFit);//最优大板 + + + + let temp_yh_bang: Con = []; + let temp_list_yh_bang: Inv = []; + let isfindend: boolean = false; + + while (isfindend == false) + { + if (listbang.length == 0) { break; } + + let unPlacelist = listbang.slice(); + for (let br of bestCon) + { + let temp_result = find_same_bang(br.pbg, br.pbk, unPlacelist, isdtwosided); + if (temp_result.findid > -1) //找到合适的板 + { + temp_yh_bang.push( + { + bangid: temp_result.id, + line: temp_result.line, + x: br.x, + y: br.y, + pbg: temp_result.pbg, + pbk: temp_result.pbk, + } + ); + unPlacelist.splice(temp_result.findid, 1);//这里不会错误的原因是 必然会有一次成功 并且下面会备份这个数组 + } + else //没找到 合适的板 退出 + { + isfindend = true; + break; + } + } + if (isfindend == false) //找到合适的 + { + temp_list_yh_bang.push(temp_yh_bang); + temp_yh_bang = []; + listbang = unPlacelist.slice();//备份数组 + } + } + return [temp_list_yh_bang, listbang]; +} + +function GetInvFit(inv: Inv) +{ + let fit = (inv.length - 1) * 10; + fit += GetConFit(arrayLast(inv)); + return fit; +} + +function GetConFit(con: Con) +{ + let fit = 0; + for (let p of con) + fit += p.pbg * p.pbk * 1e-6; + return fit; +} + +//初步优化计算 横竖算法,无空间合并 +function CBJS1(Listbang: xbang[], yanbang: Big_bang[], dt: number, isdtwosided: boolean): Inv //[(YHB_LST)[], (Big_bang[])[], (Big_bang[])[]] +{ + let yanbang_bk: Big_bang[] = yanbang.slice(); + // let zfkj: Big_bang[] = []; + // let list_zfkj: (Big_bang[])[] = []; + let list_yh_bng: Inv = []; + // let list_yang_bang: (Big_bang[])[] = []; + let result_yh: Con = []; + + while (Listbang.length > 0) + { + // zfkj = []; + yanbang = yanbang_bk.slice(); + result_yh = []; + while (yanbang.length > 0) + { + let lx: number = Math.floor(Math.random() * 3); //lx:0 面积最大 1 最高 2 最宽 + let fs: boolean; //fs:留板方式,0:左右 1:上下 + if (Math.floor(Math.random() * 2) == 0) { fs = false; } else { fs = true; } + let get_result = []; + get_result = jsyb(yanbang[0], lx, fs, dt, Listbang, isdtwosided); //lx:0面积最大 1最高 2最宽 fs:取板方式,false:左右(取同宽) true:上下(取同高) dt:刀头间隙 + yanbang.shift(); + if (get_result[0] > 0) + { + for (let i = 0; i < get_result[0]; i++) + yanbang.push(get_result[2][i]); + } + if (get_result[1] > 0) + { + for (let i = 0; i < get_result[1]; i++) + result_yh.push(get_result[3][i]); + } + Listbang = get_result[4].slice(); + if (Listbang.length == 0) { break; } + } + //list_zfkj.push(zfkj); + list_yh_bng.push(result_yh); + //list_yang_bang.push(yanbang); + //list_zfkj.push(zfkj); + // Draw_Yan_bang(yanbang, 3, 0); + // Draw_Yan_bang(zfkj, 5, 0); + } + + //return [list_yh_bng, list_zfkj, list_yang_bang]; + return list_yh_bng; + +} + +//初步优化计算 交叉算法,有空间合并 +function CBJS(Listbang: xbang[], yanbang: Big_bang[], dt: number, isdtwosided: boolean): Inv //[(YHB_LST)[], (Big_bang[])[], (Big_bang[])[]] +{ + let yanbang_bk: Big_bang[] = yanbang.slice(); + // let zfkj: Big_bang[] = []; + // let list_zfkj: (Big_bang[])[] = []; + let list_yh_bng: Inv = []; + // let list_yang_bang: (Big_bang[])[] = []; + let result_yh: Con = []; + + //let temp: number = 0; + while (Listbang.length > 0)//while (temp < 2)// + { + //temp++; + // zfkj = []; + yanbang = yanbang_bk.slice(); + result_yh = []; + while (yanbang.length > 0) + { + let lx: number = Math.floor(Math.random() * 3); //lx:0 面积最大 1 最高 2 最宽 + let fs: boolean; //fs:留板方式,0:左右 1:上下 + if (Math.floor(Math.random() * 2) == 0) { fs = false; } else { fs = true; } + let get_result = []; + let temp_yanbang = []; + temp_yanbang = HBKJ(yanbang, Listbang, dt); + yanbang = temp_yanbang[0]; + get_result = jsyb1(yanbang[temp_yanbang[1]], lx, fs, dt, Listbang, isdtwosided); //lx:0面积最大 1最高 2最宽 fs:取板方式,false:取同宽) true:取同高) dt:刀头间隙 + yanbang.splice(temp_yanbang[1], 1); + if (get_result[0] > 0) + { + for (let i = 0; i < get_result[0]; i++) + yanbang.push(get_result[2][i]); + } + if (get_result[1] > 0) + { + for (let i = 0; i < get_result[1]; i++) + result_yh.push(get_result[3][i]); + } + Listbang = get_result[4].slice(); + if (Listbang.length == 0) { break; } + } + //list_zfkj.push(zfkj); + list_yh_bng.push(result_yh); + //list_yang_bang.push(yanbang); + //list_zfkj.push(zfkj); + // Draw_Yan_bang(yanbang, 3, 0); + // Draw_Yan_bang(zfkj, 5, 0); + } + + //return [list_yh_bng, list_zfkj, list_yang_bang]; + return list_yh_bng; + +} + +//空间合并(相加) +function hb(yanbang: Big_bang[], dt: number): Big_bang[] +{ + let i: number = -1; + yanbang.sort((a1, a2) => a1.x - a2.x); + while (true) + { + i++; + + if (yanbang.length < 2 || i === yanbang.length - 1) break; + + if (yanbang[i].y === yanbang[i + 1].y + && yanbang[i].x + yanbang[i].w + dt === yanbang[i + 1].x + && yanbang[i].l === yanbang[i + 1].l) + { + yanbang[i].w = yanbang[i].w + yanbang[i + 1].w + dt; + yanbang.splice(i + 1, 1); + i = -1; + } + } + return yanbang; +} + +//整理空间 +function zlkj(yanbang: Big_bang[], listbang: xbang[], dt: number): [Big_bang[], boolean] //false 继续合并 ture 不在合并 +{ + let k: number; + let g: number; + let isjshb: boolean = true;//false 继续合并 ture 不在合并 + let minY: number = 100000; + let yanindex: number = -1; + if (listbang.length == 0) + return [yanbang, true]; + + for (let i = 0; i < yanbang.length; i++) + { + if (yanbang[i].y < minY) + { + minY = yanbang[i].y; + yanindex = i; + } + } + k = yanbang[yanindex].w; + g = yanbang[yanindex].l; + if (yanindex == 0 && yanbang.length > 1) + { + if (yanbang[yanindex].x + yanbang[yanindex].w + dt == yanbang[yanindex + 1].x)// && yanbang[i].y + yanbang[i].l == yanbang[i + 1].y + yanbang[i + 1].l) + { + if (find_max_mz(g, k, listbang, false).findid == -1) + { + yanbang[yanindex].y = yanbang[yanindex + 1].y; + yanbang[yanindex].l = yanbang[yanindex + 1].l; + isjshb = false; + } + } + } + else if (yanindex == yanbang.length - 1 && yanbang.length > 1) + { + if (yanbang[yanindex - 1].x + yanbang[yanindex - 1].w + dt == yanbang[yanindex].x && yanbang.length > 1)//&& yanbang[i].y + yanbang[i].l == yanbang[i - 1].y + yanbang[i - 1].l && (yanbang[i - 1].x + yanbang[i - 1].w + dt == yanbang[i].x)) + { + if (find_max_mz(g, k, listbang, false).findid == -1) + { + yanbang[yanindex].y = yanbang[yanindex - 1].y; + yanbang[yanindex].l = yanbang[yanindex - 1].l; + isjshb = false; + } + } + } + else if (yanbang.length > 1) + { + if (yanbang[yanindex - 1].y > yanbang[yanindex + 1].y) + { + if (yanbang[yanindex].x + yanbang[yanindex].w + dt == yanbang[yanindex + 1].x)//&& yanbang[i].y + yanbang[i].l == yanbang[i + 1].y + yanbang[i + 1].l) + { + if (find_max_mz(g, k, listbang, false).findid == -1) + { + yanbang[yanindex].y = yanbang[yanindex + 1].y; + yanbang[yanindex].l = yanbang[yanindex + 1].l; + isjshb = false; + } + + } + } + else + { + if (yanbang[yanindex - 1].x + yanbang[yanindex - 1].w + dt == yanbang[yanindex].x)//&& yanbang.length > 1 && yanbang[i].y + yanbang[i].l == yanbang[i - 1].y + yanbang[i - 1].l && (yanbang[i - 1].x + yanbang[i - 1].w + dt == yanbang[i].x)) + { + if (find_max_mz(g, k, listbang, false).findid == -1) + { + yanbang[yanindex].y = yanbang[yanindex - 1].y; + yanbang[yanindex].l = yanbang[yanindex - 1].l; + isjshb = false; + } + } + } + + } + // console.log("zlkj"); + // console.log(g, k); + // console.log(yanbang); + // console.log(listbang); + + // Sleep(0); + return [yanbang, isjshb]; +} + +//合并空间 +function HBKJ(yanbang: Big_bang[], listbang: xbang[], dt: number): [Big_bang[], number] +{ + let get_result: Big_bang[]; + let minY: number = 10000; + let yanindex: number =-1; + + get_result = hb(yanbang, dt); + yanbang = get_result; + + let isend: boolean = false; + while (isend == false) + { + if (yanbang.length == 1) { break; } + for (let i = 0; i < yanbang.length; i++) + { + let temp_result = []; + temp_result = zlkj(yanbang, listbang, dt); + if (temp_result[1] == false) + { + yanbang = temp_result[0]; + get_result = hb(yanbang, dt); + yanbang = get_result; + } + else + isend = true; + } + + } + for (let i = 0; i < yanbang.length; i++) + { + if (yanbang[i].y < minY) + { + minY = yanbang[i].y; + yanindex = i; + } + } + return [yanbang, yanindex]; +} + +//寻找符合面积的板 +function find_bang_k_g(g: number, k: number, Listbang: xbang[], oneFaceBlock: boolean): xbang[] //g 高 k 宽 listbang:小板列表 lx:0 面积最大 1 最高 2 最宽 isdtwosided: boolean true 翻板提前 +{ + let finbang: xbang[] = []; + if (oneFaceBlock == true) + { + for (let i = 0; i < Listbang.length; i++) + { + if (Listbang[i].line == 0) + { + if (Listbang[i].l <= g && Listbang[i].w <= k && Listbang[i].isdtwosided == false) + { + finbang.push(Listbang[i]); + } + } + else if (Listbang[i].line == 1) + { + if (Listbang[i].l <= k && Listbang[i].w <= g && Listbang[i].isdtwosided == false) + { + finbang.push(Listbang[i]); + } + } + else + { + if (Listbang[i].l <= g && Listbang[i].w <= k && Listbang[i].isdtwosided == false) + { + finbang.push(Listbang[i]); + } + else if (Listbang[i].l <= k && Listbang[i].w <= g && Listbang[i].isdtwosided == false) + { + finbang.push(Listbang[i]); + } + } + } + } + else + { + for (let i = 0; i < Listbang.length; i++) + { + if (Listbang[i].line == 0) + { + if (Listbang[i].l <= g && Listbang[i].w <= k) + { + finbang.push(Listbang[i]); + } + } + else if (Listbang[i].line == 1) + { + if (Listbang[i].l <= k && Listbang[i].w <= g) + { + finbang.push(Listbang[i]); + } + } + else + { + if (Listbang[i].l <= g && Listbang[i].w <= k) + { + finbang.push(Listbang[i]); + } + else if (Listbang[i].l <= k && Listbang[i].w <= g) + { + finbang.push(Listbang[i]); + } + } + } + } + + return finbang; +} //寻找面积最的板 + + + +//寻找面积最大的板 +function find_max_mz(g: number, k: number, Listbang: xbang[], isdtwosided: boolean): findbang //g 高 k 宽 listbang:小板列表 lx:0 面积最大 1 最高 2 最宽 isdtwosided: boolean true 翻板提前 +{ + let max: number = 0; + let bangindex: number = -1; + let line: WaveType = WaveType.Positive; + let pbg: number = 0; + let pbk: number = 0; + let bangid: number = 0; + let temp_max: number; + + if (isdtwosided == true) + { + for (let i = 0; i < Listbang.length; i++) + { + temp_max = Listbang[i].l * Listbang[i].w / 1000000; + if (Listbang[i].line == 0) + { + if (Listbang[i].l <= g && Listbang[i].w <= k && max < temp_max && Listbang[i].isdtwosided == true) + { + max = temp_max; + bangindex = i; + line = 0; + pbg = Listbang[i].l; + pbk = Listbang[i].w; + bangid = Listbang[i].id; + } + } + else if (Listbang[i].line == 1) + { + if (Listbang[i].l <= k && Listbang[i].w <= g && max < temp_max && Listbang[i].isdtwosided == true) + { + max = temp_max; + bangindex = i; + line = 1; + pbg = Listbang[i].w; + pbk = Listbang[i].l; + bangid = Listbang[i].id; + } + } + else + { + if (Listbang[i].l <= g && Listbang[i].w <= k && max < temp_max && Listbang[i].isdtwosided == true) + { + max = temp_max; + bangindex = i; + line = 0; + pbg = Listbang[i].l; + pbk = Listbang[i].w; + bangid = Listbang[i].id; + } + else if (Listbang[i].l <= k && Listbang[i].w <= g && max < temp_max && Listbang[i].isdtwosided == true) + { + max = temp_max; + bangindex = i; + line = 1; + pbg = Listbang[i].w; + pbk = Listbang[i].l; + bangid = Listbang[i].id; + } + } + } + if (bangindex == -1) + { + for (let i = 0; i < Listbang.length; i++) + { + temp_max = Listbang[i].l * Listbang[i].w / 1000000; + if (Listbang[i].line == 0) + { + if (Listbang[i].l <= g && Listbang[i].w <= k && max < temp_max) + { + max = temp_max; + bangindex = i; + line = 0; + pbg = Listbang[i].l; + pbk = Listbang[i].w; + bangid = Listbang[i].id; + } + } + else if (Listbang[i].line == 1) + { + if (Listbang[i].l <= k && Listbang[i].w <= g && max < temp_max) + { + max = temp_max; + bangindex = i; + line = 1; + pbg = Listbang[i].w; + pbk = Listbang[i].l; + bangid = Listbang[i].id; + } + } + else + { + if (Listbang[i].l <= g && Listbang[i].w <= k && max < temp_max) + { + max = temp_max; + bangindex = i; + line = 0; + pbg = Listbang[i].l; + pbk = Listbang[i].w; + bangid = Listbang[i].id; + } + else if (Listbang[i].l <= k && Listbang[i].w <= g && max < temp_max) + { + max = temp_max; + bangindex = i; + line = 1; + pbg = Listbang[i].w; + pbk = Listbang[i].l; + bangid = Listbang[i].id; + } + } + } + } + } + else + { + for (let i = 0; i < Listbang.length; i++) + { + temp_max = Listbang[i].l * Listbang[i].w / 1000000; + if (Listbang[i].line == 0) + { + if (Listbang[i].l <= g && Listbang[i].w <= k && max < temp_max) + { + max = temp_max; + bangindex = i; + line = 0; + pbg = Listbang[i].l; + pbk = Listbang[i].w; + bangid = Listbang[i].id; + } + } + else if (Listbang[i].line == 1) + { + if (Listbang[i].l <= k && Listbang[i].w <= g && max < temp_max) + { + max = temp_max; + bangindex = i; + line = 1; + pbg = Listbang[i].w; + pbk = Listbang[i].l; + bangid = Listbang[i].id; + } + } + else + { + if (Listbang[i].l <= g && Listbang[i].w <= k && max < temp_max) + { + max = temp_max; + bangindex = i; + line = 0; + pbg = Listbang[i].l; + pbk = Listbang[i].w; + bangid = Listbang[i].id; + } + else if (Listbang[i].l <= k && Listbang[i].w <= g && max < temp_max) + { + max = temp_max; + bangindex = i; + line = 1; + pbg = Listbang[i].w; + pbk = Listbang[i].l; + bangid = Listbang[i].id; + } + } + } + } + return { + findid: bangindex, + line, + pbg, + pbk, + id: bangid + }; +} //寻找面积最的板 + + +//寻找最高的板 +function find_max_g(g: number, k: number, Listbang: xbang[], isdtwosided: boolean): findbang //g 高 k 宽 listbang:小板列表 lx:0 面积最大 1 最高 2 最宽 +{ + let max: number = 0; + let bangindex: number = -1; + let line: WaveType = WaveType.Positive; + let pbg: number = 0; + let pbk: number = 0; + let bangid: number = 0; + if (isdtwosided == true) + { + for (let i = 0; i < Listbang.length; i++) + { + if (Listbang[i].line == 0) + { + if (Listbang[i].l <= g && Listbang[i].w <= k && max < Listbang[i].l && Listbang[i].isdtwosided == true) + { + max = Listbang[i].l; + bangindex = i; + line = 0; + pbg = Listbang[i].l; + pbk = Listbang[i].w; + bangid = Listbang[i].id; + } + } + else if (Listbang[i].line == 1) + { + if (Listbang[i].l <= k && Listbang[i].w <= g && max < Listbang[i].w && Listbang[i].isdtwosided == true) + { + max = Listbang[i].w; + bangindex = i; + line = 1; + pbg = Listbang[i].w; + pbk = Listbang[i].l; + bangid = Listbang[i].id; + } + } + else + { + if (Listbang[i].l <= g && Listbang[i].w <= k && max < Listbang[i].l && Listbang[i].isdtwosided == true) + { + max = Listbang[i].l; + bangindex = i; + line = 0; + pbg = Listbang[i].l; + pbk = Listbang[i].w; + bangid = Listbang[i].id; + } + else if (Listbang[i].l <= k && Listbang[i].w <= g && max < Listbang[i].w && Listbang[i].isdtwosided == true) + { + max = Listbang[i].w; + bangindex = i; + line = 1; + pbg = Listbang[i].w; + pbk = Listbang[i].l; + bangid = Listbang[i].id; + } + } + } + if (bangindex == -1) + { + for (let i = 0; i < Listbang.length; i++) + { + if (Listbang[i].line == 0) + { + if (Listbang[i].l <= g && Listbang[i].w <= k && max < Listbang[i].l) + { + max = Listbang[i].l; + bangindex = i; + line = 0; + pbg = Listbang[i].l; + pbk = Listbang[i].w; + bangid = Listbang[i].id; + } + } + else if (Listbang[i].line == 1) + { + if (Listbang[i].l <= k && Listbang[i].w <= g && max < Listbang[i].w) + { + max = Listbang[i].w; + bangindex = i; + line = 1; + pbg = Listbang[i].w; + pbk = Listbang[i].l; + bangid = Listbang[i].id; + } + } + else + { + if (Listbang[i].l <= g && Listbang[i].w <= k && max < Listbang[i].l) + { + max = Listbang[i].l; + bangindex = i; + line = 0; + pbg = Listbang[i].l; + pbk = Listbang[i].w; + bangid = Listbang[i].id; + } + else if (Listbang[i].l <= k && Listbang[i].w <= g && max < Listbang[i].w) + { + max = Listbang[i].w; + bangindex = i; + line = 1; + pbg = Listbang[i].w; + pbk = Listbang[i].l; + bangid = Listbang[i].id; + } + } + } + } + } + else + { + for (let i = 0; i < Listbang.length; i++) + { + if (Listbang[i].line == 0) + { + if (Listbang[i].l <= g && Listbang[i].w <= k && max < Listbang[i].l) + { + max = Listbang[i].l; + bangindex = i; + line = 0; + pbg = Listbang[i].l; + pbk = Listbang[i].w; + bangid = Listbang[i].id; + } + } + else if (Listbang[i].line == 1) + { + if (Listbang[i].l <= k && Listbang[i].w <= g && max < Listbang[i].w) + { + max = Listbang[i].w; + bangindex = i; + line = 1; + pbg = Listbang[i].w; + pbk = Listbang[i].l; + bangid = Listbang[i].id; + } + } + else + { + if (Listbang[i].l <= g && Listbang[i].w <= k && max < Listbang[i].l) + { + max = Listbang[i].l; + bangindex = i; + line = 0; + pbg = Listbang[i].l; + pbk = Listbang[i].w; + bangid = Listbang[i].id; + } + else if (Listbang[i].l <= k && Listbang[i].w <= g && max < Listbang[i].w) + { + max = Listbang[i].w; + bangindex = i; + line = 1; + pbg = Listbang[i].w; + pbk = Listbang[i].l; + bangid = Listbang[i].id; + } + } + } + } + return { + findid: bangindex, + line, + pbg, + pbk, + id: bangid + }; +} + +//寻找同高的板 +function find_same_g(g: number, k: number, Listbang: xbang[], isdtwosided: boolean): findbang //g 高 k 宽 listbang:小板列表 lx:0 面积最大 1 最高 2 最宽 +{ + let max: number = g; + let bangindex: number = -1; + let line: WaveType = WaveType.Positive; + let pbg: number = 0; + let pbk: number = 0; + let bangid: number = 0; + if (isdtwosided == true) + { + for (let i = 0; i < Listbang.length; i++) + { + if (Listbang[i].line == 0) + { + if (Listbang[i].l <= g && Listbang[i].w <= k && max == Listbang[i].l && Listbang[i].isdtwosided == true) + { + bangindex = i; + line = 0; + pbg = Listbang[i].l; + pbk = Listbang[i].w; + bangid = Listbang[i].id; + break; + } + } + else if (Listbang[i].line == 1) + { + if (Listbang[i].l <= k && Listbang[i].w <= g && max == Listbang[i].w && Listbang[i].isdtwosided == true) + { + bangindex = i; + line = 1; + pbg = Listbang[i].w; + pbk = Listbang[i].l; + bangid = Listbang[i].id; + break; + } + } + else + { + if (Listbang[i].l <= g && Listbang[i].w <= k && max == Listbang[i].l && Listbang[i].isdtwosided == true) + { + bangindex = i; + line = 0; + pbg = Listbang[i].l; + pbk = Listbang[i].w; + bangid = Listbang[i].id; + break; + } + else if (Listbang[i].l <= k && Listbang[i].w <= g && max == Listbang[i].w && Listbang[i].isdtwosided == true) + { + bangindex = i; + line = 1; + pbg = Listbang[i].w; + pbk = Listbang[i].l; + bangid = Listbang[i].id; + break; + } + } + } + if (bangindex == -1) + { + for (let i = 0; i < Listbang.length; i++) + { + if (Listbang[i].line == 0) + { + if (Listbang[i].l <= g && Listbang[i].w <= k && max == Listbang[i].l) + { + bangindex = i; + line = 0; + pbg = Listbang[i].l; + pbk = Listbang[i].w; + bangid = Listbang[i].id; + break; + } + } + else if (Listbang[i].line == 1) + { + if (Listbang[i].l <= k && Listbang[i].w <= g && max == Listbang[i].w) + { + bangindex = i; + line = 1; + pbg = Listbang[i].w; + pbk = Listbang[i].l; + bangid = Listbang[i].id; + break; + } + } + else + { + if (Listbang[i].l <= g && Listbang[i].w <= k && max == Listbang[i].l) + { + bangindex = i; + line = 0; + pbg = Listbang[i].l; + pbk = Listbang[i].w; + bangid = Listbang[i].id; + break; + } + else if (Listbang[i].l <= k && Listbang[i].w <= g && max == Listbang[i].w) + { + bangindex = i; + line = 1; + pbg = Listbang[i].w; + pbk = Listbang[i].l; + bangid = Listbang[i].id; + break; + } + } + } + } + } + else + { + for (let i = 0; i < Listbang.length; i++) + { + if (Listbang[i].line == 0) + { + if (Listbang[i].l <= g && Listbang[i].w <= k && max == Listbang[i].l) + { + bangindex = i; + line = 0; + pbg = Listbang[i].l; + pbk = Listbang[i].w; + bangid = Listbang[i].id; + break; + } + } + else if (Listbang[i].line == 1) + { + if (Listbang[i].l <= k && Listbang[i].w <= g && max == Listbang[i].w) + { + bangindex = i; + line = 1; + pbg = Listbang[i].w; + pbk = Listbang[i].l; + bangid = Listbang[i].id; + break; + } + } + else + { + if (Listbang[i].l <= g && Listbang[i].w <= k && max == Listbang[i].l) + { + bangindex = i; + line = 0; + pbg = Listbang[i].l; + pbk = Listbang[i].w; + bangid = Listbang[i].id; + break; + } + else if (Listbang[i].l <= k && Listbang[i].w <= g && max == Listbang[i].w) + { + bangindex = i; + line = 1; + pbg = Listbang[i].w; + pbk = Listbang[i].l; + bangid = Listbang[i].id; + break; + } + } + } + } + return { + findid: bangindex, + line, + pbg, + pbk, + id: bangid + }; +}//寻找同高的板 + + +//寻找最宽的板 +function find_max_k(g: number, k: number, Listbang: xbang[], isdtwosided: boolean): findbang //g 高 k 宽 listbang:小板列表 lx:0 面积最大 1 最高 2 最宽 +{ + let max: number = 0; + let bangindex: number = -1; + let line: WaveType = WaveType.Positive; + let pbg: number = 0; + let pbk: number = 0; + let bangid: number = 0; + if (isdtwosided == true) + { + for (let i = 0; i < Listbang.length; i++) + { + if (Listbang[i].line == 0) + { + if (Listbang[i].l <= g && Listbang[i].w <= k && max < Listbang[i].w && Listbang[i].isdtwosided == true) + { + max = Listbang[i].w; + bangindex = i; + line = 0; + pbg = Listbang[i].l; + pbk = Listbang[i].w; + bangid = Listbang[i].id; + } + } + else if (Listbang[i].line == 1) + { + if (Listbang[i].l <= k && Listbang[i].w <= g && max < Listbang[i].l && Listbang[i].isdtwosided == true) + { + max = Listbang[i].l; + bangindex = i; + line = 1; + pbg = Listbang[i].w; + pbk = Listbang[i].l; + bangid = Listbang[i].id; + } + } + else + { + if (Listbang[i].l <= g && Listbang[i].w <= k && max < Listbang[i].w && Listbang[i].isdtwosided == true) + { + max = Listbang[i].w; + bangindex = i; + line = 0; + pbg = Listbang[i].l; + pbk = Listbang[i].w; + bangid = Listbang[i].id; + } + else if (Listbang[i].l <= k && Listbang[i].w <= g && max < Listbang[i].l && Listbang[i].isdtwosided == true) + { + max = Listbang[i].l; + bangindex = i; + line = 1; + pbg = Listbang[i].w; + pbk = Listbang[i].l; + bangid = Listbang[i].id; + } + } + } + if (bangindex == -1) + { + for (let i = 0; i < Listbang.length; i++) + { + if (Listbang[i].line == 0) + { + if (Listbang[i].l <= g && Listbang[i].w <= k && max < Listbang[i].w) + { + max = Listbang[i].w; + bangindex = i; + line = 0; + pbg = Listbang[i].l; + pbk = Listbang[i].w; + bangid = Listbang[i].id; + } + } + else if (Listbang[i].line == 1) + { + if (Listbang[i].l <= k && Listbang[i].w <= g && max < Listbang[i].l) + { + max = Listbang[i].l; + bangindex = i; + line = 1; + pbg = Listbang[i].w; + pbk = Listbang[i].l; + bangid = Listbang[i].id; + } + } + else + { + if (Listbang[i].l <= g && Listbang[i].w <= k && max < Listbang[i].w) + { + max = Listbang[i].w; + bangindex = i; + line = 0; + pbg = Listbang[i].l; + pbk = Listbang[i].w; + bangid = Listbang[i].id; + } + else if (Listbang[i].l <= k && Listbang[i].w <= g && max < Listbang[i].l) + { + max = Listbang[i].l; + bangindex = i; + line = 1; + pbg = Listbang[i].w; + pbk = Listbang[i].l; + bangid = Listbang[i].id; + } + } + } + } + } + else + { + for (let i = 0; i < Listbang.length; i++) + { + if (Listbang[i].line == 0) + { + if (Listbang[i].l <= g && Listbang[i].w <= k && max < Listbang[i].w) + { + max = Listbang[i].w; + bangindex = i; + line = 0; + pbg = Listbang[i].l; + pbk = Listbang[i].w; + bangid = Listbang[i].id; + } + } + else if (Listbang[i].line == 1) + { + if (Listbang[i].l <= k && Listbang[i].w <= g && max < Listbang[i].l) + { + max = Listbang[i].l; + bangindex = i; + line = 1; + pbg = Listbang[i].w; + pbk = Listbang[i].l; + bangid = Listbang[i].id; + } + } + else + { + if (Listbang[i].l <= g && Listbang[i].w <= k && max < Listbang[i].w) + { + max = Listbang[i].w; + bangindex = i; + line = 0; + pbg = Listbang[i].l; + pbk = Listbang[i].w; + bangid = Listbang[i].id; + } + else if (Listbang[i].l <= k && Listbang[i].w <= g && max < Listbang[i].l) + { + max = Listbang[i].l; + bangindex = i; + line = 1; + pbg = Listbang[i].w; + pbk = Listbang[i].l; + bangid = Listbang[i].id; + } + } + } + } + return { + findid: bangindex, + line, + pbg, + pbk, + id: bangid + }; +} //寻找最高的板 + + +//寻同宽的板 +function find_same_k(g: number, k: number, Listbang: xbang[], isdtwosided: boolean): findbang //g 高 k 宽 listbang:小板列表 lx:0 面积最大 1 最高 2 最宽 +{ + let max: number = k; + let bangindex: number = -1; + let line: WaveType = WaveType.Positive; + let pbg: number = 0; + let pbk: number = 0; + let bangid: number = 0; + if (isdtwosided == true) + { + for (let i = 0; i < Listbang.length; i++) + { + if (Listbang[i].line == 0) + { + if (Listbang[i].l <= g && Listbang[i].w <= k && max == Listbang[i].w && Listbang[i].isdtwosided == true) + { + bangindex = i; + line = 0; + pbg = Listbang[i].l; + pbk = Listbang[i].w; + bangid = Listbang[i].id; + break; + } + } + else if (Listbang[i].line == 1) + { + if (Listbang[i].l <= k && Listbang[i].w <= g && max == Listbang[i].l && Listbang[i].isdtwosided == true) + { + bangindex = i; + line = 1; + pbg = Listbang[i].w; + pbk = Listbang[i].l; + bangid = Listbang[i].id; + break; + } + + } + else + { + if (Listbang[i].l <= g && Listbang[i].w <= k && max == Listbang[i].w && Listbang[i].isdtwosided == true) + { + bangindex = i; + line = 0; + pbg = Listbang[i].l; + pbk = Listbang[i].w; + bangid = Listbang[i].id; + break; + } + else if (Listbang[i].l <= k && Listbang[i].w <= g && max == Listbang[i].l && Listbang[i].isdtwosided == true) + { + bangindex = i; + line = 1; + pbg = Listbang[i].w; + pbk = Listbang[i].l; + bangid = Listbang[i].id; + break; + } + } + } + if (bangindex == -1) + { + for (let i = 0; i < Listbang.length; i++) + { + if (Listbang[i].line == 0) + { + if (Listbang[i].l <= g && Listbang[i].w <= k && max == Listbang[i].w) + { + bangindex = i; + line = 0; + pbg = Listbang[i].l; + pbk = Listbang[i].w; + bangid = Listbang[i].id; + break; + } + } + else if (Listbang[i].line == 1) + { + if (Listbang[i].l <= k && Listbang[i].w <= g && max == Listbang[i].l) + { + bangindex = i; + line = 1; + pbg = Listbang[i].w; + pbk = Listbang[i].l; + bangid = Listbang[i].id; + break; + } + + } + else + { + if (Listbang[i].l <= g && Listbang[i].w <= k && max == Listbang[i].w) + { + bangindex = i; + line = 0; + pbg = Listbang[i].l; + pbk = Listbang[i].w; + bangid = Listbang[i].id; + break; + } + else if (Listbang[i].l <= k && Listbang[i].w <= g && max == Listbang[i].l) + { + bangindex = i; + line = 1; + pbg = Listbang[i].w; + pbk = Listbang[i].l; + bangid = Listbang[i].id; + break; + } + } + } + } + } + else + { + for (let i = 0; i < Listbang.length; i++) + { + if (Listbang[i].line == 0) + { + if (Listbang[i].l <= g && Listbang[i].w <= k && max == Listbang[i].w) + { + bangindex = i; + line = 0; + pbg = Listbang[i].l; + pbk = Listbang[i].w; + bangid = Listbang[i].id; + break; + } + } + else if (Listbang[i].line == 1) + { + if (Listbang[i].l <= k && Listbang[i].w <= g && max == Listbang[i].l) + { + bangindex = i; + line = 1; + pbg = Listbang[i].w; + pbk = Listbang[i].l; + bangid = Listbang[i].id; + break; + } + + } + else + { + if (Listbang[i].l <= g && Listbang[i].w <= k && max == Listbang[i].w) + { + bangindex = i; + line = 0; + pbg = Listbang[i].l; + pbk = Listbang[i].w; + bangid = Listbang[i].id; + break; + } + else if (Listbang[i].l <= k && Listbang[i].w <= g && max == Listbang[i].l) + { + bangindex = i; + line = 1; + pbg = Listbang[i].w; + pbk = Listbang[i].l; + bangid = Listbang[i].id; + break; + } + } + } + } + return { + findid: bangindex, + line, + pbg, + pbk, + id: bangid + }; +} //寻同宽的板 + +//找到同样大小尺寸的板材 && Listbang[i].isdtwosided == true) +function find_same_bang(g: number, k: number, Listbang: xbang[], isdtwosided: boolean): findbang //g 高 k 宽 listbang:小板列表 1 同高 2 同宽 +{ + let bangindex: number = -1; + let line: WaveType = WaveType.Positive; + let pbg: number = 0; + let pbk: number = 0; + let bangid: number = 0; + if (isdtwosided == true) + { + for (let i = 0; i < Listbang.length; i++) + { + if (Listbang[i].line == 0) + { + if (Listbang[i].l == g && Listbang[i].w == k && Listbang[i].isdtwosided == true) + { + bangindex = i; + line = 0; + pbg = Listbang[i].l; + pbk = Listbang[i].w; + bangid = Listbang[i].id; + break; + } + } + else if (Listbang[i].line == 1) + { + if (Listbang[i].l == k && Listbang[i].w == g && Listbang[i].isdtwosided == true) + { + bangindex = i; + line = 1; + pbg = Listbang[i].w; + pbk = Listbang[i].l; + bangid = Listbang[i].id; + break; + } + } + else + { + if (Listbang[i].l == g && Listbang[i].w == k && Listbang[i].isdtwosided == true) + { + bangindex = i; + line = 0; + pbg = Listbang[i].l; + pbk = Listbang[i].w; + bangid = Listbang[i].id; + break; + } + else if (Listbang[i].l == k && Listbang[i].w == g && Listbang[i].isdtwosided == true) + { + bangindex = i; + line = 1; + pbg = Listbang[i].w; + pbk = Listbang[i].l; + bangid = Listbang[i].id; + break; + } + } + } + if (bangindex == -1) + { + for (let i = 0; i < Listbang.length; i++) + { + if (Listbang[i].line == 0) + { + if (Listbang[i].l == g && Listbang[i].w == k) + { + bangindex = i; + line = 0; + pbg = Listbang[i].l; + pbk = Listbang[i].w; + bangid = Listbang[i].id; + break; + } + } + else if (Listbang[i].line == 1) + { + if (Listbang[i].l == k && Listbang[i].w == g) + { + bangindex = i; + line = 1; + pbg = Listbang[i].w; + pbk = Listbang[i].l; + bangid = Listbang[i].id; + break; + } + } + else + { + if (Listbang[i].l == g && Listbang[i].w == k) + { + bangindex = i; + line = 0; + pbg = Listbang[i].l; + pbk = Listbang[i].w; + bangid = Listbang[i].id; + break; + } + else if (Listbang[i].l == k && Listbang[i].w == g) + { + bangindex = i; + line = 1; + pbg = Listbang[i].w; + pbk = Listbang[i].l; + bangid = Listbang[i].id; + break; + } + } + } + } + } + else + { + for (let i = 0; i < Listbang.length; i++) + { + if (Listbang[i].line == 0) + { + if (Listbang[i].l == g && Listbang[i].w == k) + { + bangindex = i; + line = 0; + pbg = Listbang[i].l; + pbk = Listbang[i].w; + bangid = Listbang[i].id; + break; + } + } + else if (Listbang[i].line == 1) + { + if (Listbang[i].l == k && Listbang[i].w == g) + { + bangindex = i; + line = 1; + pbg = Listbang[i].w; + pbk = Listbang[i].l; + bangid = Listbang[i].id; + break; + } + } + else + { + if (Listbang[i].l == g && Listbang[i].w == k) + { + bangindex = i; + line = 0; + pbg = Listbang[i].l; + pbk = Listbang[i].w; + bangid = Listbang[i].id; + break; + } + else if (Listbang[i].l == k && Listbang[i].w == g) + { + bangindex = i; + line = 1; + pbg = Listbang[i].w; + pbk = Listbang[i].l; + bangid = Listbang[i].id; + break; + } + } + } + } + return { + findid: bangindex, + line, + pbg, + pbk, + id: bangid + }; +} //寻找同高或同宽的板 + +//计算生成的余板 返回 余板数组,连带的板 小板数组 +// lx:0面积最大 1最高 2最宽 fs:取板方式,false:左右(取同宽) true:上下(取同高) dt:刀头间隙 +function jsyb(bigbang: Big_bang, lx: number, fs: boolean, dt: number, listbang: xbang[], isdtwosided: boolean): [number, number, Big_bang[], Con, xbang[], number, Big_bang[]] +{ + let x: number = bigbang.x; + let y: number = bigbang.y; + let k: number = bigbang.w; + let g: number = bigbang.l; + let isend: boolean = false; + let ybg: number = g; + let ybk: number = k; + let x1: number = x; + let y1: number = y; + let yb: Big_bang[] = []; //#余板 坐标跟高宽; + let yhxbang: Con = [];//#连带小板的Id,及坐标 + let zfkj: Big_bang[] = []; //作废的空间 + let l: number; + let w: number; + + let get_result: findbang; + let temp_get: findbang; + if (lx === 0) + { + //get_result = find_max_mz(g, k, listbang); + get_result = find_max_mz(g, k, listbang, isdtwosided); + } + else if (lx == 1) + { + //get_result = find_max_g(g, k, listbang); + get_result = find_max_g(g, k, listbang, isdtwosided); + } + else + { + // get_result = find_max_k(g, k, listbang); + get_result = find_max_k(g, k, listbang, isdtwosided); + } + + if (get_result.findid > -1) + { + yhxbang.push({ + bangid: get_result.id, + line: get_result.line, + x: x, + y: y, + pbg: get_result.pbg, + pbk: get_result.pbk, + }); + listbang.splice(get_result.findid, 1); + l = get_result.pbg; + w = get_result.pbk; + if (fs == false) //false:左右(取同宽) true:上下(取同高) + { + ybg = g - l - dt; + y1 = y + l + dt; + while (isend == false) + { + //temp_get = find_same_k(ybg, w, listbang); + temp_get = find_same_k(ybg, w, listbang, isdtwosided); + if (temp_get.findid > -1) + { + yhxbang.push({ + bangid: temp_get.id, + line: temp_get.line, + x: x, + y: y1, + pbg: temp_get.pbg, + pbk: temp_get.pbk, + }); + y1 = y1 + temp_get.pbg + dt; + ybg = ybg - temp_get.pbg - dt; + listbang.splice(temp_get.findid, 1); + } + else + { + if (ybg > 0) + { + yb.push({ + l: ybg, + w: w, + x: x, + y: y1, + }); + } + if (k - w - dt > 0) + { + yb.push({ + l: g, + w: k - w - dt, + x: x + w + dt, + y: y, + }); + } + break; + } + + } + } + else // true:上下(取同高) + { + ybk = k - w - dt; + x1 = x + w + dt; + while (isend == false) + { + temp_get = find_same_g(l, ybk, listbang, isdtwosided); + if (temp_get.findid > -1) + { + yhxbang.push({ + bangid: temp_get.id, + line: temp_get.line, + x: x1, + y: y, + pbg: temp_get.pbg, + pbk: temp_get.pbk, + }); + x1 = x1 + temp_get.pbk + dt; + ybk = ybk - temp_get.pbk - dt; + listbang.splice(temp_get.findid, 1); + } + else + { + if (ybk > 0) + { + yb.push({ + l: l, + w: ybk, + x: x1, + y: y, + }); + } + if (g - l - dt > 0) + { + yb.push({ + l: g - l - dt, + w: k, + x: x, + y: y + l + dt, + }); + } + break; + } + } + + } //false:左右(取同宽) true:上下(取同高) + let ybsl: number = 0; + let yhsl: number = 0; + if (yb.length > 0) { ybsl = yb.length; } + if (yhxbang.length > 0) { yhsl = yhxbang.length; } + return [ybsl, yhsl, yb, yhxbang, listbang, 0, zfkj]; + } + else + { + zfkj.push({ + l: g, + w: k, + x: x, + y: y, + }); + let ybsl: number = 0; + let yhsl: number = 0; + if (yb.length > 0) { ybsl = yb.length; } + if (yhxbang.length > 0) { yhsl = yhxbang.length; } + return [ybsl, yhsl, yb, yhxbang, listbang, 1, zfkj]; + } +} +//计算生成的余板 返回 余板数组,连带的板 小板数组 都是左右分隔空间,后面再来空间合并 +// lx:0面积最大 1最高 2最宽 fs:取板方式,false:取同宽 true:取同高 dt:刀头间隙 +function jsyb1(bigbang: Big_bang, lx: number, fs: boolean, dt: number, listbang: xbang[], isdtwosided: boolean): [number, number, Big_bang[], Con, xbang[], number, Big_bang[]] +{ + let x: number = bigbang.x; + let y: number = bigbang.y; + let k: number = bigbang.w; + let g: number = bigbang.l; + let isend: boolean = false; + let ybg: number = g; + let ybk: number = k; + let x1: number = x; + let y1: number = y; + let yb: Big_bang[] = []; //#余板 坐标跟高宽; + let yhxbang: Con = [];//#连带小板的Id,及坐标 + let zfkj: Big_bang[] = []; //作废的空间 + let l: number; + let w: number; + + let get_result: findbang; + let temp_get: findbang; + if (lx == 0) + { + //get_result = find_max_mz(g, k, listbang); + get_result = find_max_mz(g, k, listbang, isdtwosided); + } + else if (lx == 1) + { + // get_result = find_max_g(g, k, listbang); + get_result = find_max_g(g, k, listbang, isdtwosided); + } + else + { + //get_result = find_max_k(g, k, listbang); + get_result = find_max_k(g, k, listbang, isdtwosided); + } + + if (get_result.findid > -1) + { + yhxbang.push({ + bangid: get_result.id, + line: get_result.line, + x: x, + y: y, + pbg: get_result.pbg, + pbk: get_result.pbk, + }); + listbang.splice(get_result.findid, 1); + ////////////// + l = get_result.pbg; + w = get_result.pbk; + if (fs == false) //false:左右(取同宽) true:上下(取同高) + { + ybg = g - l - dt; + y1 = y + l + dt; + while (isend == false) + { + temp_get = find_same_k(ybg, w, listbang, isdtwosided); + if (temp_get.findid > -1) + { + yhxbang.push({ + bangid: temp_get.id, + line: temp_get.line, + x: x, + y: y1, + pbg: temp_get.pbg, + pbk: temp_get.pbk, + }); + y1 = y1 + temp_get.pbg + dt; + ybg = ybg - temp_get.pbg - dt; + listbang.splice(temp_get.findid, 1); + } + else + { + if (ybg > 0) + { + yb.push({ + l: ybg, + w: w, + x: x, + y: y1, + }); + } + if (k - w - dt > 0) + { + yb.push({ + l: g, + w: k - w - dt, + x: x + w + dt, + y: y, + }); + } + break; + } + + } + } + else // true:上下(取同高) + { + ybk = k - w - dt; + x1 = x + w + dt; + while (isend == false) + { + temp_get = find_same_g(l, ybk, listbang, isdtwosided); + if (temp_get.findid > -1) + { + yhxbang.push({ + bangid: temp_get.id, + line: temp_get.line, + x: x1, + y: y, + pbg: temp_get.pbg, + pbk: temp_get.pbk, + }); + x1 = x1 + temp_get.pbk + dt; + ybk = ybk - temp_get.pbk - dt; + listbang.splice(temp_get.findid, 1); + } + else + { + if (ybk > 0) + { + yb.push({ + l: g, + w: ybk, + x: x1, + y: y, + }); + } + if (g - l - dt > 0) + { + yb.push({ + l: g - l - dt, + w: k - ybk - dt, + x: x, + y: y + l + dt, + }); + } + break; + } + } + + } //false:左右(取同宽) true:上下(取同高) + + //////////////////////////////////////////////////////////////////////////// + + let ybsl: number = 0; + let yhsl: number = 0; + if (yb.length > 0) { ybsl = yb.length; } + if (yhxbang.length > 0) { yhsl = yhxbang.length; } + return [ybsl, yhsl, yb, yhxbang, listbang, 0, zfkj]; + } + else + { + zfkj.push({ + l: g, + w: k, + x: x, + y: y, + }); + let ybsl: number = 0; + let yhsl: number = 0; + if (yb.length > 0) { ybsl = yb.length; } + if (yhxbang.length > 0) { yhsl = yhxbang.length; } + return [ybsl, yhsl, yb, yhxbang, listbang, 1, zfkj]; + } +} + +interface findbang +{ + findid: number; + line: WaveType; + pbg: number; + pbk: number; + id: number; +} + +interface Lyr +{ + pfs: number;//平方数 + lry: number;//利用率 + ys: number;//页数 +} diff --git a/src/modules/rect-layout/RectOptimizeMachine.worker.ts b/src/modules/rect-layout/RectOptimizeMachine.worker.ts new file mode 100644 index 0000000..b940cbc --- /dev/null +++ b/src/modules/rect-layout/RectOptimizeMachine.worker.ts @@ -0,0 +1,17 @@ +import {type Big_bang,type xbang } from "./bang"; +import { RectOptimizeMachine } from "./RectOptimizeMachine"; + +const ctx: Worker = self as any; + +ctx.addEventListener("message", async (event) => +{ + // 小板 / 大板 / 大板数量 / 优化迭代次数 / 双面加工优先排版? / 刀路间隙 / 电子锯算法 / ??? + let [xbangs, B_bang, B_bangsl, yhcs, isdtwosided, gap, dzjsf, yuliaodo2face] = (event.data) as [xbang[], Big_bang[], number[], number, boolean, number, boolean, boolean]; + + let m = new RectOptimizeMachine(async (best, scrap, fit) => + { + ctx.postMessage([best, scrap, fit]); + }); + + m.Start(xbangs, B_bang, B_bangsl, yhcs, isdtwosided, gap, dzjsf, yuliaodo2face); +}); diff --git a/src/modules/rect-layout/bang.ts b/src/modules/rect-layout/bang.ts new file mode 100644 index 0000000..504e621 --- /dev/null +++ b/src/modules/rect-layout/bang.ts @@ -0,0 +1,42 @@ +import type { ComposingType, HoleType, WaveType } from "cut-abstractions"; + +/** + * 单块1220*2440的板结果 Container + */ +export type Con = YH_bang[]; +/** + * 个体:优化结果 包含多个大板 Individual + */ +export type Inv = Con[]; + +export interface YH_bang { + bangid: number; + line: WaveType; + x: number; + y: number; + pbg: number; + pbk: number; +} + +/** 待优化小板 */ +export interface xbang { + l: number; + w: number; + line: WaveType; + face: ComposingType; + id: number; + bno: string; + holeFaceCount: HoleType; + isRect?: boolean; + hasHole?: boolean; + isdtwosided?: boolean; +} + +/** 待优化大板 */ +export interface Big_bang +{ + l: number; + w: number; + x: number; + y: number; +} diff --git a/src/modules/rect-layout/utils.ts b/src/modules/rect-layout/utils.ts new file mode 100644 index 0000000..e2574e7 --- /dev/null +++ b/src/modules/rect-layout/utils.ts @@ -0,0 +1,29 @@ +export async function Sleep(time: number) +{ + return new Promise(res => + { + setTimeout(res, time); + }); +} + +export function arrayLast(arr: { [key: number]: T, length: number; }): T +{ + return arr[arr.length - 1]; +} + +export function arrayMax(arr: T[], f: (item: T) => number = a => (a as unknown as number)): [T, number] +{ + let max = -Infinity; + let maxIndex = -1; + for (let i = 0; i < arr.length; i++) + { + let item = arr[i]; + let v = f(item); + if (v > max) + { + maxIndex = i; + max = v; + } + } + return [arr[maxIndex], maxIndex]; +} diff --git a/src/processors/CncConverter/CncConverter.ts b/src/processors/CncConverter/CncConverter.ts new file mode 100644 index 0000000..6814b0e --- /dev/null +++ b/src/processors/CncConverter/CncConverter.ts @@ -0,0 +1,149 @@ + +export class CncConverter implements ICncWriter { + private lines: string[] = [] + private nodes: any[] = []; + private actionRecord: CncAction[] = [] + get cncActions(): CncAction[] { + return this.actionRecord + } + config: CncConverterConfig = { + isNcFileComment: true, + /** 换行符 个别文件需要用 ;\n 结束*/ + lineBreak: '\n', + + leaderChar: '//', + } + async doXML(data: CncTemplateParams[]) { + // let line = [] + for (const template of data) { + await this.doCncTemplate(template) + } + + + } + + async doCncTemplate(templateItem: CncTemplateParams, level: number = 0) { + /** 行缩进 内容 */ + let tabContent = ` ` + /** 实际行缩进输出内容 */ + let tabVal = ''; + + for (let i = 0; i < level; i++) { + // 按照节点层级 生成缩进内容 + tabVal = tabVal + tabContent; + } + + let node: any[] = [] + node.push(tabVal) + let startCode = `<${templateItem.templateName}` + node.push(startCode) + for (const propertyInfo of templateItem.propertyList) { + let propertyItem = `${propertyInfo.propertyName}="${propertyInfo.propertyValue}"` + node.push(propertyItem) + } + + let endStr = ' >' + if (templateItem.templateEndType == TemplateEndTargetType.SingleEnd) { + endStr = ' />' + } + + node.push(endStr) + + this.lines.push(node.join(' ')) + if (Array.isArray(templateItem.children) && templateItem.children.length > 0) { + // 子节点 内容 + for (const kid of templateItem.children) { + await this.doCncTemplate(kid, level + 1) + } + } + + /** 结尾 */ + let endCode = templateItem.templateEndType == TemplateEndTargetType.DoubleEnd ? `` : '' + if(endCode){ + this.lines.push((tabVal + endCode)) + } + + + } + recordAction(type: CncActionType): string { + const id = this.createActionId(); + const act: CncAction = { + id: id, + type, + lineIndex: this.lines.length + }; + this.comment(`CMP ${act.id} ${act.type}`); + this.actionRecord.push(act); + return id; + } + private _actionIdx = 0; + private createActionId() { + return `A${this._actionIdx++}`; + } + comment(content: string): string { + let markContent = content + this.config.lineBreak + let isShowMark = this.config.isNcFileComment || false + if (isShowMark) { + let leaderChar = this.config.leaderChar || '' + markContent = `${leaderChar} ${markContent}` + } else { + markContent = '' + } + + return markContent + this.config.lineBreak + } +} + +export interface ICncWriter { + get cncActions(): CncAction[] +} + +export interface CncAction { + readonly id: string; + readonly type: CncActionType; + readonly lineIndex: number; + // parent: CncAction; + // children: CncAction[] +} + +export type CncActionType = string + +export type CncTemplateParams = { + /** 标签名 */ + templateName: string + /** 属性列表 */ + propertyList: CncTemplatePropertyType[] + /** 子标签 */ + children?: CncTemplateParams[] + /** 标签结束方式 */ + templateEndType?: TemplateEndTargetType +} + +export interface CncTemplatePropertyType { + /** 属性名 */ + propertyName: string + /** 属性值 */ + propertyValue?: string | number +} +/** + * 节点结束类型 + * 标记文本语言的结尾形式 + * + *
+ *
+ */ +export enum TemplateEndTargetType { + /** 这种
*/ + DoubleEnd = 0, + /** 这种
*/ + SingleEnd = 1 +} + +export type CncConverterConfig = { + /** 换行符 个别文件需要用 ;\n 结束*/ + lineBreak?: string + /** 是否添加注释信息 */ + isNcFileComment?: boolean + /** 注释标识符 */ + leaderChar?: string +} \ No newline at end of file diff --git a/src/processors/NcConverter/NcConverter.test.ts b/src/processors/NcConverter/NcConverter.test.ts new file mode 100644 index 0000000..44a362d --- /dev/null +++ b/src/processors/NcConverter/NcConverter.test.ts @@ -0,0 +1,5 @@ +import { test } from "vitest"; + +test('NcConverterTest',()=>{ + +}) \ No newline at end of file diff --git a/src/processors/NcConverter/NcConverter.ts b/src/processors/NcConverter/NcConverter.ts new file mode 100644 index 0000000..d0a995a --- /dev/null +++ b/src/processors/NcConverter/NcConverter.ts @@ -0,0 +1,794 @@ +import { CCode, CCodeParams, FaceType, GCode, GCodeParams, INcWriter, IPoint, Knife, NcAction, NcActionType, } from "cut-abstractions"; +// // import { CArc2GCode, NcArcType, NcReductionType } from "mes-processors" +// import { Vector2 } from "node_modules/mes-processors/src/math/vector2"; + + +/** 用以对接 NC类型的加工文件--即 解析器 */ +export class NcConverter implements INcWriter { + /** NC加工动作记录 */ + + private lines: string[] = []; + /** 刀库 */ + knifeList: Array = [] + /** 当前刀具 */ + private currentKnife?: Knife = undefined; + private actionRecord: NcAction[] = []; + arcType: NcArcType = 'R'; + /** 最后一行代码参数 */ + // private lastParams?: any + private lastParams: GCodeParams = new GCodeParams(); + private lastCode: string = ''; + /** 可以做代码转换 如G2转G3,G3转G2等 */ + codeMap: Record = {}; + get ncActions(): NcAction[] { + return this.actionRecord; + } + reductionType: NcReductionType = NcReductionType.None; + /** 配置 这里给默认值*/ + config: NcConverterConfig = { + isEnableConverterAxis: false, + thickness: 18, + doSimpleFirstCode: false, + isNcFileComment: true, + isNcLinePrefixEnabled: false, + ncLinePrefix: '', + isUseSimpleCode: false, + isSimpleFirstCode: false, + arcType: 'R', + reverseArcCode: false, + NcCodeFreeMove: 'G00', + NcCodeLineInterpolation: 'G01', + NcCodeClockwiseArcInterpolation: 'G02', + NcCodeAnticlockwiseArcInterpolation: 'G03', + NcCodeAxisX: 'X', + NcCodeAxisY: 'Y', + NcCodeAxisZ: 'Z', + NcCodeSpeed: 'F', + NcCodeIncrementAxisX: 'I', + NcCodeIncrementAxisY: 'J', + NcCodeIncrementAxisZ: 'K', + leaderChar: '//', + boardLength: 2440, + boardWidth: 1220, + boardHeight: 50, + originPointPosition: BoardPosition.LEFT_TOP, + originZ0Position: OriginZPosition.WorkTop, + heightAxis: AxisType.Z_POS, + decimalPointPrecision: 3, + fixFloatNumberEndZero: true, + intNumberAddDecimalPoint: true, + lineBreak: '\n' + } + /** G代码转换关系 */ + codeTransform = { + [GCode.G0]: this.config.NcCodeFreeMove, + [GCode.G1]: this.config.NcCodeLineInterpolation, + [GCode.G2]: this.config.NcCodeClockwiseArcInterpolation, + [GCode.G3]: this.config.NcCodeAnticlockwiseArcInterpolation + } + initConfig(conf: NcConverterConfig) { + this.config = { ...this.config, ...conf } + + /** 更新下代码转换关系 */ + this.codeTransform = { + [GCode.G0]: this.config.NcCodeFreeMove, + [GCode.G1]: this.config.NcCodeLineInterpolation, + [GCode.G2]: this.config.NcCodeClockwiseArcInterpolation, + [GCode.G3]: this.config.NcCodeAnticlockwiseArcInterpolation + } + } + + protected code(code: keyof typeof GCode, params: Partial) { + const line: any[] = []; + + /** + * G0 - G3 代码 显示的时候可以配置 + * 例 + * G00 - G03 + */ + + if (this.reductionType & NcReductionType.Code) { + if (this.lastCode != code) { + line.push(this.codeTransform[code]); + } + } else { + line.push(this.codeTransform[code]); + } + + this.lastCode = code; + + let x = params.x ??= this.lastParams.x; + let y = params.y ??= this.lastParams.y; + let z = params.z ??= this.lastParams.z; + + let x_val = this.handleValue_DecimalPointPrecision(x) + let y_val = this.handleValue_DecimalPointPrecision(y) + let z_val = this.handleValue_DecimalPointPrecision(z) + + let x_code = this.config.NcCodeAxisX || 'X' + let y_code = this.config.NcCodeAxisY || 'Y' + let z_code = this.config.NcCodeAxisZ || 'Z' + + if (this.reductionType & NcReductionType.Position) { + if (x != this.lastParams.x) { + line.push(x_code + x_val); + } + if (y != this.lastParams.y) { + line.push(y_code + y_val); + } + if (z != this.lastParams.z) { + line.push(z_code + z_val); + } + } else { + line.push(x_code + x_val); + line.push(y_code + y_val); + line.push(z_code + z_val); + } + + if (code == 'G2' || code == 'G3') { + if (this.config.arcType == 'R') { + + let r = params.r ??= this.lastParams.r; + + let r_val = this.handleValue_DecimalPointPrecision(r) + + line.push('R' + r_val); + } + if (this.config.arcType == 'IJK') { + let i = params.i ??= this.lastParams.i; + let j = params.j ??= this.lastParams.j; + + let i_val = this.handleValue_DecimalPointPrecision(i) + let j_val = this.handleValue_DecimalPointPrecision(j) + + line.push('I' + i_val); + line.push('J' + j_val); + } + } + + const speed = params.f ??= this.lastParams.f + if (speed != 0) { + if (this.reductionType & NcReductionType.Speed) { + if (speed != this.lastParams.f) { + line.push('F' + speed); + } + } else { + line.push('F' + speed); + } + } + Object.assign(this.lastParams, params); // 更新上一次参数 + if (this.codeMap[line[0]]) { // 命令转换 + line[0] = this.codeMap[line[0]]; + } + this.lines.push(line.join(' ')); + } + + gCode(code: TCode, params: Partial): void { + switch (code) { + case 'G0': + case 'G1': + case 'G2': + case 'G3': { + this.code(code, params); + break; + } + // 自定义代码 + case 'CArc': { + // 凸度转GCode + const cParam = params as Partial; + if (!cParam.x || !cParam.y || !cParam.b) throw new Error("CArc命令缺少必要参数(X, Y, B)"); + const targetPoint = { x: cParam.x, y: cParam.y }; + if (this.config.arcType === 'R') { + const result = CArc2GCode(this.lastParams, targetPoint, cParam.b, 'R'); + this.code(result.gCode, { ...targetPoint, r: result.r }); + } else { + const result = CArc2GCode(this.lastParams, targetPoint, cParam.b, 'IJK'); + this.code(result.gCode, { ...targetPoint, i: result.i, j: result.j }); + } + } + } + } + + /** 处理值 最终显示的值 小数点后X位功能 */ + handleValue_DecimalPointPrecision(val: number) { + const { fixFloatNumberEndZero, intNumberAddDecimalPoint, decimalPointPrecision } = this.config + /** + * 2种方式 末尾补零 或者 直接保留小数点后N位 + */ + let isToFix = false + + let resVal + + if (fixFloatNumberEndZero == true) { + // 末尾补零 + isToFix = true + } else if (intNumberAddDecimalPoint == true) { + // 整数值末尾加小数点 + if (Number.isInteger(val)) { + isToFix = true + } + } + if (isToFix) { + resVal = val.toFixed(decimalPointPrecision) + } else { + resVal = val.toString() + } + + return resVal + } + + + /** 更换刀具 */ + changeKnife() { + + } + + /** 校验值是否有效 不为'' 或 undefined */ + checkVal(val: any): boolean { + let r = true + if ((val == undefined || val == '')) { + r = false + } + return r + } + toString() { + return this.lines.join(this.config.lineBreak); + } + comment(content: string): string { + + let markContent = content + this.config.lineBreak + let isShowMark = this.config.isNcFileComment || false + if (isShowMark) { + let leaderChar = this.config.leaderChar || '' + markContent = `${leaderChar} ${markContent}` + } else { + markContent = '' + } + + return markContent + this.config.lineBreak + } + + recordAction(type: NcActionType): string { + const id = this.createActionId(); + const act: NcAction = { + id: id, + type, + lineIndex: this.lines.length + }; + this.comment(`CMP ${act.id} ${act.type}`); + this.actionRecord.push(act); + return id; + } + private _actionIdx = 0; + private createActionId() { + return `A${this._actionIdx++}`; + } + append(str: string) { + // this.lines.push(str); + } + + appendLine(str: string) { + + } + /** + * + * @param point 加工项的点 + * @param processItemInfo 加工项的信息 水平基准、垂直基准、轴方向(x、y、z),板件方向(x、y、z) + * // 这里加工项的点数据 都是经过数据处理的 假定这里拿到的数据都是基于左上角 台面 + * + * @returns 实际加工项的点 + */ + getXYZ(point: CodeParams, processItemInfo: ProcessInfo): CodeParams { + let newPoint: any = {} + + if (this.config.isEnableConverterAxis) { + // 进行坐标轴转换 + for (const key in point) { + if (point[key] != undefined) { + Reflect.set(newPoint, key, parseFloat(point[key])) + } + } + + // /** 有2个部分 + // * 一个是基于机台和板件的转换 依据板件定位 + // * 另外一个是基于板件和加工项的转换 依据板件长高方向*/ + // switch (this.config.originZ0Position) { + // case 0: + // // 台面 不操作 + // break; + // case 1: + // // 板面 Z坐标需要转换 + // newPoint.z = newPoint.z - this.config.thickness + // break; + // default: + // break; + // } + + // /** step 先转换板件的位置 */ + // // 大板定位 不同 根据不同的定位点修改 + + // // processItemInfo + // switch (this.config.originPointPosition) { + // case BoardPosition.LEFT_TOP: + // // 不操作 + // newPoint = this.changeXYZAxiosSide(newPoint) + // break; + // case BoardPosition.LEFT_BOTTOM: + // // 左下角 x坐标要转换 + // newPoint.x = newPoint.x + this.config.boardWidth - processItemInfo.block.cutWidth //400 + // newPoint = this.changeXYZAxiosSide(newPoint) + // break; + // case BoardPosition.RIGHT_TOP: + // // 右上角 y坐标要转换 + // newPoint.y = newPoint.y + this.config.boardLength - processItemInfo.block.cutLength // 600 + // newPoint = this.changeXYZAxiosSide(newPoint) + // break; + // case BoardPosition.RIGHT_BOTTOM: + // // 右下角 xy 坐标要转换 + // newPoint.x = newPoint.x + this.config.boardWidth - processItemInfo.block.cutWidth + // newPoint.y = newPoint.y + this.config.boardLength - processItemInfo.block.cutLength + // newPoint = this.changeXYZAxiosSide(newPoint) + // break; + // default: + // break; + // } + + // 这里做 数值的小数点处理 + for (const key in newPoint) { + if (['x', 'y', 'z', 'r', 'i', 'j', 'k'].includes(key)) { + let isTofix = false + if (this.config.fixFloatNumberEndZero == true) { + // 末尾补零 + isTofix = true + } else if (this.config.intNumberAddDecimalPoint == true) { + // 整数值末尾加小数点 + if (Number.isInteger(newPoint[key])) { + isTofix = true + } + } + if (isTofix) { + newPoint[key] = parseFloat(newPoint[key]).toFixed(this.config.decimalPointPrecision) + } + } + } + return newPoint + } else { + return point + } + + } + /** 根据 轴向变更坐标 */ + changeXYZAxiosSide(point: CodeParams) { + let newPoint: any = {} + for (const key in point) { + if (point[key] != undefined) { + Reflect.set(newPoint, key, parseFloat(point[key])) + } + } + + let width = this.config.boardWidth + let length = this.config.boardLength + let height = this.config.boardHeight + + + if (this.config.widthSideAxis == AxisType.X_POS && this.config.lengthSideAxis == AxisType.Y_POS) { + // 默认 为 X = x 正 Y = y 正 不操作 + } else if (this.config.widthSideAxis == AxisType.Y_POS && this.config.lengthSideAxis == AxisType.X_POS) { + // x = y正 y = x正 X Y坐标 倒转 + newPoint = { ...newPoint, x: newPoint.y, y: newPoint.x } + } + + else if (this.config.widthSideAxis == AxisType.X_NEG && this.config.lengthSideAxis == AxisType.Y_POS) { + // x = x负 y = y正 + newPoint = { ...newPoint, x: newPoint.x - width, y: newPoint.y } + } else if (this.config.widthSideAxis == AxisType.Y_POS && this.config.lengthSideAxis == AxisType.X_NEG) { + // x = y正 y = x负 + newPoint = { ...newPoint, x: newPoint.y - width, y: newPoint.x } + } + + else if (this.config.widthSideAxis == AxisType.X_NEG && this.config.lengthSideAxis == AxisType.Y_NEG) { + // x = x负 y = y负 + newPoint = { ...newPoint, x: newPoint.x - width, y: newPoint.y - length } + } else if (this.config.widthSideAxis == AxisType.Y_NEG && this.config.lengthSideAxis == AxisType.X_NEG) { + // x = y负 y = x负 + newPoint = { ...newPoint, x: newPoint.y - width, y: newPoint.x - length } + } + + else if (this.config.widthSideAxis == AxisType.X_POS && this.config.lengthSideAxis == AxisType.Y_NEG) { + // x = x正 y = y负 + newPoint = { ...newPoint, x: newPoint.x, y: newPoint.y - length } + } else if (this.config.widthSideAxis == AxisType.Y_NEG && this.config.lengthSideAxis == AxisType.X_POS) { + // x = y负 y = x正 + newPoint = { ...newPoint, x: newPoint.y, y: newPoint.x - length } + } + + if (this.config.heightAxis == AxisType.Z_NEG) { + // Z轴负 + newPoint = { ...newPoint, z: newPoint.z - height } + } + + return newPoint + } + + +} + +export type NcConverterConfig = { + /** 是否启用解析器的坐标系转换 */ + isEnableConverterAxis?: boolean, + /** 板厚 */ + thickness: number, + /**是否执行换刀后的第一行精简指令 */ + doSimpleFirstCode?: boolean + /** 是否添加注释信息 */ + isNcFileComment?: boolean + /** 是否空行插入前缀 */ + isNcLinePrefixEnabled?: boolean + /** 空行插入前缀 前缀内容*/ + ncLinePrefix?: string + /** 使用精简指令 */ + isUseSimpleCode?: boolean + /** 精简换刀后第一行指令 */ + isSimpleFirstCode?: boolean + /** 圆弧指令模式类型 */ + arcType?: NcArcType + /** 反转圆弧指令 */ + reverseArcCode?: boolean + /** 空程移动指令 */ + NcCodeFreeMove?: string + /** 直线插补标识 */ + NcCodeLineInterpolation?: string + /** 顺时针圆弧插补标识 */ + NcCodeClockwiseArcInterpolation?: string + /** 逆时针圆弧插补标识 */ + NcCodeAnticlockwiseArcInterpolation?: string + /** 水平坐标横轴标识 */ + NcCodeAxisX?: string + /** 水平坐标纵轴标识 */ + NcCodeAxisY?: string + /** 垂直坐标轴标识 */ + NcCodeAxisZ?: string + /** 速度标识 */ + NcCodeSpeed?: string + /** 水平坐标横轴增量标识 */ + NcCodeIncrementAxisX?: string + /** 水平坐标纵轴增量标识 */ + NcCodeIncrementAxisY?: string + /** 垂直坐标轴增量标识 */ + NcCodeIncrementAxisZ?: string + /** 注释标识符 */ + leaderChar?: string + /** 工作区域长 x */ + boardLength: number + /** 工作区域宽 y */ + boardWidth: number + /** 工作区域高 z */ + boardHeight: number + /** 水平基准点 */ + originPointPosition?: BoardPosition + /** 垂直基准点 */ + originZ0Position?: OriginZPosition + /** 水平纵轴坐标轴向 */ + widthSideAxis?: AxisType + /** 水平横轴坐标轴向 */ + lengthSideAxis?: AxisType + /** 垂直轴坐标轴向 */ + heightAxis?: AxisType + /** 保留小数点位数 */ + decimalPointPrecision?: number + /** 末尾补零 */ + fixFloatNumberEndZero?: boolean + /** 整数值末尾加小数点 */ + intNumberAddDecimalPoint?: boolean + /** 换行符 个别文件需要用 ;\n 结束*/ + lineBreak?: string + +} + +/** 枚举 大板边角位置 */ +export enum BoardPosition { + /** 左上角 */ + LEFT_TOP = 3, + /** 左下角 */ + LEFT_BOTTOM = 0, + /** 右下角 */ + RIGHT_BOTTOM = 1, + /** 右上角 */ + RIGHT_TOP = 2, +} +/** 枚举 坐标轴类型 */ +export enum OriginZPosition { + /** 台面向上Z轴正 */ + WorkTop = 0, + /** 板面向上Z轴正 */ + BoardFace = 1, +} + +/** 枚举 坐标轴类型 */ +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 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 class ProcessInfo { + /**当前加工项的下标*/ + i?: Number + /** 加工项 对应刀具的数据 */ + knife?: Knife + /** 加工项的类型 */ + type?: processItemType + /** 加工项所在的 文件名 */ + belong?: string + /** 该加工项基于哪个加工面 传入数据 主要用于 加工项坐标转换 感觉可能没用 */ + belongFace?: FaceType + /** 板件信息 */ + block?: any + // /** 垂直基准点 */ + // originZ0Position?: OriginZPosition + // /** 水平基准点 */ + // originPointPosition?: BoardPosition + // /** 大板定位 */ + // boardLocation?: BoardPosition + // /** 加工项的宽方向 x */ + // widthSideAxis?: AxisType + // /** 加工项的长方向 y */ + // lengthSideAxis ?: AxisType + // /** 加工项的高方向 */ + // heightSideAxis ?: AxisType + +} + + +/** 加工项的类别 + * 用于区分加工项的类别,不同的类别 在文件生成的时候 可能需要对应某些独立的节点 + */ +export enum processItemType { + /**排钻 */ + Hole = 'hole', + /** 铣孔 */ + MillingHole = 'millingHole', + /** 造型 非槽加工 铣型 */ + Model = 'model', + /** 造型 槽-- 拉槽 */ + Grooves = 'grooves', + /** 造型 铣槽 */ + MillingGrooves = 'millingGrooves', + /** 侧面造型 */ + SideModel = 'SideModel', + /** 侧面槽 - 拉槽 */ + SideGrooves = 'sideGrooves', + /** 侧面槽 - 拉槽 */ + SideMillingGrooves = 'SideMillingGrooves', + /** 侧面孔 排钻 */ + SideHole = 'sideHole', + /** 侧面孔 铣孔 */ + MillingSideHole = 'MillingSideHole', + /** 开料 */ + CutBlock = 'cutBlock', + /** 修边 */ + MillingBlockBoard = 'MillingBlockBoard' +} + +export type NcArcType = 'R' | 'IJK'; + +/** + * 将基于凸度的圆弧转换为基于圆弧半径/圆心坐标表示的圆弧,暂不支持三维圆弧(Z轴或K分量) + * @param source 圆弧起始点 + * @param target 圆弧终点 + * @param bulge 凸度值 + * @param mode 圆弧模式 + * @returns 圆弧参数(IJ或R) + */ +export function CArc2GCode(source: IPoint, target: IPoint, bulge: number, mode: 'R'): { gCode: 'G2' | 'G3'; r: number; }; +export function CArc2GCode(source: IPoint, target: IPoint, bulge: number, mode: 'IJK'): { gCode: 'G2' | 'G3'; i: number; j: number; }; +export function CArc2GCode(source: IPoint, target: IPoint, bulge: number, mode: NcArcType): { gCode: 'G2' | 'G3'; r?: number; i?: number; j?: number; } { + /* + * ♿♿♿ 修改必看!!! + * 凸度为圆弧圆心角的1/4正切值 + * Bulge = tan(θ / 4) θ为圆心角 + * 凸度为正数,则从起点顺时针绘制圆弧到终点 + * 凸度为负数,则逆时针绘制 + * 当凸度为0时,绘制直线 + * 当凸度为1时,圆心角为180度 tan(180 / 4) = 1 + * 凸度转换公式见 https://www.lee-mac.com/bulgeconversion.html + * + * NC圆弧规则 + * 圆弧半径(R)模式: + * 从起点到终点绘制半径为|R|的圆弧,R越大圆弧越平滑,越小圆弧越弯曲 + * 当R为正数时,表示绘制圆的短弧 + * 当R为负数时,表示绘制圆的长弧 + * ⚠️注意 起点到终点的距离不可大于 2 * |R|,否则应当抛出错误 + * + * 圆心坐标(IJ)模式: + * 从起点到终点绘制圆弧,圆心坐标为(I, J),I为圆心在X轴上的坐标(带符号),J为圆心在Y轴上的坐标(带符号) + * ⚠️注意 圆心到圆弧起点和圆心到圆弧终点的距离必须相等(都等于圆弧的半径),否则应当抛出错误 + */ + + if (bulge === 0) { + throw new Error("圆弧模式下,凸度值不能为0"); + } + + const p1 = Vector2.FromPoint(source); + const p2 = Vector2.FromPoint(target); + + const gCode = bulge > 0 ? 'G2' : 'G3'; + + const delta = p2.Subtract(p1); + const dist = delta.Magnitude; + + if (dist < 1e-6) { + throw new Error("起点与终点距离过近"); + } + + // 通过凸度值计算圆弧半径 + // 圆弧半径 r = (弦长 / 2) * (1 + bulge²) / (2 * |bulge|) + // 详见: https://www.lee-mac.com/bulgeconversion.html#bulgeradius + const chordLength = delta.Magnitude; + const radius = (chordLength / 2) * (1 + bulge * bulge) / (2 * Math.abs(bulge)); + + // R模式 + if (mode === 'R') { + return { gCode: gCode, r: radius }; + } + + // IJK模式 + // 圆心位于弦的垂直平分线 + // 计算弦的中点 + const midPoint = p1.Add(delta.Multiply(0.5)); + // 计算弦心距d + // 公式:d = √(r² - a²),r为半径,a为弦长的一半(勾股定理) + const d = Math.sqrt(radius * radius - (dist / 2) * (dist / 2)); + + // 垂直平分线单位向量 + const perpVec = new Vector2(-delta.y, delta.x).Normalize(); + + // 从弦的中点向垂直平分线向量移动弦心距d来计算出圆心的坐标 + const center = midPoint.Add(perpVec.Multiply(d * -Math.sign(bulge))); + + const i = center.x - p1.x; + const j = center.y - p1.y; + + return { gCode, i, j }; +} + +export enum NcReductionType { + None = 0, + Position = 1 << 0, + Speed = 1 << 1, + Code = 1 << 2, + /** + * 换刀重置 + */ + SwitchKnifeReset = 1 << 3 +} + +export class Vector2 implements IPoint { + static Zero = new Vector2(0, 0); + static One = new Vector2(1, 1); + static Up = new Vector2(0, 1); + static Down = new Vector2(0, -1); + static Left = new Vector2(-1, 0); + static Right = new Vector2(1, 0); + static FromPoint(pt: IPoint) { + if (pt instanceof Vector2) return pt as Vector2; + return new Vector2(pt.x, pt.y); + } + + x: number; + y: number; + + /** 获取向量的模长 */ + get Magnitude() { + return Math.sqrt(Math.pow(this.x, 2) + Math.pow(this.y, 2)); + } + + /** 获取向量的平方模长,这个属性比 `Magnitude` 属性更快 */ + get SquaredMagnitude() { + return Math.pow(this.x, 2) + Math.pow(this.y, 2); + } + + constructor(x: number, y: number) { + this.x = x; + this.y = y; + } + + /** 克隆向量 */ + Clone(): Vector2 { + return new Vector2(this.x, this.y); + } + + /** 计算两个向量之间的距离 */ + Distance(other: Vector2): number { + return Math.sqrt(Math.pow(this.x - other.x, 2) + Math.pow(this.y - other.y, 2)); + } + + /** 计算两个向量之间的平方距离,这个属性比 `Distance` 属性更快 */ + SquaredDistance(other: Vector2): number { + return Math.pow(this.x - other.x, 2) + Math.pow(this.y - other.y, 2); + } + + /** 向量和 */ + Add(other: Vector2): Vector2 { + return new Vector2(this.x + other.x, this.y + other.y); + } + + /** 向量差 */ + Subtract(other: Vector2): Vector2 { + return new Vector2(this.x - other.x, this.y - other.y); + } + + /** 向量点乘 */ + Dot(other: Vector2): number { + return this.x * other.x + this.y * other.y; + } + + /** 向量叉乘 */ + Cross(other: Vector2): number { + return this.x * other.y - this.y * other.x; + } + + /** 向量与标量相乘 */ + Multiply(scalar: number): Vector2 { + return new Vector2(this.x * scalar, this.y * scalar); + } + + /** 向量归一化 */ + Normalize(): Vector2 { + const magnitude = this.Magnitude; + if (magnitude === 0) { + return Vector2.Zero; + } + return new Vector2(this.x / magnitude, this.y / magnitude); + } +} \ No newline at end of file diff --git a/src/processors/processCodeConverter/processCodeConverter.test.ts b/src/processors/processCodeConverter/processCodeConverter.test.ts new file mode 100644 index 0000000..a5e8137 --- /dev/null +++ b/src/processors/processCodeConverter/processCodeConverter.test.ts @@ -0,0 +1,4528 @@ +import { test } from 'vitest' + +test('processCodeConverter', () => { + /** + * 流程: + * + */ +}) + +const afterTemplateHandleData = [ + { + "processItemInfo": { + "code": "FSTART", + "order": "FSTART" + } + }, + { + "processItemInfo": { + "code": "C", + "order": "KnifeMove", + "block": { + "blockNo": "25044454400", + "cutLength": 705.342, + "cutWidth": 350 + }, + "knife": { + "diameter": 6 + } + }, + "list": [ + { + "x": 830.775, + "y": 1193.2250000000001, + "dir": 0, + "z": 30, + "f": 10000 + }, + { + "x": 830.775, + "y": 1193.2250000000001, + "dir": 0, + "z": 18, + "f": 10000 + }, + { + "x": 830.775, + "y": 1193.2250000000001, + "dir": 1, + "z": -10.15, + "f": 8000 + }, + { + "x": 830.775, + "y": 1193.2250000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 830.775, + "y": 1293.2250000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 874.875, + "y": 1293.2250000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 874.875, + "y": 1193.2250000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 830.775, + "y": 1193.2250000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 836.775, + "y": 1199.2250000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 868.875, + "y": 1199.2250000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 868.875, + "y": 1287.2250000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 836.775, + "y": 1287.2250000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 836.775, + "y": 1199.2250000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 842.775, + "y": 1205.2250000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 862.875, + "y": 1205.2250000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 862.875, + "y": 1281.2250000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 842.775, + "y": 1281.2250000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 842.775, + "y": 1205.2250000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 848.775, + "y": 1211.2250000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 856.875, + "y": 1211.2250000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 856.875, + "y": 1275.2250000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 848.775, + "y": 1275.2250000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 848.775, + "y": 1211.2250000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 852.825, + "y": 1215.275, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 852.825, + "y": 1271.1750000000002, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 852.825, + "y": 1271.1750000000002, + "dir": 0, + "f": 10000, + "z": 30 + } + ] + }, + { + "processItemInfo": { + "code": "C", + "order": "KnifeMove", + "block": { + "blockNo": "25044454400", + "cutLength": 705.342, + "cutWidth": 350 + }, + "knife": { + "diameter": 6 + } + }, + "list": [ + { + "x": 830.825, + "y": 1343.2250000000001, + "dir": 0, + "z": 30, + "f": 10000 + }, + { + "x": 830.825, + "y": 1343.2250000000001, + "dir": 0, + "z": 18, + "f": 10000 + }, + { + "x": 830.825, + "y": 1343.2250000000001, + "dir": 1, + "z": -10.15, + "f": 8000 + }, + { + "x": 830.825, + "y": 1343.2250000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 874.825, + "y": 1343.2250000000001, + "dir": 2, + "b": -0.9999999999999999, + "z": -10.15, + "f": 8000, + "r": 22 + }, + { + "x": 830.825, + "y": 1343.2250000000001, + "dir": 2, + "b": -0.9999999999999999, + "z": -10.15, + "f": 8000, + "r": 22 + }, + { + "x": 833.825, + "y": 1343.2250000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 871.825, + "y": 1343.2250000000001, + "dir": 3, + "b": 0.9999999999999999, + "z": -10.15, + "f": 8000, + "r": 19 + }, + { + "x": 833.825, + "y": 1343.2250000000001, + "dir": 3, + "b": 0.9999999999999999, + "z": -10.15, + "f": 8000, + "r": 19 + }, + { + "x": 836.825, + "y": 1343.2250000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 868.825, + "y": 1343.2250000000001, + "dir": 3, + "b": 0.9999999999999999, + "z": -10.15, + "f": 8000, + "r": 16 + }, + { + "x": 836.825, + "y": 1343.2250000000001, + "dir": 3, + "b": 0.9999999999999999, + "z": -10.15, + "f": 8000, + "r": 16 + }, + { + "x": 839.825, + "y": 1343.2250000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 865.825, + "y": 1343.2250000000001, + "dir": 3, + "b": 0.9999999999999999, + "z": -10.15, + "f": 8000, + "r": 13 + }, + { + "x": 839.825, + "y": 1343.2250000000001, + "dir": 3, + "b": 0.9999999999999999, + "z": -10.15, + "f": 8000, + "r": 13 + }, + { + "x": 842.825, + "y": 1343.2250000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 862.825, + "y": 1343.2250000000001, + "dir": 3, + "b": 0.9999999999999999, + "z": -10.15, + "f": 8000, + "r": 10 + }, + { + "x": 842.825, + "y": 1343.2250000000001, + "dir": 3, + "b": 0.9999999999999999, + "z": -10.15, + "f": 8000, + "r": 10 + }, + { + "x": 845.825, + "y": 1343.2250000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 859.825, + "y": 1343.2250000000001, + "dir": 3, + "b": 0.9999999999999999, + "z": -10.15, + "f": 8000, + "r": 7 + }, + { + "x": 845.825, + "y": 1343.2250000000001, + "dir": 3, + "b": 0.9999999999999999, + "z": -10.15, + "f": 8000, + "r": 7 + }, + { + "x": 848.825, + "y": 1343.2250000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 856.825, + "y": 1343.2250000000001, + "dir": 3, + "b": 0.9999999999999999, + "z": -10.15, + "f": 8000, + "r": 4 + }, + { + "x": 848.825, + "y": 1343.2250000000001, + "dir": 3, + "b": 0.9999999999999999, + "z": -10.15, + "f": 8000, + "r": 4 + }, + { + "x": 851.825, + "y": 1343.2250000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 853.825, + "y": 1343.2250000000001, + "dir": 3, + "b": 0.9999999999999999, + "z": -10.15, + "f": 8000, + "r": 1 + }, + { + "x": 851.825, + "y": 1343.2250000000001, + "dir": 3, + "b": 0.9999999999999999, + "z": -10.15, + "f": 8000, + "r": 1 + }, + { + "x": 851.825, + "y": 1343.2250000000001, + "dir": 0, + "f": 10000, + "z": 30 + } + ] + }, + { + "processItemInfo": { + "code": "C", + "order": "KnifeMove", + "block": { + "blockNo": "25044454400", + "cutLength": 705.342, + "cutWidth": 350 + }, + "knife": { + "diameter": 6 + } + }, + "list": [ + { + "x": 812.766, + "y": 1555.5080000000003, + "dir": 0, + "z": 30, + "f": 10000 + }, + { + "x": 812.766, + "y": 1555.5080000000003, + "dir": 0, + "z": 18, + "f": 10000 + }, + { + "x": 812.766, + "y": 1555.5080000000003, + "dir": 1, + "z": -2, + "f": 8000 + }, + { + "x": 812.766, + "y": 1555.5080000000003, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 892.884, + "y": 1555.5080000000003, + "dir": 2, + "b": -0.9999999999999999, + "z": -2, + "f": 8000, + "r": 40.059 + }, + { + "x": 812.766, + "y": 1555.5080000000003, + "dir": 2, + "b": -0.9999999999999999, + "z": -2, + "f": 8000, + "r": 40.059 + }, + { + "x": 815.766, + "y": 1555.5080000000003, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 889.884, + "y": 1555.5080000000003, + "dir": 3, + "b": 0.9999999999999999, + "z": -2, + "f": 8000, + "r": 37.059 + }, + { + "x": 815.766, + "y": 1555.5080000000003, + "dir": 3, + "b": 0.9999999999999999, + "z": -2, + "f": 8000, + "r": 37.059 + }, + { + "x": 821.854, + "y": 1557.8540000000003, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 829.1479999999999, + "y": 1535.4060000000002, + "dir": 3, + "b": 0.19738859486115215, + "z": -2, + "f": 8000, + "r": 31.059 + }, + { + "x": 833.656, + "y": 1549.2790000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 821.854, + "y": 1557.8540000000003, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 819.639, + "y": 1563.1720000000003, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 830.482, + "y": 1529.8010000000002, + "dir": 3, + "b": 0.2773586187268363, + "z": -2, + "f": 8000, + "r": 34.059 + }, + { + "x": 837.183, + "y": 1550.4250000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 819.639, + "y": 1563.1720000000003, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 819.343, + "y": 1563.3870000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 837.183, + "y": 1550.4250000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 830.3679999999999, + "y": 1529.4530000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 834.985, + "y": 1526.0990000000002, + "dir": 3, + "b": 0.7265425280053616, + "z": -2, + "f": 8000, + "r": 3 + }, + { + "x": 852.825, + "y": 1539.0610000000001, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 870.665, + "y": 1526.0990000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 875.2819999999999, + "y": 1529.4530000000002, + "dir": 3, + "b": 0.7265425280053599, + "z": -2, + "f": 8000, + "r": 3 + }, + { + "x": 868.467, + "y": 1550.4250000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 886.307, + "y": 1563.3870000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 884.544, + "y": 1568.8140000000003, + "dir": 3, + "b": 0.7265425280053603, + "z": -2, + "f": 8000, + "r": 3 + }, + { + "x": 862.492, + "y": 1568.8140000000003, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 855.678, + "y": 1589.786, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 849.972, + "y": 1589.786, + "dir": 3, + "b": 0.7265425280053646, + "z": -2, + "f": 8000, + "r": 3 + }, + { + "x": 843.158, + "y": 1568.8140000000003, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 821.106, + "y": 1568.8140000000003, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 819.343, + "y": 1563.3870000000002, + "dir": 3, + "b": 0.7265425280053591, + "z": -2, + "f": 8000, + "r": 3 + }, + { + "x": 819.343, + "y": 1563.3870000000002, + "dir": 0, + "f": 10000, + "z": 30 + } + ] + }, + { + "processItemInfo": { + "code": "C", + "order": "KnifeMove", + "block": { + "blockNo": "25044454400", + "cutLength": 705.342, + "cutWidth": 350 + }, + "knife": { + "diameter": 6 + } + }, + "list": [ + { + "x": 821.472, + "y": 1568.8140000000003, + "dir": 0, + "z": 30, + "f": 10000 + }, + { + "x": 821.472, + "y": 1568.8140000000003, + "dir": 0, + "z": 18, + "f": 10000 + }, + { + "x": 821.472, + "y": 1568.8140000000003, + "dir": 1, + "z": -2, + "f": 8000 + }, + { + "x": 821.472, + "y": 1568.8140000000003, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 843.158, + "y": 1568.8140000000003, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 849.8589999999999, + "y": 1589.438, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 821.472, + "y": 1568.8140000000003, + "dir": 3, + "b": 0.2773586187268357, + "z": -2, + "f": 8000, + "r": 34.059 + }, + { + "x": 826.39, + "y": 1571.8140000000003, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 840.978, + "y": 1571.8140000000003, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 845.486, + "y": 1585.688, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 826.39, + "y": 1571.8140000000003, + "dir": 3, + "b": 0.1973885948611515, + "z": -2, + "f": 8000, + "r": 31.059 + }, + { + "x": 832.463, + "y": 1574.8140000000003, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 838.798, + "y": 1574.8140000000003, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 840.756, + "y": 1580.8390000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 832.463, + "y": 1574.8140000000003, + "dir": 3, + "b": 0.09210362030140894, + "z": -2, + "f": 8000, + "r": 28.059 + }, + { + "x": 832.463, + "y": 1574.8140000000003, + "dir": 0, + "f": 10000, + "z": 30 + } + ] + }, + { + "processItemInfo": { + "code": "C", + "order": "KnifeMove", + "block": { + "blockNo": "25044454400", + "cutLength": 705.342, + "cutWidth": 350 + }, + "knife": { + "diameter": 6 + } + }, + "list": [ + { + "x": 825.004, + "y": 1551.8570000000002, + "dir": 0, + "z": 30, + "f": 10000 + }, + { + "x": 825.004, + "y": 1551.8570000000002, + "dir": 0, + "z": 18, + "f": 10000 + }, + { + "x": 825.004, + "y": 1551.8570000000002, + "dir": 1, + "z": -2, + "f": 8000 + }, + { + "x": 825.004, + "y": 1551.8570000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 828.172, + "y": 1542.1080000000002, + "dir": 3, + "b": 0.09210362030140949, + "z": -2, + "f": 8000, + "r": 28.059 + }, + { + "x": 830.129, + "y": 1548.1340000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 825.004, + "y": 1551.8570000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 825.004, + "y": 1551.8570000000002, + "dir": 0, + "f": 10000, + "z": 30 + } + ] + }, + { + "processItemInfo": { + "code": "C", + "order": "KnifeMove", + "block": { + "blockNo": "25044454400", + "cutLength": 705.342, + "cutWidth": 350 + }, + "knife": { + "diameter": 6 + } + }, + "list": [ + { + "x": 835.281, + "y": 1526.3140000000003, + "dir": 0, + "z": 30, + "f": 10000 + }, + { + "x": 835.281, + "y": 1526.3140000000003, + "dir": 0, + "z": 18, + "f": 10000 + }, + { + "x": 835.281, + "y": 1526.3140000000003, + "dir": 1, + "z": -2, + "f": 8000 + }, + { + "x": 835.281, + "y": 1526.3140000000003, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 870.3689999999999, + "y": 1526.3140000000003, + "dir": 3, + "b": 0.2773586187268329, + "z": -2, + "f": 8000, + "r": 34.059 + }, + { + "x": 852.825, + "y": 1539.0610000000001, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 835.281, + "y": 1526.3140000000003, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 841.0229999999999, + "y": 1526.7780000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 864.627, + "y": 1526.7780000000002, + "dir": 3, + "b": 0.19738859486114835, + "z": -2, + "f": 8000, + "r": 31.059 + }, + { + "x": 852.825, + "y": 1535.3520000000003, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 841.0229999999999, + "y": 1526.7780000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 847.7, + "y": 1527.92, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 857.95, + "y": 1527.92, + "dir": 3, + "b": 0.09210362030140479, + "z": -2, + "f": 8000, + "r": 28.059 + }, + { + "x": 852.825, + "y": 1531.6440000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 847.7, + "y": 1527.92, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 847.7, + "y": 1527.92, + "dir": 0, + "f": 10000, + "z": 30 + } + ] + }, + { + "processItemInfo": { + "code": "C", + "order": "KnifeMove", + "block": { + "blockNo": "25044454400", + "cutLength": 705.342, + "cutWidth": 350 + }, + "knife": { + "diameter": 6 + } + }, + "list": [ + { + "x": 868.467, + "y": 1550.4250000000002, + "dir": 0, + "z": 30, + "f": 10000 + }, + { + "x": 868.467, + "y": 1550.4250000000002, + "dir": 0, + "z": 18, + "f": 10000 + }, + { + "x": 868.467, + "y": 1550.4250000000002, + "dir": 1, + "z": -2, + "f": 8000 + }, + { + "x": 868.467, + "y": 1550.4250000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 875.168, + "y": 1529.8010000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 886.011, + "y": 1563.1720000000003, + "dir": 3, + "b": 0.2773586187268338, + "z": -2, + "f": 8000, + "r": 34.059 + }, + { + "x": 868.467, + "y": 1550.4250000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 871.9939999999999, + "y": 1549.2790000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 876.502, + "y": 1535.4060000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 883.7959999999999, + "y": 1557.8540000000003, + "dir": 3, + "b": 0.19738859486114949, + "z": -2, + "f": 8000, + "r": 31.059 + }, + { + "x": 871.9939999999999, + "y": 1549.2790000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 875.521, + "y": 1548.1340000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 877.478, + "y": 1542.1080000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 880.646, + "y": 1551.8570000000002, + "dir": 3, + "b": 0.09210362030140658, + "z": -2, + "f": 8000, + "r": 28.059 + }, + { + "x": 875.521, + "y": 1548.1340000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 875.521, + "y": 1548.1340000000002, + "dir": 0, + "f": 10000, + "z": 30 + } + ] + }, + { + "processItemInfo": { + "code": "C", + "order": "KnifeMove", + "block": { + "blockNo": "25044454400", + "cutLength": 705.342, + "cutWidth": 350 + }, + "knife": { + "diameter": 6 + } + }, + "list": [ + { + "x": 862.492, + "y": 1568.8140000000003, + "dir": 0, + "z": 30, + "f": 10000 + }, + { + "x": 862.492, + "y": 1568.8140000000003, + "dir": 0, + "z": 18, + "f": 10000 + }, + { + "x": 862.492, + "y": 1568.8140000000003, + "dir": 1, + "z": -2, + "f": 8000 + }, + { + "x": 862.492, + "y": 1568.8140000000003, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 884.178, + "y": 1568.8140000000003, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 855.7909999999999, + "y": 1589.438, + "dir": 3, + "b": 0.2773586187268312, + "z": -2, + "f": 8000, + "r": 34.059 + }, + { + "x": 862.492, + "y": 1568.8140000000003, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 864.672, + "y": 1571.8140000000003, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 879.26, + "y": 1571.8140000000003, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 860.164, + "y": 1585.688, + "dir": 3, + "b": 0.19738859486114727, + "z": -2, + "f": 8000, + "r": 31.059 + }, + { + "x": 864.672, + "y": 1571.8140000000003, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 866.852, + "y": 1574.8140000000003, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 873.187, + "y": 1574.8140000000003, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 864.894, + "y": 1580.8390000000002, + "dir": 3, + "b": 0.09210362030140522, + "z": -2, + "f": 8000, + "r": 28.059 + }, + { + "x": 866.852, + "y": 1574.8140000000003, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 866.852, + "y": 1574.8140000000003, + "dir": 0, + "f": 10000, + "z": 30 + } + ] + }, + { + "processItemInfo": { + "code": "C", + "order": "KnifeMove", + "block": { + "blockNo": "25044454401", + "cutLength": 799, + "cutWidth": 499 + }, + "knife": { + "diameter": 6 + } + }, + "list": [ + { + "x": 325.765, + "y": 1599.1670000000001, + "dir": 0, + "z": 30, + "f": 10000 + }, + { + "x": 325.765, + "y": 1599.1670000000001, + "dir": 0, + "z": 20, + "f": 10000 + }, + { + "x": 325.765, + "y": 1599.1670000000001, + "dir": 1, + "z": -10.15, + "f": 8000 + }, + { + "x": 325.765, + "y": 1599.1670000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 325.765, + "y": 1699.1670000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 369.865, + "y": 1699.1670000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 369.865, + "y": 1599.1670000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 325.765, + "y": 1599.1670000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 331.765, + "y": 1605.1670000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 363.865, + "y": 1605.1670000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 363.865, + "y": 1693.1670000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 331.765, + "y": 1693.1670000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 331.765, + "y": 1605.1670000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 337.765, + "y": 1611.1670000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 357.865, + "y": 1611.1670000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 357.865, + "y": 1687.1670000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 337.765, + "y": 1687.1670000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 337.765, + "y": 1611.1670000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 343.765, + "y": 1617.1670000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 351.865, + "y": 1617.1670000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 351.865, + "y": 1681.1670000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 343.765, + "y": 1681.1670000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 343.765, + "y": 1617.1670000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 347.815, + "y": 1621.217, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 347.815, + "y": 1677.1170000000002, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 347.815, + "y": 1677.1170000000002, + "dir": 0, + "f": 10000, + "z": 30 + } + ] + }, + { + "processItemInfo": { + "code": "C", + "order": "KnifeMove", + "block": { + "blockNo": "25044454401", + "cutLength": 799, + "cutWidth": 499 + }, + "knife": { + "diameter": 6 + } + }, + "list": [ + { + "x": 325.815, + "y": 1549.1670000000001, + "dir": 0, + "z": 30, + "f": 10000 + }, + { + "x": 325.815, + "y": 1549.1670000000001, + "dir": 0, + "z": 20, + "f": 10000 + }, + { + "x": 325.815, + "y": 1549.1670000000001, + "dir": 1, + "z": -10.15, + "f": 8000 + }, + { + "x": 325.815, + "y": 1549.1670000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 369.815, + "y": 1549.1670000000001, + "dir": 2, + "b": -0.9999999999999999, + "z": -10.15, + "f": 8000, + "r": 22 + }, + { + "x": 325.815, + "y": 1549.1670000000001, + "dir": 2, + "b": -0.9999999999999999, + "z": -10.15, + "f": 8000, + "r": 22 + }, + { + "x": 328.815, + "y": 1549.1670000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 366.815, + "y": 1549.1670000000001, + "dir": 3, + "b": 0.9999999999999999, + "z": -10.15, + "f": 8000, + "r": 19 + }, + { + "x": 328.815, + "y": 1549.1670000000001, + "dir": 3, + "b": 0.9999999999999999, + "z": -10.15, + "f": 8000, + "r": 19 + }, + { + "x": 331.815, + "y": 1549.1670000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 363.815, + "y": 1549.1670000000001, + "dir": 3, + "b": 0.9999999999999999, + "z": -10.15, + "f": 8000, + "r": 16 + }, + { + "x": 331.815, + "y": 1549.1670000000001, + "dir": 3, + "b": 0.9999999999999999, + "z": -10.15, + "f": 8000, + "r": 16 + }, + { + "x": 334.815, + "y": 1549.1670000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 360.815, + "y": 1549.1670000000001, + "dir": 3, + "b": 0.9999999999999999, + "z": -10.15, + "f": 8000, + "r": 13 + }, + { + "x": 334.815, + "y": 1549.1670000000001, + "dir": 3, + "b": 0.9999999999999999, + "z": -10.15, + "f": 8000, + "r": 13 + }, + { + "x": 337.815, + "y": 1549.1670000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 357.815, + "y": 1549.1670000000001, + "dir": 3, + "b": 0.9999999999999999, + "z": -10.15, + "f": 8000, + "r": 10 + }, + { + "x": 337.815, + "y": 1549.1670000000001, + "dir": 3, + "b": 0.9999999999999999, + "z": -10.15, + "f": 8000, + "r": 10 + }, + { + "x": 340.815, + "y": 1549.1670000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 354.815, + "y": 1549.1670000000001, + "dir": 3, + "b": 0.9999999999999999, + "z": -10.15, + "f": 8000, + "r": 7 + }, + { + "x": 340.815, + "y": 1549.1670000000001, + "dir": 3, + "b": 0.9999999999999999, + "z": -10.15, + "f": 8000, + "r": 7 + }, + { + "x": 343.815, + "y": 1549.1670000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 351.815, + "y": 1549.1670000000001, + "dir": 3, + "b": 0.9999999999999999, + "z": -10.15, + "f": 8000, + "r": 4 + }, + { + "x": 343.815, + "y": 1549.1670000000001, + "dir": 3, + "b": 0.9999999999999999, + "z": -10.15, + "f": 8000, + "r": 4 + }, + { + "x": 346.815, + "y": 1549.1670000000001, + "b": 0, + "z": -10.15, + "f": 8000 + }, + { + "x": 348.815, + "y": 1549.1670000000001, + "dir": 3, + "b": 0.9999999999999999, + "z": -10.15, + "f": 8000, + "r": 1 + }, + { + "x": 346.815, + "y": 1549.1670000000001, + "dir": 3, + "b": 0.9999999999999999, + "z": -10.15, + "f": 8000, + "r": 1 + }, + { + "x": 346.815, + "y": 1549.1670000000001, + "dir": 0, + "f": 10000, + "z": 30 + } + ] + }, + { + "processItemInfo": { + "code": "C", + "order": "KnifeMove", + "block": { + "blockNo": "25044454401", + "cutLength": 799, + "cutWidth": 499 + }, + "knife": { + "diameter": 6 + } + }, + "list": [ + { + "x": 307.756, + "y": 1336.8840000000002, + "dir": 0, + "z": 30, + "f": 10000 + }, + { + "x": 307.756, + "y": 1336.8840000000002, + "dir": 0, + "z": 20, + "f": 10000 + }, + { + "x": 307.756, + "y": 1336.8840000000002, + "dir": 1, + "z": -2, + "f": 8000 + }, + { + "x": 307.756, + "y": 1336.8840000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 387.874, + "y": 1336.8840000000002, + "dir": 2, + "b": -0.9999999999999999, + "z": -2, + "f": 8000, + "r": 40.059 + }, + { + "x": 307.756, + "y": 1336.8840000000002, + "dir": 2, + "b": -0.9999999999999999, + "z": -2, + "f": 8000, + "r": 40.059 + }, + { + "x": 310.756, + "y": 1336.8840000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 384.874, + "y": 1336.8840000000002, + "dir": 3, + "b": 0.9999999999999999, + "z": -2, + "f": 8000, + "r": 37.059 + }, + { + "x": 310.756, + "y": 1336.8840000000002, + "dir": 3, + "b": 0.9999999999999999, + "z": -2, + "f": 8000, + "r": 37.059 + }, + { + "x": 316.844, + "y": 1334.5380000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 328.64599999999996, + "y": 1343.1130000000003, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 324.138, + "y": 1356.987, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 316.844, + "y": 1334.5380000000002, + "dir": 3, + "b": 0.1973885948611474, + "z": -2, + "f": 8000, + "r": 31.059 + }, + { + "x": 314.629, + "y": 1329.2210000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 332.173, + "y": 1341.967, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 325.472, + "y": 1362.5910000000001, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 314.629, + "y": 1329.2210000000002, + "dir": 3, + "b": 0.27735861872683165, + "z": -2, + "f": 8000, + "r": 34.059 + }, + { + "x": 314.33299999999997, + "y": 1329.005, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 316.096, + "y": 1323.5780000000002, + "dir": 3, + "b": 0.7265425280053575, + "z": -2, + "f": 8000, + "r": 3 + }, + { + "x": 338.148, + "y": 1323.5780000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 344.962, + "y": 1302.6060000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 350.668, + "y": 1302.6060000000002, + "dir": 3, + "b": 0.7265425280053642, + "z": -2, + "f": 8000, + "r": 3 + }, + { + "x": 357.48199999999997, + "y": 1323.5780000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 379.534, + "y": 1323.5780000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 381.297, + "y": 1329.005, + "dir": 3, + "b": 0.7265425280053541, + "z": -2, + "f": 8000, + "r": 3 + }, + { + "x": 363.457, + "y": 1341.967, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 370.272, + "y": 1362.9390000000003, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 365.655, + "y": 1366.2930000000001, + "dir": 3, + "b": 0.7265425280053606, + "z": -2, + "f": 8000, + "r": 3 + }, + { + "x": 347.815, + "y": 1353.332, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 329.975, + "y": 1366.2930000000001, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 325.35799999999995, + "y": 1362.9390000000003, + "dir": 3, + "b": 0.7265425280053635, + "z": -2, + "f": 8000, + "r": 3 + }, + { + "x": 332.173, + "y": 1341.967, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 314.33299999999997, + "y": 1329.005, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 314.33299999999997, + "y": 1329.005, + "dir": 0, + "f": 10000, + "z": 30 + } + ] + }, + { + "processItemInfo": { + "code": "C", + "order": "KnifeMove", + "block": { + "blockNo": "25044454401", + "cutLength": 799, + "cutWidth": 499 + }, + "knife": { + "diameter": 6 + } + }, + "list": [ + { + "x": 316.462, + "y": 1323.5780000000002, + "dir": 0, + "z": 30, + "f": 10000 + }, + { + "x": 316.462, + "y": 1323.5780000000002, + "dir": 0, + "z": 20, + "f": 10000 + }, + { + "x": 316.462, + "y": 1323.5780000000002, + "dir": 1, + "z": -2, + "f": 8000 + }, + { + "x": 316.462, + "y": 1323.5780000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 344.849, + "y": 1302.9540000000002, + "dir": 3, + "b": 0.2773586187268403, + "z": -2, + "f": 8000, + "r": 34.059 + }, + { + "x": 338.148, + "y": 1323.5780000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 316.462, + "y": 1323.5780000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 321.38, + "y": 1320.5780000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 340.476, + "y": 1306.7050000000002, + "dir": 3, + "b": 0.1973885948611564, + "z": -2, + "f": 8000, + "r": 31.059 + }, + { + "x": 335.96799999999996, + "y": 1320.5780000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 321.38, + "y": 1320.5780000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 327.453, + "y": 1317.5780000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 335.746, + "y": 1311.553, + "dir": 3, + "b": 0.09210362030141409, + "z": -2, + "f": 8000, + "r": 28.059 + }, + { + "x": 333.788, + "y": 1317.5780000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 327.453, + "y": 1317.5780000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 327.453, + "y": 1317.5780000000002, + "dir": 0, + "f": 10000, + "z": 30 + } + ] + }, + { + "processItemInfo": { + "code": "C", + "order": "KnifeMove", + "block": { + "blockNo": "25044454401", + "cutLength": 799, + "cutWidth": 499 + }, + "knife": { + "diameter": 6 + } + }, + "list": [ + { + "x": 319.994, + "y": 1340.5350000000003, + "dir": 0, + "z": 30, + "f": 10000 + }, + { + "x": 319.994, + "y": 1340.5350000000003, + "dir": 0, + "z": 20, + "f": 10000 + }, + { + "x": 319.994, + "y": 1340.5350000000003, + "dir": 1, + "z": -2, + "f": 8000 + }, + { + "x": 319.994, + "y": 1340.5350000000003, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 325.119, + "y": 1344.2590000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 323.162, + "y": 1350.284, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 319.994, + "y": 1340.5350000000003, + "dir": 3, + "b": 0.09210362030140445, + "z": -2, + "f": 8000, + "r": 28.059 + }, + { + "x": 319.994, + "y": 1340.5350000000003, + "dir": 0, + "f": 10000, + "z": 30 + } + ] + }, + { + "processItemInfo": { + "code": "C", + "order": "KnifeMove", + "block": { + "blockNo": "25044454401", + "cutLength": 799, + "cutWidth": 499 + }, + "knife": { + "diameter": 6 + } + }, + "list": [ + { + "x": 330.27099999999996, + "y": 1366.0780000000002, + "dir": 0, + "z": 30, + "f": 10000 + }, + { + "x": 330.27099999999996, + "y": 1366.0780000000002, + "dir": 0, + "z": 20, + "f": 10000 + }, + { + "x": 330.27099999999996, + "y": 1366.0780000000002, + "dir": 1, + "z": -2, + "f": 8000 + }, + { + "x": 330.27099999999996, + "y": 1366.0780000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 347.815, + "y": 1353.332, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 365.359, + "y": 1366.0780000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 330.27099999999996, + "y": 1366.0780000000002, + "dir": 3, + "b": 0.27735861872682543, + "z": -2, + "f": 8000, + "r": 34.059 + }, + { + "x": 336.013, + "y": 1365.6140000000003, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 347.815, + "y": 1357.0400000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 359.61699999999996, + "y": 1365.6140000000003, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 336.013, + "y": 1365.6140000000003, + "dir": 3, + "b": 0.1973885948611406, + "z": -2, + "f": 8000, + "r": 31.059 + }, + { + "x": 342.69, + "y": 1364.4720000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 347.815, + "y": 1360.748, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 352.94, + "y": 1364.4720000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 342.69, + "y": 1364.4720000000002, + "dir": 3, + "b": 0.09210362030139656, + "z": -2, + "f": 8000, + "r": 28.059 + }, + { + "x": 342.69, + "y": 1364.4720000000002, + "dir": 0, + "f": 10000, + "z": 30 + } + ] + }, + { + "processItemInfo": { + "code": "C", + "order": "KnifeMove", + "block": { + "blockNo": "25044454401", + "cutLength": 799, + "cutWidth": 499 + }, + "knife": { + "diameter": 6 + } + }, + "list": [ + { + "x": 363.457, + "y": 1341.967, + "dir": 0, + "z": 30, + "f": 10000 + }, + { + "x": 363.457, + "y": 1341.967, + "dir": 0, + "z": 20, + "f": 10000 + }, + { + "x": 363.457, + "y": 1341.967, + "dir": 1, + "z": -2, + "f": 8000 + }, + { + "x": 363.457, + "y": 1341.967, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 381.001, + "y": 1329.2210000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 370.158, + "y": 1362.5910000000001, + "dir": 3, + "b": 0.27735861872683215, + "z": -2, + "f": 8000, + "r": 34.059 + }, + { + "x": 363.457, + "y": 1341.967, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 366.984, + "y": 1343.1130000000003, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 378.78599999999994, + "y": 1334.5380000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 371.49199999999996, + "y": 1356.987, + "dir": 3, + "b": 0.19738859486114788, + "z": -2, + "f": 8000, + "r": 31.059 + }, + { + "x": 366.984, + "y": 1343.1130000000003, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 370.51099999999997, + "y": 1344.2590000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 375.63599999999997, + "y": 1340.5350000000003, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 372.46799999999996, + "y": 1350.284, + "dir": 3, + "b": 0.09210362030140512, + "z": -2, + "f": 8000, + "r": 28.059 + }, + { + "x": 370.51099999999997, + "y": 1344.2590000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 370.51099999999997, + "y": 1344.2590000000002, + "dir": 0, + "f": 10000, + "z": 30 + } + ] + }, + { + "processItemInfo": { + "code": "C", + "order": "KnifeMove", + "block": { + "blockNo": "25044454401", + "cutLength": 799, + "cutWidth": 499 + }, + "knife": { + "diameter": 6 + } + }, + "list": [ + { + "x": 357.48199999999997, + "y": 1323.5780000000002, + "dir": 0, + "z": 30, + "f": 10000 + }, + { + "x": 357.48199999999997, + "y": 1323.5780000000002, + "dir": 0, + "z": 20, + "f": 10000 + }, + { + "x": 357.48199999999997, + "y": 1323.5780000000002, + "dir": 1, + "z": -2, + "f": 8000 + }, + { + "x": 357.48199999999997, + "y": 1323.5780000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 350.78099999999995, + "y": 1302.9540000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 379.168, + "y": 1323.5780000000002, + "dir": 3, + "b": 0.2773586187268398, + "z": -2, + "f": 8000, + "r": 34.059 + }, + { + "x": 357.48199999999997, + "y": 1323.5780000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 359.662, + "y": 1320.5780000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 355.154, + "y": 1306.7050000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 374.25, + "y": 1320.5780000000002, + "dir": 3, + "b": 0.19738859486115573, + "z": -2, + "f": 8000, + "r": 31.059 + }, + { + "x": 359.662, + "y": 1320.5780000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 361.842, + "y": 1317.5780000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 359.884, + "y": 1311.553, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 368.177, + "y": 1317.5780000000002, + "dir": 3, + "b": 0.09210362030141397, + "z": -2, + "f": 8000, + "r": 28.059 + }, + { + "x": 361.842, + "y": 1317.5780000000002, + "b": 0, + "z": -2, + "f": 8000 + }, + { + "x": 361.842, + "y": 1317.5780000000002, + "dir": 0, + "f": 10000, + "z": 30 + } + ] + }, + { + "processItemInfo": { + "code": "C", + "order": "KnifeMove", + "block": { + "blockNo": "25044454403", + "cutLength": 1085.41, + "cutWidth": 1141.268 + }, + "knife": { + "diameter": 6 + } + }, + "list": [ + { + "x": 387.34499999999997, + "y": 337.415, + "dir": 0, + "z": 30, + "f": 10000 + }, + { + "x": 387.34499999999997, + "y": 337.415, + "dir": 0, + "z": 18, + "f": 10000 + }, + { + "x": 387.34499999999997, + "y": 337.415, + "dir": 1, + "z": -10, + "f": 8000 + }, + { + "x": 387.34499999999997, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 410.873, + "y": 409.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 734.054, + "y": 409.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 757.581, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 734.054, + "y": 265.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 410.873, + "y": 265.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 387.34499999999997, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 390.5, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 413.053, + "y": 268.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 731.874, + "y": 268.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 754.427, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 731.874, + "y": 406.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 413.053, + "y": 406.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 390.5, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 393.654, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 415.23199999999997, + "y": 271.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 729.695, + "y": 271.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 751.273, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 729.695, + "y": 403.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 415.23199999999997, + "y": 403.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 393.654, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 396.80899999999997, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 417.412, + "y": 274.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 727.515, + "y": 274.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 748.118, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 727.515, + "y": 400.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 417.412, + "y": 400.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 396.80899999999997, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 399.963, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 419.591, + "y": 277.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 725.335, + "y": 277.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 744.9639999999999, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 725.335, + "y": 397.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 419.591, + "y": 397.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 399.963, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 403.117, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 421.771, + "y": 280.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 723.156, + "y": 280.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 741.809, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 723.156, + "y": 394.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 421.771, + "y": 394.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 403.117, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 406.272, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 423.951, + "y": 283.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 720.976, + "y": 283.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 738.655, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 720.976, + "y": 391.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 423.951, + "y": 391.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 406.272, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 409.426, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 426.13, + "y": 286.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 718.796, + "y": 286.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 735.501, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 718.796, + "y": 388.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 426.13, + "y": 388.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 409.426, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 412.58, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 428.31, + "y": 289.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 716.617, + "y": 289.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 732.346, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 716.617, + "y": 385.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 428.31, + "y": 385.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 412.58, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 415.735, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 430.49, + "y": 292.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 714.437, + "y": 292.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 729.192, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 714.437, + "y": 382.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 430.49, + "y": 382.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 415.735, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 418.889, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 432.669, + "y": 295.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 712.258, + "y": 295.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 726.037, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 712.258, + "y": 379.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 432.669, + "y": 379.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 418.889, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 422.044, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 434.849, + "y": 298.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 710.078, + "y": 298.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 722.883, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 710.078, + "y": 376.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 434.849, + "y": 376.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 422.044, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 425.198, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 437.028, + "y": 301.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 707.898, + "y": 301.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 719.729, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 707.898, + "y": 373.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 437.028, + "y": 373.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 425.198, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 428.352, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 439.20799999999997, + "y": 304.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 705.719, + "y": 304.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 716.574, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 705.719, + "y": 370.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 439.20799999999997, + "y": 370.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 428.352, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 431.507, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 441.388, + "y": 307.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 703.539, + "y": 307.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 713.42, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 703.539, + "y": 367.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 441.388, + "y": 367.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 431.507, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 434.661, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 443.567, + "y": 310.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 701.359, + "y": 310.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 710.266, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 701.359, + "y": 364.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 443.567, + "y": 364.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 434.661, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 437.816, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 445.747, + "y": 313.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 699.18, + "y": 313.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 707.111, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 699.18, + "y": 361.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 445.747, + "y": 361.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 437.816, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 440.96999999999997, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 447.927, + "y": 316.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 697, + "y": 316.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 703.957, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 697, + "y": 358.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 447.927, + "y": 358.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 440.96999999999997, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 444.124, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 450.106, + "y": 319.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 694.821, + "y": 319.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 700.802, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 694.821, + "y": 355.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 450.106, + "y": 355.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 444.124, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 447.279, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 452.286, + "y": 322.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 692.641, + "y": 322.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 697.648, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 692.641, + "y": 352.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 452.286, + "y": 352.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 447.279, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 450.433, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 454.465, + "y": 325.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 690.461, + "y": 325.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 694.494, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 690.461, + "y": 349.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 454.465, + "y": 349.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 450.433, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 453.587, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 456.645, + "y": 328.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 688.282, + "y": 328.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 691.3389999999999, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 688.282, + "y": 346.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 456.645, + "y": 346.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 453.587, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 456.742, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 458.825, + "y": 331.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 686.102, + "y": 331.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 688.185, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 686.102, + "y": 343.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 458.825, + "y": 343.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 456.742, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 459.896, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 461.004, + "y": 334.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 683.922, + "y": 334.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 685.03, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 683.922, + "y": 340.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 461.004, + "y": 340.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 459.896, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 463.051, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 463.18399999999997, + "y": 337.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 681.743, + "y": 337.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 681.876, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 681.743, + "y": 337.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 463.18399999999997, + "y": 337.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 463.051, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 463.051, + "y": 337.415, + "dir": 0, + "f": 10000, + "z": 30 + } + ] + }, + { + "processItemInfo": { + "code": "C", + "order": "KnifeMove", + "block": { + "blockNo": "25044454403", + "cutLength": 1085.41, + "cutWidth": 1141.268 + }, + "knife": { + "diameter": 0 + } + }, + "list": [ + { + "x": 779.826, + "y": 472.825, + "dir": 0, + "z": 30, + "f": 10000 + }, + { + "x": 779.826, + "y": 472.825, + "dir": 0, + "z": 18, + "f": 10000 + }, + { + "x": 779.826, + "y": 472.825, + "dir": 1, + "z": -10, + "f": 8000 + }, + { + "x": 779.826, + "y": 472.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 365.101, + "y": 472.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 321.103, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 365.101, + "y": 202.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 779.826, + "y": 202.005, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 823.823, + "y": 337.415, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 779.826, + "y": 472.825, + "b": 0, + "z": -10, + "f": 8000 + }, + { + "x": 779.826, + "y": 472.825, + "dir": 0, + "f": 10000, + "z": 30 + } + ] + }, + { + "processItemInfo": { + "code": "MARK", + "order": "Mark", + "codeParams": "25044454404 cut block" + } + }, + { + "processItemInfo": { + "code": "C", + "order": "KnifeMove", + "block": { + "cutLength": 99, + "cutWidth": 165 + }, + "knife": { + "diameter": 6 + } + }, + "list": [ + { + "x": 1201.035, + "y": 1200.4350000000002, + "dir": 0, + "z": 30, + "f": 10000 + }, + { + "x": 1201.035, + "y": 1200.4350000000002, + "dir": 0, + "z": 18, + "f": 10000 + }, + { + "x": 1201.035, + "y": 1200.4350000000002, + "dir": 1, + "z": -18, + "f": 8000 + }, + { + "x": 1201.035, + "y": 1300.4350000000002, + "dir": 1, + "z": -18, + "f": 8000 + }, + { + "x": 1035.035, + "y": 1300.4350000000002, + "dir": 1, + "z": -18, + "f": 8000 + }, + { + "x": 1035.035, + "y": 1200.4350000000002, + "dir": 1, + "z": -18, + "f": 8000 + }, + { + "x": 1201.035, + "y": 1200.4350000000002, + "dir": 1, + "z": -18, + "f": 10000 + }, + { + "x": 1201.035, + "y": 1200.4350000000002, + "dir": 0, + "z": 30, + "f": 10000 + } + ] + }, + { + "processItemInfo": { + "code": "MARK", + "order": "Mark", + "codeParams": "25044454405 cut block" + } + }, + { + "processItemInfo": { + "code": "C", + "order": "KnifeMove", + "block": { + "cutLength": 100, + "cutWidth": 165 + }, + "knife": { + "diameter": 6 + } + }, + "list": [ + { + "x": 1201.035, + "y": 1094.4250000000002, + "dir": 0, + "z": 30, + "f": 10000 + }, + { + "x": 1201.035, + "y": 1094.4250000000002, + "dir": 0, + "z": 18, + "f": 10000 + }, + { + "x": 1201.035, + "y": 1094.4250000000002, + "dir": 1, + "z": -18, + "f": 8000 + }, + { + "x": 1201.035, + "y": 1194.4250000000002, + "dir": 1, + "z": -18, + "f": 8000 + }, + { + "x": 1035.035, + "y": 1194.4250000000002, + "dir": 1, + "z": -18, + "f": 8000 + }, + { + "x": 1035.035, + "y": 1094.4250000000002, + "dir": 1, + "z": -18, + "f": 8000 + }, + { + "x": 1201.035, + "y": 1094.4250000000002, + "dir": 1, + "z": -18, + "f": 10000 + }, + { + "x": 1201.035, + "y": 1094.4250000000002, + "dir": 0, + "z": 30, + "f": 10000 + } + ] + }, + { + "processItemInfo": { + "code": "MARK", + "order": "Mark", + "codeParams": "25044454400 cut block" + } + }, + { + "processItemInfo": { + "code": "C", + "order": "KnifeMove", + "block": { + "cutLength": 705.342, + "cutWidth": 350 + }, + "knife": { + "diameter": 6 + } + }, + "list": [ + { + "x": 679.025, + "y": 1144.4250000000002, + "dir": 0, + "z": 30, + "f": 10000 + }, + { + "x": 679.025, + "y": 1144.4250000000002, + "dir": 0, + "z": 18, + "f": 10000 + }, + { + "x": 679.025, + "y": 1144.4250000000002, + "dir": 1, + "z": -18, + "f": 8000 + }, + { + "x": 729.025, + "y": 1094.4250000000002, + "dir": 3, + "r": 50.00000000000002, + "b": 0.41421356237309476, + "z": -18, + "f": 8000 + }, + { + "x": 1029.025, + "y": 1094.4250000000002, + "dir": 1, + "z": -18, + "f": 8000 + }, + { + "x": 1029.025, + "y": 1799.7670000000003, + "dir": 1, + "z": -18, + "f": 8000 + }, + { + "x": 679.025, + "y": 1799.7670000000003, + "dir": 1, + "z": -18, + "f": 8000 + }, + { + "x": 679.025, + "y": 1144.4250000000002, + "dir": 1, + "z": -18, + "f": 10000 + }, + { + "x": 679.025, + "y": 1144.4250000000002, + "dir": 0, + "z": 30, + "f": 10000 + } + ] + }, + { + "processItemInfo": { + "code": "MARK", + "order": "Mark", + "codeParams": "25044454402 cut block" + } + }, + { + "processItemInfo": { + "code": "C", + "order": "KnifeMove", + "block": { + "cutLength": 1023.711, + "cutWidth": 165 + }, + "knife": { + "diameter": 6 + } + }, + "list": [ + { + "x": 169.005, + "y": 1094.4250000000002, + "dir": 0, + "z": 30, + "f": 10000 + }, + { + "x": 169.005, + "y": 1094.4250000000002, + "dir": 0, + "z": 6, + "f": 10000 + }, + { + "x": 169.005, + "y": 1094.4250000000002, + "dir": 1, + "z": -6, + "f": 8000 + }, + { + "x": 169.005, + "y": 2118.1360000000004, + "dir": 1, + "z": -6, + "f": 8000 + }, + { + "x": 3.005, + "y": 2118.1360000000004, + "dir": 1, + "z": -6, + "f": 8000 + }, + { + "x": 3.005, + "y": 1094.4250000000002, + "dir": 1, + "z": -6, + "f": 8000 + }, + { + "x": 169.005, + "y": 1094.4250000000002, + "dir": 1, + "z": -6, + "f": 10000 + }, + { + "x": 169.005, + "y": 1094.4250000000002, + "dir": 0, + "z": 30, + "f": 10000 + } + ] + }, + { + "processItemInfo": { + "code": "MARK", + "order": "Mark", + "codeParams": "25044454401 cut block" + } + }, + { + "processItemInfo": { + "code": "C", + "order": "KnifeMove", + "block": { + "cutLength": 799, + "cutWidth": 499 + }, + "knife": { + "diameter": 6 + } + }, + "list": [ + { + "x": 674.015, + "y": 1094.4250000000002, + "dir": 0, + "z": 30, + "f": 10000 + }, + { + "x": 674.015, + "y": 1094.4250000000002, + "dir": 0, + "z": 20, + "f": 10000 + }, + { + "x": 674.015, + "y": 1094.4250000000002, + "dir": 1, + "z": -20, + "f": 8000 + }, + { + "x": 674.015, + "y": 1894.4250000000002, + "dir": 1, + "z": -20, + "f": 8000 + }, + { + "x": 174.015, + "y": 1894.4250000000002, + "dir": 1, + "z": -20, + "f": 8000 + }, + { + "x": 174.015, + "y": 1094.4250000000002, + "dir": 1, + "z": -20, + "f": 8000 + }, + { + "x": 674.015, + "y": 1094.4250000000002, + "dir": 1, + "z": -20, + "f": 10000 + }, + { + "x": 674.015, + "y": 1094.4250000000002, + "dir": 0, + "z": 30, + "f": 10000 + } + ] + }, + { + "processItemInfo": { + "code": "MARK", + "order": "Mark", + "codeParams": "25044454403 cut block" + } + }, + { + "processItemInfo": { + "code": "C", + "order": "KnifeMove", + "block": { + "cutLength": 1085.41, + "cutWidth": 1141.268 + }, + "knife": { + "diameter": 6 + } + }, + "list": [ + { + "x": 926.31, + "y": 3.005, + "dir": 0, + "z": 30, + "f": 10000 + }, + { + "x": 926.31, + "y": 3.005, + "dir": 0, + "z": 18, + "f": 10000 + }, + { + "x": 926.31, + "y": 3.005, + "dir": 1, + "z": -18, + "f": 8000 + }, + { + "x": 1144.2730000000001, + "y": 673.825, + "dir": 1, + "z": -18, + "f": 8000 + }, + { + "x": 573.639, + "y": 1088.4150000000002, + "dir": 1, + "z": -18, + "f": 8000 + }, + { + "x": 3.005, + "y": 673.825, + "dir": 1, + "z": -18, + "f": 8000 + }, + { + "x": 220.968, + "y": 3.005, + "dir": 1, + "z": -18, + "f": 8000 + }, + { + "x": 926.31, + "y": 3.005, + "dir": 1, + "z": -18, + "f": 10000 + }, + { + "x": 926.31, + "y": 3.005, + "dir": 0, + "z": 30, + "f": 10000 + } + ] + }, + { + "processItemInfo": { + "code": "FEND", + "order": "FEND" + } + } +]; + + + \ No newline at end of file diff --git a/src/processors/processCodeConverter/processCodeConverter.ts b/src/processors/processCodeConverter/processCodeConverter.ts new file mode 100644 index 0000000..47340f6 --- /dev/null +++ b/src/processors/processCodeConverter/processCodeConverter.ts @@ -0,0 +1,114 @@ +import { ConfigBase, ProcessorBase, ProcessorContext, IProcessingItem } from "cut-abstractions"; +import { NcConverter } from "../NcConverter/NcConverter"; + +/** + * 加工代码转换器 + */ +export class ProcessCodeConverterProc extends ProcessorBase { + get name(): string { + return 'ProcessCodeConverter'; + } + get version(): string { + return '1.0.0'; + } + + + /** 正在使用的解析器 */ + private _usedConverter?: NcConverter; + exec(context: ProcessorContext): Promise | void { + return new Promise(async (resolve, reject) => { + try { + resolve() + } catch (error) { + reject(error); + } + }); + } + + /** + * 精简指令 NC代码精简指令处理 + * 兼容注释的行处理 精简指令只处理G代码所在的行 + */ + handleNcSimpleCode(code: string) { + let arr = code.split('\n') + let objArr = arr.map((e, i) => { + let type = (!e.includes('//') && !e.includes('/**') || e.includes('"//')) ? 'code' : 'remark' + let temp = { + code: e, + index: i, + regList: e.match(/[XYZF]([-+]?\d*\.?\d+)/g) || [], + type + } + return temp + }) + let checkLines = objArr.filter(e => e.type == 'code') + + // 校验对象 存键值 + let targetObject: any = {} + for (const key in checkLines) { + let line = checkLines[key] + if (line.regList.length > 0) { + for (const regVal of line.regList) { + let reg = regVal.match(/([XYZF])([-+]?\d*\.?\d+)/) + if (!reg) { + + } + else { + let FullVal = reg[0] + let valKey = reg[1] + let val = reg[2] + if (Reflect.has(targetObject, valKey)) { + if (targetObject[valKey] == val) { + // 相同 需要精简操作 + objArr[line.index].code = objArr[line.index].code.replace(FullVal, ``) + } else { + // 不同 更新校验的值 + targetObject[valKey] = val + } + } else { + // 键值 没有 赋给 校验对象 + Reflect.set(targetObject, valKey, val) + } + } + + } + } + } + let newCode = objArr.map(e => e.code).join('\n') + // 这里 数据中莫名其妙多了个空格 处理下 + let list = newCode.split(' ').filter(e => e != '') + newCode = list.join(' ') + return newCode + } +} + +export type ProcessCodeConverterProcInput = { +} + +export type ProcessCodeConverterProcOutput = { + +} + +export declare class ProcessCodeConverterProcConfig extends ConfigBase { + +} +/** 加工流程类型 加工项与加工项直接的流程类型 */ +export enum ProcessStepType { + /** 开料加工 */ + blockProcess = "processBlock", + /** 修边加工 */ + blockBoardProcess = "processBlockBoard", + /** 孔加工 */ + holeProcess = "holeProcess", + /** 造型加工 */ + modelProcess = "modelProcess", + /** 槽加工 */ + grooveProcess = "grooveProcess" +} + +/** 单一加工项内的业务流程类型 */ +export enum ProcessItemStepType { + /** 快速定位 --空程移动 */ + knifeRapidMove = 'knifeRapidMove' + /** */ +} \ No newline at end of file diff --git a/src/utils/corsWorker.ts b/src/utils/corsWorker.ts new file mode 100644 index 0000000..922c63c --- /dev/null +++ b/src/utils/corsWorker.ts @@ -0,0 +1,25 @@ +export class CorsWorker { + private readonly url: string | URL; + private readonly options?: WorkerOptions; + + // Have this only to trick Webpack into properly transpiling + // the url address from the component which uses it + constructor(url: string | URL, options?: WorkerOptions) { + this.url = url; + this.options = options; + } + + async createWorker(): Promise { + if (import.meta.env.DEV) { // 修复调试模式 + return new Worker(this.url, this.options); + } + const f = await fetch(this.url); + const t = await f.text(); + const b = new Blob([t], { + type: 'application/javascript', + }); + const url = URL.createObjectURL(b); + const worker = new Worker(url, this.options); + return worker; + } +} diff --git a/src/utils/helper.array.ts b/src/utils/helper.array.ts new file mode 100644 index 0000000..f7aeb50 --- /dev/null +++ b/src/utils/helper.array.ts @@ -0,0 +1,116 @@ +import { AssignByPath, Resolve, type Paths, type PathValue } from "./helper.lang"; + +/** + * 将对象数组按指定字段分组,并返回分组结果的数组。 + * + * @template T - 输入数组中对象的类型。 + * @param data - 要分组的对象数组。 + * @param fields - 用于分组对象的键(字段)数组。 + * @param sort - 一个布尔值,指示是否按键对分组结果进行排序。默认为 `true`。 + * @param separator - 用于连接字段值以形成分组键的字符串。默认为 `'-'`。 + * @returns 分组结果的数组 + * + * @example + * ```typescript + * const data = [ + * { category: 'A', type: 'X', value: 10 }, + * { category: 'A', type: 'Y', value: 20 }, + * { category: 'B', type: 'X', value: 30 }, + * ]; + * const grouped = GroupBy(data, ['category', 'type']); + * console.log(grouped); + * // 输出: + * // [ + * // { + * // key: 'A-X', + * // keyList: ['A', 'X'], + * // value: [{ category: 'A', type: 'X', value: 10 }], + * // keyObj: { category: 'A', type: 'X' } + * // }, + * // { + * // key: 'A-Y', + * // keyList: ['A', 'Y'], + * // value: [{ category: 'A', type: 'Y', value: 20 }], + * // keyObj: { category: 'A', type: 'Y' } + * // }, + * // { + * // key: 'B-X', + * // keyList: ['B', 'X'], + * // value: [{ category: 'B', type: 'X', value: 30 }], + * // keyObj: { category: 'B', type: 'X' } + * // } + * // ] + * ``` + */ +export function GroupBy)[]>( + data: T[], + fields: TKeys, + sort = true, + separator = '-', +) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const groupList = {} as any; + const groupArray = [] as IGrouping }>[]; + if (fields.length === 0) return []; + for (const item of data) { + const keyList = fields.map((field) => Resolve(item, field)); + const key = keyList.join(separator); + groupList[key] = groupList[key] || []; + groupList[key].push(item); + groupList[key].keyList = keyList; + const keyObj = {} as T; + fields.forEach((t) => { + AssignByPath(keyObj, t, Resolve(item, t) as PathValue); + }); + groupList[key].keyObj = keyObj; + } + for (const key in groupList) { + groupArray.push({ + key, + keyList: groupList[key].keyList, + value: groupList[key], + keyObj: groupList[key].keyObj, + }); + } + if (sort) + return groupArray.sort(function (a, b) { + return a.key.localeCompare(b.key, 'zh-CN', { numeric: true }); + }); + else return groupArray; +} + +/** + * 将对象数组按指定字段分组,并返回分组结果的数组。 + */ +export interface IGrouping { + /** + * 分组的键,若有多个键,则用连接符连接 + */ + key: string; + /** + * 分组的键列表 + */ + keyList: unknown[]; + /** + * 分组的对象数组 + */ + value: T[]; + /** + * 分组键对象,其属性名为分组键名,属性值为分组键 + */ + keyObj: TKeyRecord; +} + +declare global { + interface Array { + GroupBy: )[]>( + fields: TKeys, + sort?: boolean, + separator?: string, + ) => Array }>>; + } +} + +Array.prototype.GroupBy = function (fields, sort, separator) { + return GroupBy(this, fields, sort, separator); +}; diff --git a/src/utils/helper.async.ts b/src/utils/helper.async.ts new file mode 100644 index 0000000..1b45624 --- /dev/null +++ b/src/utils/helper.async.ts @@ -0,0 +1,21 @@ +/** + * 异步等待 + * @param ms 等待毫秒数 + * @param value 等待完成后返回的值 + * @returns + */ +export function AsyncDelay(ms: number, value?: T) { + return new Promise((resolve) => setTimeout(resolve, ms, value)); +} + +export async function AsyncWaitUntil(predicate: () => boolean, waitTime = 100) { + while (!predicate()) { + await AsyncDelay(waitTime); + } +} + +export async function AsyncWaitForChange(obj: () => any, waitTime = 100) { + while (obj() === undefined) { + await AsyncDelay(waitTime); + } +} \ No newline at end of file diff --git a/src/utils/helper.lang.ts b/src/utils/helper.lang.ts new file mode 100644 index 0000000..84034a7 --- /dev/null +++ b/src/utils/helper.lang.ts @@ -0,0 +1,128 @@ +/** + * 检查枚举值中是否包含某个标志位 + * @param $enum 枚举值 + * @param flag 标志位 + * @returns 是否包含标志位 + */ +export function HasFlag($enum: number, ...flags: number[]) { + return flags.every(flag => ($enum & flag) === flag); +} + +/** + * 深拷贝 + * @param obj 对象 + * @returns 深拷贝后的对象 + */ +export function Clone(obj: T): T { + return JSON.parse(JSON.stringify(obj)); +} + +export function ToPercent(num: number, precision = 2) { + return (num * 100).toFixed(precision) + '%'; +} + + +/** 访问对象的成员 */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function Resolve>(obj: T, path: TPath): PathValue | T { + return path.split('.').reduce(function (item, key) { + return item ? (item as any)[key] : null; + }, obj); +} + +/** + * @description 根据字符串路径向对象深层嵌套的属性赋值。 + * 如果路径中的对象不存在,则会自动创建。 + * @param obj 要修改的对象。注意:这个函数会直接修改传入的对象(in-place mutation)。 + * @param path 属性路径字符串,例如 "a.b.c"。 + * @param value 要赋给目标属性的值。 + * + * @example + * const obj = { a: { b: { c: 1 } } }; + * AssignByPath(obj, "a.b.c", 2); + * console.log(obj); // { a: { b: { c: 2 } } } + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function AssignByPath>(obj: T, path: TPath, value: PathValue) { + const keys = path.split("."); + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let current: any = obj; + + for (let i = 0; i < keys.length; i++) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let key = keys[i]; + + // 如果当前层级的对象不存在,或者不是一个对象,就需要创建它 + // 这是一个关键步骤,确保路径是可写的 + if (current[key] === undefined || typeof current[key] !== 'object' || current[key] === null) { + // 检查下一个键是否是数字,来决定创建对象还是数组。 + // 这是一个启发式方法,对于像 'a.0.b' 这样的路径,它会创建 { a: [ { b: ... } ] } + // 注意:这个逻辑对于严格的类型安全来说是一个简化。 + // 我们的 Paths 类型目前不支持数字索引,所以这个逻辑是为了运行时健壮性。 + const nextKey = keys[i + 1]; + current[key] = /^\d+$/.test(nextKey) ? [] : {}; + } + + // 移动到下一层 + current = current[key]; + } + // 获取最后一个键,并进行赋值 + const lastKey = keys[keys.length - 1]; + current[lastKey] = value; +}; + +/** + * 检查对象是否是构造函数的直接实例(不检查继承关系) + * @param obj 对象 + * @param constructor 构造函数 + */ +export function IsDirectInstanceOf(obj: object, constructor: Function) { + // 确保 obj 是一个对象,并且 Constructor 是一个函数/类 + if (obj === null || typeof obj !== 'object' && typeof obj !== 'function') { + return false; + } + if (typeof constructor !== 'function') { + return false; + } + + // 比较对象的直接原型与构造函数的 prototype 属性 + return Object.getPrototypeOf(obj) === constructor.prototype; +} + +/** + * @description 递归生成对象所有可能的属性访问路径。 + * 类型T必须是object,不支持数组对象 + * 例如:{ a: { b: string } } -> "a" | "a.b" + */ +export type Paths = T extends object + ? { + [K in keyof T]: + // K 本身是一个有效的路径 + | `${K & string}` + // 如果 T[K] 也是一个对象,则递归地为其生成路径,并加上前缀 "K." + // 使用NonNullable来解决T[K]可能为null | undefined的情况 + | (NonNullable extends object ? + // 对于数组类型的子对象,不进行解析,防止TS类型死循环 + NonNullable extends any[] ? never + : `${K & string}.${NonNullable>}` : never); + }[keyof T] // 取出所有可能路径的联合类型 + : never; + +/** +* @description 根据给定的路径字符串 P,在对象 T 中查找并返回对应值的类型。 +* 例如:PathValue<{ a: { b: string } }, "a.b"> -> string +*/ +export type PathValue = + // 使用条件类型和 infer 来分割路径字符串 P + P extends `${infer Key}.${infer Rest}` + ? // 如果 Key 是 T 的一个键 + Key extends keyof T + ? // 则在 T[Key] 类型中递归查找剩余路径 Rest 的值类型 + NonNullable> + : never + : // 如果路径 P 不包含 ".", 说明是最后一层 + P extends keyof T + ? // 直接返回 T[P] 的类型 + T[P] + : never; \ No newline at end of file diff --git a/src/utils/helper.string.ts b/src/utils/helper.string.ts new file mode 100644 index 0000000..2481add --- /dev/null +++ b/src/utils/helper.string.ts @@ -0,0 +1,33 @@ +export function IsNullOrEmpty(str?: string | null) { + return str === null || str === undefined || str === ""; +} + +export function IsNullOrWhitespace(str?: string | null) { + return str === null || str === undefined || str.trim() === ""; +} + +declare global { + interface String { + /** 将字符串转换为 camelCase 格式 */ + ToCamelCase(): string + } +} + +String.prototype.ToCamelCase = function (this: string) { + return ToCamelCase(this); +} + +/** + * 将字符串转换为 camelCase 格式 + * @param str 输入字符串 + * @returns camelCase 格式的字符串 + */ +export function ToCamelCase(str: string): string { + return str + .replace(/([-_][a-z])/g, group => + group.toUpperCase() + .replace('-', '') + .replace('_', '') + ) + .replace(/^[A-Z]/, firstChar => firstChar.toLowerCase()); +} diff --git a/src/utils/helper.version.ts b/src/utils/helper.version.ts new file mode 100644 index 0000000..283d35c --- /dev/null +++ b/src/utils/helper.version.ts @@ -0,0 +1,35 @@ +export class Version { + major: number; + minor: number; + build: number; + revision: number; + toString(): string { + return `${this.major}.${this.minor}.${this.build}.${this.revision}` + } + constructor(major: number, minor: number, build: number = 0, revision: number = 0) { + this.major = major; + this.minor = minor; + this.build = build; + this.revision = revision; + } + + compareTo(obj: Version): number { + if (this.major > obj.major) return 1; + if (this.major < obj.major) return -1; + if (this.minor > obj.minor) return 1; + if (this.minor < obj.minor) return -1; + if (this.build > obj.build) return 1; + if (this.build < obj.build) return -1; + if (this.revision > obj.revision) return 1; + if (this.revision < obj.revision) return -1; + return 0; + } +} + +export function parseVersion(verStr: string): Version { + const arr = verStr.split(".").map(c => parseInt(c)); + if (arr.length < 2 || arr.length > 4) + throw new Error("无效的版本号"); + + return new Version(arr[0], arr[1], arr[2] || 0, arr[3] || 0); +} \ No newline at end of file diff --git a/src/utils/index.ts b/src/utils/index.ts new file mode 100644 index 0000000..436b23a --- /dev/null +++ b/src/utils/index.ts @@ -0,0 +1,14 @@ +/** + * @package @mes-processors/libs/utils + * @author CZY + * @description 帮助类库,这个导出仅供内部使用,不在打包中暴露,在这个文件中使用导出时,不要在路径中使用'@',否则模块无法加载 + */ + + +export * from "./corsWorker"; +export * from "./helper.array"; +export * from "./helper.async"; +export * from "./helper.lang"; +export * from "./helper.string"; +export * from "./helper.version"; +export * from "./utilTypes"; \ No newline at end of file diff --git a/src/utils/utilTypes.ts b/src/utils/utilTypes.ts new file mode 100644 index 0000000..c2cc302 --- /dev/null +++ b/src/utils/utilTypes.ts @@ -0,0 +1,27 @@ +/** + * 读取泛型T中的KEY作为类型,支持嵌套属性 + */ +export type NestedKey = { + [K in keyof T & string]: T[K] extends object ? `${K}` | `${K}.${NestedKey}` : `${K}`; +}[keyof T & string]; + +/** + * 读取泛型T中的VALUE作为类型,支持嵌套属性,你可能需要把类型T设为标量(`as const`) + */ +export type NestedValue = { + [K in keyof T & string]: T[K] extends object ? T[K] | NestedValue : T[K]; +}[keyof T & string]; + +/** + * 将泛型T中的属性P设置为必选 + */ +export type WithRequired = T & { [P in K]-?: T[P] } + +/** + * 递归地将泛型T的所有属性变为只读 + */ +export type DeepReadonly = T extends object + ? { + readonly [P in keyof T]: DeepReadonly; + } + : T; diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 0000000..ae94125 --- /dev/null +++ b/tsconfig.app.json @@ -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/**" + ] +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..dcf15c3 --- /dev/null +++ b/tsconfig.node.json @@ -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"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..13cf66c --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,34 @@ +/// +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: 'MesProcessors', + fileName(format) { + return `mes-processors.${format}.js` + }, + formats: ['es', 'umd', 'iife'] + } + }, + esbuild: { + drop: process.env.NODE_ENV === 'production' ? ['console', 'debugger'] : [], + }, +}) \ No newline at end of file