QCAD/CAM 后处理器
QCAD/CAM 可以将 CAD 图形导出为 CAM(计算机辅助制造)中使用的各种格式。这些格式可以是 G-Code 的方言或其他完全不同的格式。每种支持的 CAM 格式都在配置文件(或“后处理器”)中定义,该文件是实现格式细节的 ECMAScript(JavaScript)文件。所有可用的配置都存储在目录 postprocessors 内。新的格式实现可以添加到同一位置。
每个配置文件包含一个与脚本文件同名的 ECMAScript 类。如果脚本文件名为 MyGCode.js,则脚本内定义的类必须命名为 MyGCode。
ECMAScript 类必须直接或间接派生自由 QCAD/CAM 定义的类 CamExporterV2。CamExporterV2 定义 CAM 导出器配置类的基本结构。CamExporterV2 中的各种方法被调用以导出文件头、CAD 图形中的各种实体以及页脚。CamExporterV2 还负责 QCAD/CAM 的各种功能,例如刀具半径补偿、引入/引出、在外轮廓之前切割内轮廓、路径优化等。
CamExporterV2 本身不输出任何内容,而是会自行生成一个空文件。CamExporterV2 提供一个文本流(QTextStream)用于写入导出的文件。此文本流通过成员变量 this.stream 公开。
如果所需的输出是 G-Code 方言(例如用于线性运动的 G1 X10 Y20),则可以从名为 GCodeBase 的现有 G-Code 配置派生该配置,该配置在文件 GCodeBase.js 中定义。大多数机器控制器都是这种情况。一个用于以毫米输出 G-Code 的此类示例配置在文件 GCodeMM.js 中定义,并在用户界面中作为名为 G-Code (G41/G42) [mm] 的配置提供。
从 GCodeBase 派生配置
Section titled “从 GCodeBase 派生配置”创建一个具有您选择的唯一名称的文件。对于此示例,我们将新配置命名为 MyGCode,并将其存储在同名文件中,即您的 QCAD/CAM 安装的 postprocessors 目录下的 MyGCode.js。
您可以使用您最喜欢的纯文本编辑器来创建和编写文件,例如 Windows 下的记事本、macOS 下的 TextEdit 或 Linux 系统下的 vim、Emacs 等。
MyGCode.js 必须定义一个名为 MyGCode 的类才能成为 QCAD/CAM 的有效配置。虽然严格来说 ECMAScript 中没有类,但我们可以通过将函数附加到构造函数的原型对象来创建类似的概念。其确切工作原理超出了本文档的范围。但是,有一个简单的模板可用于所有配置文件。
对于我们的示例,类 MyGCode 的定义如下所示(请注意,以 // 开头的行是注释,不是必需的):
// 包含 GCodeBase.js,其中包含类 'GCodeBase',// 用作我们自己配置的基础:include("GCodeBase.js");
// 我们类的构造函数:function MyGCode(documentInterface, newDocumentInterface) { // 调用基类的构造函数: GCodeBase.call(this, documentInterface, newDocumentInterface);}
// 从类 GCodeBase 派生我们的类:MyGCode.prototype = new GCodeBase();
// 在用户界面中显示的显示名称:MyGCode.displayName = "My G-Code";现在,我们创建了一个名为 “My G-Code” 的新的、完全可用的配置,它已准备好在 QCAD/CAM 中使用并生成基本的 G-Code。
我们上面定义的构造函数调用我们基类 GCodeBase 的构造函数。在构造函数中,我们可以为配置设置一些参数,例如所需的输出单位或我们是否要使用 G41/G42 进行刀具半径补偿或计算刀具路径的中心。
要配置输出单位(即您的机器或控制器期望的单位),我们可以将成员变量 unit 设置为 Inch 或 Millimeter,例如:
this.unit = RS.Inch;或
this.unit = RS.Millimeter;可以在构造函数中配置的其他设置有:
| 变量 | 可能的值 | 默认 | 描述 |
|---|---|---|---|
this.outputOffsetPath |
true 或 false | false | 设置为 true 以计算刀具半径补偿,而不是使用 G41/G42。 |
this.lineNumber |
数字 | 10 | 用于行编号的初始数字(N…)。 |
this.lineNumberIncrement |
数字 | 10 | 从一行到另一行的行号增量。 |
this.fileExtensions |
数组 | [ "nc", "cnc" ] |
用户通过此后处理器导出时可以选择的文件扩展名列表。 |
完整的构造函数可能如下所示:
function MyGCode(documentInterface, newDocumentInterface) { GCodeBase.call(this, documentInterface, newDocumentInterface);
this.unit = RS.Inch; this.outputOffsetPath = true; this.lineNumber = 1; this.lineNumberIncrement = 1;}定义 G-Code 输出
Section titled “定义 G-Code 输出”G-Code 输出被结构化为代码块,在 QCAD/CAM 中使用 CAM 导出功能时写入输出文件。例如,写入的第一个代码块是代码块 “header”。每个代码块都在一个成员变量中定义,该变量按名称标识它,例如 this.header 包含文件头的代码块。
可以覆盖代码块以包含任何代码/文本。代码块通常包含用于输出当前 X/Y 坐标、行号、进给速率等的变量。
假设一条线被导出到 G-Code。该线以线左侧的刀具半径补偿(G41)导出。写入输出文件的代码块如下:
| 代码块 | 描述 | 示例输出 |
|---|---|---|
header |
输出的头部(始终是第一个代码块)。 | G21 G17 G90 G40 G49 G80 |
rapidMoveZ |
快速移动到安全水平。 | G0 Z100 |
rapidMove |
快速移动到第一个轮廓的第一个位置(此处为线的引入的起点)。 | G0 X5 Y10 |
toolHeader |
新刀具开始动作时的第一个块(换刀)。 | T1 |
rapidMoveZ |
快速向下移动到间隙水平(悬停在材料上方)。 | G0 Z5 |
firstLinearMoveZ |
以下刀速率切入材料。 | G1 Z-5 F50 |
toolpathHeader |
新刀具路径的第一个块。 | |
contourHeader |
刀具路径内新轮廓的第一个块。 | |
singleZPassHeader |
单个 Z 通道的头部。我们在单个通道中切割整个深度。 | |
zPassFirstHeader |
单个或多个 Z 通道的第一个头部。 | |
linearMoveCompensationLeft |
沿引入线性移动到线的起点,打开刀具半径补偿。 | G41 X10 Y10 F500 |
linearMove |
沿线线性移动到线的终点。 | X30 Y10 |
linearMoveCompensationOff |
沿引出从终点线性移开,关闭刀具半径补偿。 | G40 X35 Y10 |
zPassLastFooter |
单个或多个 Z 通道的最后一个页脚。 | |
singleZPassFooter |
单个 Z 通道的页脚。 | |
contourFooter |
轮廓结束。 | |
toolpathFooter |
刀具路径结束。 | |
linearMoveZ |
从材料移出到间隙水平。 | Z5 |
rapidMoveZ |
移动到安全水平。 | G0 Z100 |
toolFooter |
此刀具的结束。 | |
footer |
程序结束。 | M30 |
其中许多代码块通常未使用,不产生输出(空代码块)。
| 成员变量 | 变量名 | 描述 |
|---|---|---|
| inputFileName | INFILENAME | 输入文件名(例如 DXF 文件)。 |
| inputFilePath | INFILEPATH | 带完整路径的输入文件名。 |
| fileName | FILENAME | 输出文件名。 |
| filePath | FILEPATH | 带完整路径的输出文件名。 |
| dateTime | DATETIME | 导出的日期和时间。 |
| lineNumber | N | 当前行号。 |
| spindleSpeed | S | 主轴转速,通常为 rpm。 |
| feedRate | F | 进给速率。 |
| plungeRate | FP | 下刀速率。 |
| xHomePosition | XH | 在 CAM 配置中配置的原点位置。 |
| yHomePosition | YH | |
| zHomePosition | ZH | |
| zSafety | ZS | 换刀和开始/结束的 Z 安全水平。 |
| zClearance | ZU | 接近材料的 Z 间隙水平。 |
| zClearancePass | ZUP | 多个通道之间的 Z 间隙水平。 |
| zCuttingDepth | ZD | Z 切割水平(总计)。 |
| xFirstPosition | XF | 第一个刀具路径中第一个轮廓的第一个位置。 |
| yFirstPosition | YF | |
| xStartPosition | X1 | 实体的起点(线/弧的起点)。 |
| yStartPosition | Y1 | |
| zStartPosition | Z1 | |
| xPosition | X | 当前目标位置。当前线/弧的终点。 |
| yPosition | Y | |
| zPosition | Z | |
| xRelPosition | XR | 作为相对坐标的当前目标位置,相对于起点。 |
| yRelPosition | YR | |
| zRelPosition | ZR | |
| iArcCenterInc | I | 弧的中心,相对于起点。 |
| jArcCenterInc | J | |
| iArcCenterAbs | IA | 弧的中心,绝对。 |
| jArcCenterAbs | JA | |
| arcRadius | RADIUS | 弧的半径。 |
| arcDiameter | DIAMETER | 弧的直径。 |
| arcSweep | SWEEP | 弧的扫掠(弧覆盖的角度,以弧度表示,顺时针为负)。 |
| tool | T | 当前刀具。 |
| toolRadius | TR | 刀具半径。 |
| toolDiameter | TD | 刀具直径。 |
| toolpathOrder | TOOLPATH_ORDER | 刀具路径列表中的刀具路径顺序,第一个刀具路径从 0 开始。 |
| toolCalls | TOOL_CALLS | 此刀具的使用次数。 |
| toolpathName | TOOLPATH_NAME | 当前刀具路径的名称(用户定义)。 |
| programName | PROGRAM_NAME | 用户在 CAM 配置中配置的程序名。 |
| xMin | X_MIN | 图形的最小范围。 |
| yMin | Y_MIN | |
| zMin | Z_MIN | |
| xMax | X_MAX | 图形的最大范围。 |
| yMax | Y_MAX | |
| zMax | Z_MAX |
更改头部和页脚
Section titled “更改头部和页脚”要在头部或页脚中添加或更改 G-Codes 或 M-Codes 或其他信息,配置可以在构造函数中覆盖成员变量 header 和 footer,例如如下:
this.header = [ "[N] G0 Z100" ];this.footer = [ "[N] G0 Z100", "[N] M30" ];绝对 I/J
Section titled “绝对 I/J”要对弧中心的 I/J 值使用绝对值,您可以按如下方式覆盖弧代码块:
this.firstArcCWMove = "[N] G2 [X] [Y] [IA] [JA] [F]";this.arcCWMove = "[N] G2 [X] [Y] [IA] [JA] [F]";this.firstArcCCWMove = "[N] G3 [X] [Y] [IA] [JA] [F]";this.arcCCWMove = "[N] G3 [X] [Y] [IA] [JA] [F]";后处理器模板文件
Section titled “后处理器模板文件”QCAD/CAM 在设置或切换后处理器时自动合并与后处理器文件同名的 DXF 模板文件(如果可用)。假设后处理器名为 “MyGCode”,在 postprocessors/MyGCode.js 中实现。在 postprocessors/MyGCode.dxf 中创建一个带有刀具定义的 DXF 文件。此文件可能包含刀具定义、默认图层或可用表面区域的轮廓。注意:模板文件的任何可见内容在合并时都会自动放置在锁定图层上,因此它只可见但不可选择。