开源改变世界

刀路初始位置 #237

推推 grbl 3年前 (2023-02-02) 205次浏览
关闭
MitchBradley 打开了这个问题 2017 年 12 月 7 日 · 6条评论
关闭

刀路初始位置#237

MitchBradley 打开了这个问题 2017 年 12 月 7 日 · 6条评论

评论

刀路初始位置 #237

@cheton

一道设计题:

我在 cncjs-shopfloor-tablet 中添加了一个轻量级的 2D gcode 预览器。它建立在 gcode-interpreter / gcode-toolpath / gcode-parser 之上,使用 addLine 和 addArcCurve 方法来确定边界框并渲染到 2dcanvas 上。

问题是我想将 gcode-toolpath 的起始位置设置为当前机器位置,而不是让它在第一次调用时从 0,0,0 开始,在后续调用中从最后一个位置开始。作为第一次尝试,我更改了 gcode-toolpath,这样,如果其选项参数包含“position”属性,则位置从那里开始。

第一次运行良好,但为了让它在您稍后加载第二个 gcode 文件时运行,有必要创建一个新的 gcode 工具路径实例,让垃圾收集器担心旧的不再引用的实例。这是可行的,但似乎效率低下。有没有更好的设计模式?

我想从 Toolpath 导出一个 setPosition 方法,但我认为这样做需要更改 Toolpath 的构造函数以返回“this”而不是“new Interpreter(…)”。

您推荐的解决方案是什么?

刀路初始位置 #237
合作者

每次加载新的 G 代码文件时,都需要创建一个新的刀具路径实例。您需要做的就是确保您的代码不再引用旧实例(例如toolpaths = nulltoolpaths = [])以避免内存泄漏。由于垃圾收集是不可预测的,最好的方法是让垃圾收集器在浏览器确定最合适的时间点运行。

Three.js 提供了translate改变Object3D位置的方法,所以你可以随时设置相对位置而不用修改刀具路径:

// https://github.com/cncjs/cncjs/blob/master/src/web/widgets/Visualizer/Visualizer.jsx#L69-L78
pivotPoint = new PivotPoint3({ x: 0, y: 0, z: 0 }, (x, y, z) => {
    // This callback will be called everytime you set a new center point 

    each(this.group.children, (o) => {
        o.translateX(x);
        o.translateY(y);
        o.translateZ(z);
    });

    // Update the scene
    this.updateScene();
});

我不知道您的 2dcanvas 库是否有简单地更改偏移量的方法,但这将是一个好方法,尤其是当您不想在运行时修改大型数组时。

我可以position在构造函数选项中添加一个属性来更改初始位置。您可以向gcode-toolpath存储库提交拉取请求,我将审核更改。谢谢你。

刀路初始位置 #237
合作者
奇顿 评论了 2017 年 12 月 7 日  

对不起,我误解了你的意思。

给定如下的 G 代码程序:

N1 G21 G90
N2 G0 Z0.25
N3 X-0.5 Y0.
N4 Z0.1

将以 mm 为单位生成这样的刀具路径

[ { motion: 'G0',
    v1: { x: 0, y: 0, z: 0 },
    v2: { x: 0, y: 0, z: 0.25 } },
  { motion: 'G0',
    v1: { x: 0, y: 0, z: 0.25 },
    v2: { x: -0.5, y: 0, z: 0.25 } },
  { motion: 'G0',
    v1: { x: -0.5, y: 0, z: 0.25 },
    v2: { x: -0.5, y: 0, z: 0.1 } }
]

为了确定边界框,我们可以通过忽略数组的第一项来排除初始位置 (0, 0, 0)。也就是说,起始位置应该是 (0, 0, 0.25) (即G0 Z0.25)而不是 (0, 0, 0)。

我可以修复gcode-toolpathaddLine以绕过对and的第一次调用addArcCurve

刀路初始位置 #237
合作者
奇顿 评论了 2017 年 12 月 7 日  

我记得为什么在刀具路径中指定了初始位置,G0/G1/G2/G3 命令的第一行可能只在一个轴上移动,但是需要有两个 3D 点 (x,y,z) 来定义一个3D 空间中的线。

我同意使用当前工作位置比 (0, 0, 0) 好得多。只过滤G1/G2/G3线来确定工件的边界框怎么样?

刀路初始位置 #237
贡献者作者

你的第一个答案符合我的问题。我已经在使用您首先建议的技术 – 创建新的工具路径实例并翻译画布。我希望通过在每次调用时避免“new”和垃圾收集的开销来提高效率,但我认为与解析创建的对象相比这是一个小因素。

查看初始移动很重要,因为它告诉您机器的起始位置相对于工件是否正确。

刀具路径的补丁很简单:

diff --git a/src/Toolpath.js b/src/Toolpath.js
index 4c39a7b..cbab48f 100644
--- a/src/Toolpath.js
+++ b/src/Toolpath.js
@@ -563,6 +563,9 @@ class Toolpath {
         });
         this.setModal(nextModal);
         this.fn = { addLine, addArcCurve };
+       if (options.position !== undefined) {
+            this.setPosition(options.position.x, options.position.y, options.position.z);
+       }

         return new Interpreter({ handlers: this.handlers });
     }
刀路初始位置 #237
合作者

添加到gcode-toolpath@2.1.0

toolpath.setPosition({ x, y, z })您可以使用或toolpath.setPosition(x, y, z)附加到构造函数选项来设置当前位置。

刀路初始位置 #237
贡献者作者

不错的解决方案。谢谢!