开源改变世界!!

宏不适用于 gcode #1158

推推 grbl 1年前 (2023-01-27) 140次浏览
打开
nesetburak 打开了这个问题 2018 年 12 月 5 日 · 25条评论
打开

宏不适用于 gcode#1158

nesetburak 打开了这个问题 2018 年 12 月 5 日 · 25条评论

注释

宏不适用于 gcode #1158

功能要求

我如何将宏与 g 代码一起使用。我正在上传这个 gcode;
G21 G90
G01X10
T1 M6
主轴移动到 X10 坐标但不启动“T1 M6”宏
宏不适用于 gcode #1158

问题描述

宏不适用于 gcode。这不是错误,但我没有解决这个问题。

预期行为

我不想按宏按钮。0 1
如果我从 Gcode 文件发送一个特殊代码,宏名称会捕获此代码并启动宏 GCode。

谢谢你的兴趣winder

宏不适用于 gcode #1158
贡献者

@nesetburakUGS 将尝试将其发送到控制器,而不是将命令处理为宏;而 GRBL、TinyG 和 Smoothie 仍然不支持 M6 工具更改(我只使用 GRBL)。

解决方法:

我有一个想法可以很容易地添加到 UGS,但目前,您可能需要使用“查找/替换”策略在记事本(或 VS Code / Atom / Brackets,任何这些编辑器非常适合 G 代码扩展)。

对于像这样的入门级系统,推荐的方法是在单独的文件中更改工具,并使用诸如工作流插件之类的东西,并手动触摸/探测(例如您编写的宏)或使用探测插件。

我的实现思路(面向开发者):

在工具 -> 选项 -> UGS -> 控制器选项中,有一个正则表达式删除器。
如果我们将其从“删除器”更改为“替换器”,我们可以使用空白文本保留现有功能,但“替换器”会添加一些非常强大的功能,例如工具更换和一些固定循环。要我调查这个吗?

宏不适用于 gcode #1158

不幸的是用其他程序(uccnc)解决了我的问题。但我想使用 UGS。

@carneeki你的想法真好。“正则表达式去除器”。
也许会像“正则表达式转换器”一样添加新功能

但是为什么UGS不使用或不支持宏。宏的复杂性是什么。
例如mach3,uccnc …支持宏并且没有任何问题。

宏不适用于 gcode #1158
贡献者
卡内基 评论了 2018 年 12 月 6 日 通过电子邮件
宏不适用于 gcode #1158
所有者

@carneeki您的Remover->Replacer想法听起来是一个很大的改进,并且Macro Expander也是一个有趣的功能。我认为我们只是触及了 UGS 中 gcode 处理引擎可以完成的工作的表面。我不知道这是否是实现固定循环的最佳方式,但可能需要专用的固定循环扩展器。

由于现有的插件引擎,这两个实现起来应该几乎微不足道。您可以看到现有的Pattern remover非常基础。该功能的大部分工作都与 GUI 相关。尽管它是一段简单的代码,但它足以使一些其他功能(如空格注释处理器)变得微不足道。

宏不适用于 gcode #1158

大家好,请问这件事有进展了吗?如果 UGS 可以与 Gcode 的各个部分相交并将它们转换为宏,尤其是对于自动换刀器,就像 bCNC 和 CNCjs 对 M6 所做的那样,那就太好了。

宏不适用于 gcode #1158
所有者

如果有人想尝试一下,这是 UGS 中的第一个很棒的项目。Processor 接口不是很复杂,所有的东西都是用 json 文件配置的,并且有很好的测试覆盖率。

您可以在此处看到一个简单的检测 M3/M4 并插入一个额外命令的命令:
https ://github.com/winder/Universal-G-Code-Sender/blob/master/ugs-core/src/com/willwinder/ universalgcodesender/gcode/processors/SpindleOnDweller.java

参数(即模式/替换)在此处从文件中解析出来:

 

要用“重命名器”替换“删除器”,需要在 GUI 中进行一些调整,以添加/删除/保存一个额外的参数:

 

宏不适用于 gcode #1158

这上面有什么事情发生吗????

宏不适用于 gcode #1158
贡献者

我想进入 UGS,并有一定程度的编码经验(主要是 SQL、Python 和一点 C/C#)。这个’Replacer’听起来像是一个很好的介绍……如果热情和(适度的)经验让我有资格,那么我准备尝试 – 我在我当前的设置中使用’Remover’来识别工具更改条目并将它们剥离为“ ^[mM]6\s*[tT][0-9].*$”。

用于识别 gcode 文本流中的模式的类似 Grep 的模式是众所周知的并且已经定义,’remover’ 处理器恰好包含此功能。这个初始框架可以作为起点。所以问题会变成:

  1. 是否需要第二个 GUI 字段来提供替换字符串或模式?Grep(据我所知)是一个模式查找器,因此“然后替换为”必须能够插入原始文本中没有的任何新内容,以及 GUI 中供用户定义此新文本的位置。
  2. 我可以假设新文本很可能需要原始“跳过”的元素,例如:如果要保留一个数字,新文本将使用 – 使用类似 Grep 的功能和提供的匹配表达式可以产生 ‘捐赠者的文本,可能需要进一步处理以识别其中的特定元素以跳转到输出。
  3. 我还可以假设建议的范围是“一次一行”,单独处理每一行,没有“整个文件”或“以前的匹配项或内容”的概念。
  4. 对于“我只想插入以下内容,而不是替换任何内容”的用例,需要进行一些考虑。这可以通过包含来自原始后处理器的“捐赠者文本”来实现 – 例如可以用提供的字符串替换的特殊评论字符串。

拥有一些“我想要/我需要”的用例示例将非常有用,这样我就可以形成或完善基础。

我还可以使用指向 HowTo GitHub 的指针并提出建议的贡献等。正如我所说,“一些经验”。

宏不适用于 gcode #1158
所有者
绕线机 评论了 2021 年 7 月 18 日 通过电子邮件
宏不适用于 gcode #1158
贡献者

稍微阅读一下 grep 和 sed,再加上考虑“replacer”命令将如何集成和/或替换“remover”命令,我相信带有空白“replace with”字符串的 replacer 将给出与当前“remover”相同的结果,这意味着可以安排任何现有的 JSON 条目以无缝过渡到新的“replacer”命令。

因此,我的建议是;

  • 向 JSON 配置/文件添加一个额外的字符串字段以保存“替换为”文本
  • 使用此额外字符串调整 UI 配置以检索、显示、保存和适当删除
  • 安排更改,使现有用户安装将从“删除程序”过渡到“替换程序”,无需用户操作,除了注意到命令的功能已扩展
  • 第一个功能目标:
  • 1> 保留 grep“查找要删除或替换的内容”功能以识别传递的 gcode 流中的行/字符
  • 1> 只需将其替换为填充在“替换为”字符串中的静态文本。如果此字符串为空,则返回一个空字符串,因此与 ‘remover’ 的行为相同
  • 第二个功能目标:
  • 2> 创建将原始的、grep 识别的字符串的某些方面跳到返回字符串的能力。需要定义或借用合适的语法(基于 grep 或 sed)
  • 2> 在此语法中包含指定并运行一个或多个命名宏的能力,这些宏返回一个字符串并将成为返回字符串的一部分

我认为在本地编译包对于证明代码编译是必要的,而且对于初始测试目的也是如此。我有最新版本的 Net Beans Dev Environment,但似乎在使用它时遇到困难 – 是否有最适合这项工作的版本?我也想在某个时候开发一个插件,所以考虑到同样的问题和希望相同的答案

宏不适用于 gcode #1158
贡献者

进一步思考…如果现有的 JSON 字符串“模式”被解释为 grep 或 sed,具体取决于那里的内容,那么可能只需要一个字段。如果模式包含,比如“^[mM]6\s* tT $”,那么它只是一个 grep 序列,应该被视为 sed“s/^[mM]6\s* tT $/”字符串和为匹配项提供一个空的替换项(删除)。如果模式包含“ s/^[mM]6\s* tT $/ ”,那么这是一个有意的删除命令,而“ s/^[mM]6\s* tT $/M6T1 ”将用 M6T1 替换匹配项。
s/ 的前缀是这个 IS sed 的数据签名,没有前缀意味着假设它是 s/grep/ 并且表现为移除器。

宏不适用于 gcode #1158
所有者

如果我理解正确,这些是您要选择的选项:

  1. 表中新的“替换为”字段,默认为空字符串以实现向后兼容性(删除),并且可以用其他内容填充以实现新的替换功能。例如“^[mM]6\s*tT$”和“M6T1”使用 T1 进行所有换刀。

  2. 向“模式”字段添加一些新语法以内联定义整个序列。为了向后兼容,“^[mM]6\s*tT$”隐式转换为“s/^[mM]6\s*tT$/”,新功能可与“s/^[mM]6”一起使用\s*tT$/M6T1”。

我稍微喜欢第一个选项,它似乎更容易使用。但两者都可以,有一个帮助按钮,因此可以编写如何定义模式的完整描述。(见 ugs-core/src/resources/MessagesBundle_en_US.propertiessender.help.patternRemover和 settings.processors.help

宏不适用于 gcode #1158
贡献者

我编写了第一个功能,成功构建并运行。我正在努力调试正在发生的事情……

如果我在首选项 > UGS > 控制器选项中将模式设置为“ s/^[mM]6\s tT$ ”,它会起作用,并成功地从命令中“删除”M6T。如果我将模式设置为“ s/^[mM]6\s tT$/M123 ”以用“愚蠢”的东西替换 M6T 以查看它是否正常工作,它根本无法移除 M6T,并且 M123 不会出现据我所知 – grbl 抱怨 M6T 命令。

我遵循的实现这一点的过程是在 PatternRemover 中将“/”上的 regexPattern 拆分为 String[] 变量 s3,就像 sed 一样,并测试第一个 String[] 元素是否为“s”和 s3[0].equals (“s”) – 如果是,则使用 p = Pattern.compile(s3[1]) 编译 p,如果 s3 中有第三个元素,则将其添加到名为 r 的新最终私有列表中,以供 ProcessCommand 使用. 如果没有第三个元素,我只是 r.add(“”); 充当“去除剂”。漂亮而简单。

在 processCommand 中,我有 ret.add( p.matcher(command).replaceAll(r.get(0)) ); 我相信这应该有效。但测试表明“不完全是”。

热情多于知识……关于我如何着手解决和调试正在发生的事情的任何指示?我曾尝试使用 System.out.println() 从 processCommand() 中获取调试记录,但尽管阅读了早期作者是如何做到这一点的,但我没有得到任何输出(例如:在 GcodeModel.java 中输出“Num Line Segments: “

宏不适用于 gcode #1158
所有者
绕线机 评论了 2021 年 7 月 20 日 通过电子邮件
宏不适用于 gcode #1158
贡献者

太棒了 – 得到了一个测试脚本设置和调试运行与休息和观察。好的。

宏不适用于 gcode #1158
贡献者

模式处理器体系结构中是否有触发器来标记用户已编辑 regexPattern 并且需要重新编译?现在看来,这是一次解析和编译并按原样使用,还是我错过了什么?
几乎完成功能目标 1(自动检测正则表达式或 sed,简单的文本替换),只是测试我能想到的每个场景以确保它是健壮的。

宏不适用于 gcode #1158
所有者

我相信当您打开 gcode 文件时,处理器已加载。如果处理器配置发生变化,我们可能应该重新加载 gcode 文件,但我认为目前不会发生这种情况。

宏不适用于 gcode #1158
贡献者

明白了。我想我已经为拉取请求做好了准备,所以会在今晚进行。我有关于如何通过 sed 将值从原始匹配的正则表达式跳到返回模式的想法,这也可能有助于访问宏扩展 – 但后者需要从我的部分阅读如何键入宏。

宏不适用于 gcode #1158
贡献者

对于功能目标 2:查看使用 getSettings().getMacros() 的枚举宏,但需要访问后端实例。我在哪里可以获得当前后端实例?

宏不适用于 gcode #1158
贡献者
安迪CXL 评论了 2021 年 7 月 23 日  

宏扩展代码有效且健壮,使用 sed ” s/regex/%macroname% ” 语法,并且仍然是一段简单的代码。我遇到了一个导入查找问题,这意味着我将对代码进行一些小的调整以关闭宏扩展,但将其代码保留在原位,以便在看到进展时可以同时合并 Replacer 函数。

常用的“import com.willwinder.ugs.nbp.lib.lookup.CentralLookup;” 与“后端后端 = CentralLookup.getDefault().lookup(BackendAPI.class);”配对 调用以获取实例并从该实例访问宏列表。我不明白为什么这个导入失败,因为其他包进行相同的导入引用并且似乎没问题 – 但我收到“package com.willwinder.ugs.nbp.lib.lookup does not exist”错误。我通过添加依赖项克服了它,但由于循环引用,应用程序无法编译。

我可以对此提出一些建议,或者指向一个非后端依赖的方法来枚举 .getMacros()。我已将撤回的合并请求留在原处,以便可以看到代码 – 在 PatternRemover 包中。@winder

宏不适用于 gcode #1158
贡献者

我已经通过将“提供的”依赖项包含回 UGSLib 来设法解决循环依赖项,并且该应用程序现在可以通过作为 PatternRemover 的一部分的宏扩展成功构建、运行和测试。在测试过程中,我确定当“ s/M6T/%1% ”是 sed 模式时确实发生了宏扩展,并且存在名为“1”的宏,并且当通过测试命令“M6T”时该测试通过. 出色的。
使用真正的 gcode 文件运行应用程序,PatternRemover 设置为“s/M6T/%1%”,宏 1 定义为“G1X0Y0”,然后在 gcode 文件中手动插入一行“M6T”导致“跳过行:M6T”在命令控制台中报告。正则表达式或 sed 模式的所有其他组合,除了那些扩展宏的组合,都可以正常工作(例如:“s/M6T/M6T0”)。将源代码中跳过的行跟踪到 AbstractContoller.java 中,很可能是以下内容;

public void commandSkipped(GcodeCommand command)
为什么命令被跳过了?调用后端枚举 .getMacros() 是否会以某种方式触发跳过?有什么见解吗?宏扩展的代码测试完全有效,但较大的 ugs 应用程序实体中的某些东西参与并击败了它……

宏不适用于 gcode #1158
Contributor
AndyCXL commented 2021 年 8 月 5 日  

The full functionality of ProcessorRemover to enable Replace and %macro% expansion is completed and tested, and a pull request made.

喜欢 (0)