@mes-fe/nest (0.1.0)
Installation
@mes-fe:registry=http://chenfeng.tech:3000/api/packages/MES-FE/npm/npm install @mes-fe/nest@0.1.0"@mes-fe/nest": "0.1.0"About this package
特性列表: 余料利用 自动余料分析 异形嵌套 异形网洞利用
代码层: 多线程并行运算,发挥所有cpu核心潜力,可同时优化多个优化实例. c++ wasm加速,使用c++进行计算,加速运行效率. 更多缓存进行快速过滤重复放置计算. 路径复用,更少的内存占用,更多缓存命中.
#路径复用
为了保证Path被复用,Part初始化 Path 时,先将 Path 移动到 0 点,同时记录移动的向量 OriginMinPoint,保存在Part中.
这样保证了不同Part使用相同 Path 时,可以有不同的初始化位置.
在旋转 Path 后,将 Path 移动到 0 点,并且记录移动的向量 OriginMinPoint,保存在 Path 中.
对于Path,保持原始的Path和旋转后的Path,旋转后的Path保存了原始的Path的 id,当Path要获得 NFP 时,可以去抓原始的Path的 NFP,然后转换到新的 NFP
已经PathA 和PathB的 NFP.
求PathA_RO 和 PathB_RO 的 NFP。
先一起旋转,NFP 也一起旋转。
移动 A,NFP 也移动。
移动 B,NFP 也移动。
PartPath 保存了原始曲线变换到 0 点并旋转的变换矩阵?
Path 只保存原始 Path 到本 Path 的旋转值和移动向量。
PartState 保存了曲线变换到 0 点的矩阵。
Path (保存了原始曲线和 原始曲线变换到当前 path 的矩阵(如果有的话)
进行多线程计算的数据
PartData: {id, PathStates,holes,}
PathState:[{id,ro,m},...]
holes:PathStates;
PathStates;
Paths: [Path, Path, Path];
Path: {pts, origin:{id,ro,m},}
回传数据 [{id,stateIndex,position,containerID}] containerid 负数表示构造,大于等于 0 表示在网洞中?
保存 Path IsHole IsOut 以便保存 NFP
性能测试结果: 布尔运算,c++更快 NFP运算,C++更快 点在曲线内,c++更快 清理:js更快
#如何使用?
//清理缓存,这个缓存是全局的
PathGeneratorSingle.Clear();
NestCache.Clear();
DefaultBin.InsideNFPCache = {};
//构造Part
let part = new Part().Init(...);//初始化构造N个旋转角度的PartState
let parts:Part[] = [...]; //构造所有的Part
//注册bin
let binPath = DefaultBin;
binPath.Id = undefined; //清除这个缓存
PathGeneratorSingle.RegisterId(binPath);
//例子1.使用Worker?
let db = new NestDatabase();
db.Paths = PathGeneratorSingle.paths;
db.Parts = parts;
db.Bin = DefaultBin
let f = new NestFiler();
db.WriteFile(f);//写入到文件中
let w = new Worker;
w.postMessage(f._datas);//Post给Worker
//然后进行回调,查看TestYHWorker.ts查看详情
//例子2.不使用WebWorker,在当前线程执行 TestYH2.ts查看详情
let m = new OptimizeMachine;//优化器
m.Bin = db.Bin; //指定Bin容器
m.PutParts(db.Parts);//把零件放上去
m.callBack = (i:Inv)=>{}//当有新结果时,回调
await m.Start();//启动这个
//适当的时候关闭它
m.Suspend();//关闭优化器
testYH 尾板优化
testYH 的主排料 Worker 在获得完整结果后立即回传,不再同步执行 50 轮尾板重排。板数相同且
局部更优的候选会发送给单独的 TailOptimizeWorker.worker.ts;该 Worker 每次执行一轮并持续运行,
找到更优尾板时立即回传。只有一张板时跳过尾板优化;主优化产生更少板候选时终止旧尾板 Worker,
旧代消息也不会应用。尾板状态在命令弹窗中独立显示,普通进度消息最多约每 17ms 更新一次。
WebCAD 当前性能配置固定使用 32 个主优化线程:testYH 启动 32 个 Web Worker,
testYH_WebSocket 请求 J20S 启动 32 个原生线程。尾板优化线程不计入这 32 个主线程。
在排料设置中选择“WASM 模式(浏览器本地实验)”后,testYH_WebSocket 不连接 J20S 服务,
而是在专用 Web Worker 中加载内置 PackingSolver WASM,并以 60 秒为一轮持续求解和回传更优结果。
点击停止会直接终止 Worker 及其 pthread。该构建使用 SharedArrayBuffer,部署环境必须返回
Cross-Origin-Opener-Policy: same-origin 和 Cross-Origin-Embedder-Policy: credentialless;开发服务器已配置这两个响应头。
credentialless 会去除跨域子资源请求中的 Cookie 等凭据,但不会像 require-corp 一样拦截未声明 CORP 的公开图片。
矩形与异形混合优化
WebSocket 模式遇到同时包含矩形和异形的任务时,除非排料算法明确选择 general,会自动启动混合优化:
- 通用 NFP 多线程持续优化全部零件;
- 每次产生新的全局最优结果后,分析其中只包含矩形零件的大板;
- 至少存在两张纯矩形大板时,锁定含异形的大板,将矩形零件交给 Hybrid 快速重排;
- 随后以短时间片调用 PackingSolver 深搜,把矩形结果与锁定大板重新合并;
- 合并结果通过重叠校验且适应度更优时立即回传 WebCAD。
混合线程的待处理队列只保留最新快照;新的 NFP 最优解会取消旧的矩形深搜。点击停止会同时停止 NFP、尾板和混合优化线程。进度窗口独立显示提取的纯矩形板数、矩形零件数、合并后板数和求解来源。
原生 WebSocket 的智能混合采用自适应线程调度:启动及通用异形优化刚产生更优结果后的 5 秒内,全部
计算线程用于通用异形优化;连续 5 秒没有改进后让出 4 个线程启动一个矩形深搜组;连续 20 秒没有
改进后约保留四分之一线程继续通用异形搜索,其余线程运行多个矩形深搜组。通用异形再次改进时会
取消旧矩形任务并恢复全速。暂停的通用异形线程保留种群、当前游标和共享 NFP 缓存,不会重新开始。
进度窗口根据 scheduleProgress.nfpWorkerCount 展示实际调度状态:减少线程时,被让出的线程先显示
“正在暂停”,完成当前单次放置后显示“已暂停”;当线程数为 0 时,汇总状态显示“通用 NFP:已暂停
(缓存已保留)”。恢复线程预算后,汇总和对应线程重新显示“运行中”。
当前第一版只重排完全不含异形零件的默认规格大板;余料、其他规格板、固定障碍和混合板内部的矩形
仍由通用 NFP 算法处理。
OtherContainers 表示有限数量、需要优先尽量填满的超级大板,与矩形深度优化的“默认板型可无限复制、
最小化板数”模型不同;只要任务中存在 OtherContainers,整项任务就不会进入矩形深度优化或混合矩形重排。
浏览器模式可在设置中选择“智能混合 WASM”。基础 WASM Worker 持续保留 NFP 种群与缓存;每次出现 新的 NFP 最优解后,由 C++ 提取至少两张纯矩形大板,并取消上一个矩形子任务。两个矩形 Worker 并行循环 PackingSolver 的不同搜索策略,结果回到基础 Worker 合并;只有完整、不丢件且适应度更优的 结果才应用到 WebCAD。点击停止会同时终止 NFP Worker 和矩形 Worker。
矩形 Worker 内部使用持久 PackingSolverOptimizer:Write2 数据只读取一次,两个 Worker 分别运行
PackingSolver 的不同 tree-search guide。单次深搜可长时间保留搜索树;每次刷新 incumbent 时 C++
回调会立即发送结果,不等待深搜结束。没有改善时不会重复发送相同结果;点击停止会直接终止 Worker。
浏览器 WASM 不再打包 PackingSolver。纯矩形输入由基础 J20S WASM 持续运行 Q1;混合输入由 NFP
持续优化,并在每个新快照上用 Q1 重排其中的纯矩形大板。原生 WebSocket 模式仍使用 PackingSolver
作为纯矩形深度优化器:Q1 只负责同步产生快速首解,随后按线程预算每 4 线程启动一组独立 Tree Search,
16 线程对应 4 组、32 线程对应 8 组。深搜期间暂停持续 Q1/Hybrid 和尾板线程,各组使用不同搜索顺序,
一轮结束后自动继续下一轮,直到用户停止。进度窗口显示深搜组数、当前组和轮次。
容器瑕疵位/固定占用区
默认板、其他规格板和余料统一使用 NestContainer 定义。PlacedPaths 中的轮廓表示板材损耗、
瑕疵或此前已经放置的零件;坐标使用 CAD 模型坐标。它们参与 NFP 和剩余面积判断,但不计入本次
排料利用率,也不会作为本次优化结果回传。
const db = new NestDatabase();
db.Paths = PathGeneratorSingle.paths;
db.Parts = parts;
db.Bin = defaultBin;
db.DefaultContainer.PlacedPaths.push({ Path: defectPath, X: 100, Y: 50 });
db.OtherBins = [largeBin];
db.OtherContainers[0].PlacedPaths.push({ Path: largeBinDefect, X: 20, Y: 30 });
db.OddmentsBins = [oddmentBin];
db.OddmentContainers[0].PlacedPaths.push({ Path: usedPath, X: 5, Y: 8 });
旧的 Bin、OtherBins、OddmentsBins 和 OddPlacedPaths 接口继续可用。完整 Worker 协议使用
NestDatabase v4,J20S Write2 紧凑协议使用 v2;紧凑协议读取端仍兼容没有默认板/其他板瑕疵位的 v1。
瑕疵面积已经覆盖整块容器时,该容器会被过滤;默认容器完全不可用时会直接报告输入错误,避免不断
创建必然无法放置的空容器。
testYH 选择余料时可以同时框选余料外框和内部孔洞:没有父轮廓的闭合曲线作为独立余料,完全位于
其内部的直接子轮廓自动作为该余料的瑕疵位。瑕疵位会按刀具半径向外扩张,并换算成相对余料外框的
局部坐标;只是相交、但没有完全包含的轮廓仍作为独立余料,不会被误判为瑕疵。
testYH 轮廓转换设置
执行 testYH 或 testYH_WebSocket 后,命令行首先显示 [设置(S)/继续(C)]。直接回车继续,输入
S 打开设置窗口。设置保存在本机,下次执行命令继续使用:
- 刀具半径:曲线和板件内外走刀轮廓的偏移距离;
- 矩形面积差阈值:
外接矩形面积 - 实际轮廓面积小于该值且轮廓点数大于 6 时简化为矩形,设为 0 关闭; - 最小孔洞面积:小于该值的非圆形板件内部孔洞不参与排料;所有孔(包括圆孔)面积低于 1000 都会作为无效轮廓过滤,配置设为 0 也不会关闭这项基础校验;
- 启用轮廓简化;
- 轮廓简化算法:可选择“保守贴合(新)”或“偏移强简化 + 包围盒裁剪(旧)”;
- 启用简化的最少候选顶点数;
- 保守贴合的最大贴合距离:简化结果与真实刀路之间允许的最大距离,设为 0 时不简化;
- 窄凹槽附加过滤宽度:实际过滤阈值为
刀具直径 + 此数值;默认刀具半径 3.5、附加值 10, 因而宽度小于约 17 的外轮廓凹槽会被填平; - 复杂轮廓最大简化时间:每个超过 120 点的保守贴合刀路允许使用的毫秒数,设为 0 时不限制时间;
- 旧版往返偏移距离:旧算法用于消除凹槽和碎细节的偏移距离,默认 20。
默认使用新的保守贴合算法。需要尽量减少顶点时,可以切换到旧版算法:先做往返偏移,再执行 Douglas–Peucker 和单侧误差补偿;最终结果会与原始真实刀路包围盒求交,因此不会再超过外刀路的 最大包围盒。旧版算法以点数更少和速度更快为优先,几何安全性仍弱于保守贴合算法。
测试命令 testConservativeSimplify 使用设置窗口中当前选择的算法,可以同时选择外框和内部轮廓,
默认按包含层级自动识别:黄色/绿色
分别表示外刀路及其简化结果,红色/青色分别表示内部网洞刀路及其简化结果。也可以在命令行强制把
全部选中轮廓按外轮廓或内部网洞测试。
testYH 和 testYH_WebSocket 在完成图形选择后,会把板件外轮廓、内部网洞、曲线零件和余料的
轮廓简化集中交给专用 Web Worker。主线程负责实体/OCS 归一化、真实刀路候选准备和最终 Part 构造,
两种算法的减点循环都由 Worker 执行;进度浮窗分别显示“准备刀路”和“后台简化”的完成数量、百分比、
当前轮廓点数变化与耗时,并允许取消本次转换。
Dependencies
Dependencies
| ID | Version |
|---|---|
| @cx/j20s-wasm | 0.1.4 |
| flatbush | ^4.4.0 |
| js-angusj-clipper | 1.3.1 |
| monotone-convex-hull-2d | ^1.0.1 |
| three | npm:three-cf@0.162.2 |