# GMOCCAPY 分析与加载测试 更新时间:2026-08-25 ## 结论 “没有看到加载程序按钮”不是按钮缺失,而是首次启动提示和 GMOCCAPY 的模式门控共同造成的视觉结果: 1. 首次启动会弹出模态的 `Important change(s)` 窗口。该窗口覆盖主界面并阻止底层点击;用户截图中的右侧 `X` 是关闭按钮,底部复选框是 `Don't show this again`。 2. 加载按钮只属于 AUTO 页面按钮组,不属于 MANUAL/JOG 页面。源码将它声明为 `btn_load`,提示为 `Load a new program`,图标为 `img_open`。 3. AUTO 模式还受机器状态和 homing 门控。`gmoccapy.py` 在未满足状态时会禁用 `rbt_auto`,并提示 `It is not possible to change to Auto Mode at the moment`。 4. 关闭首次提示、进入 AUTO 后,点击文件夹/打开文件图标会进入文件选择页。当前 `gmoccapy.ini` 的 `PROGRAM_PREFIX = ../../nc_files/` 解析到 `linuxcnc/nc_files`。 ## 用户截图分析 ![首次启动提示](gmoccapy-important-changes.png) 用户提供的图片尺寸为 `697 x 837`,内容是 GMOCCAPY 3.5.x 的版本变更提示: - LinuxCNC 2.10/GMOCCAPY 3.5.0 不再在换刀后自动保留 G43;需要通过 REMAP 实现自动重新激活。 - 3.5.1 的工具表和偏置页默认使用计算器输入,可在设置或按钮中改变。 - MDI 和 G-code 编辑模式新增调用计算器的按钮。 - `release notes` 是橙色链接;右下方复选框用于永久隐藏该提示。 这张提示不是文件选择器,也不是加载失败信息。应先关闭它,再操作主界面。 ### 新截图的源码逐项对照 ![用户提供的最新提示截图](gmoccapy-important-changes-v2.png) 这张截图与前一张内容一致,尺寸为 `697 x 837`,SHA-256 为 `df7322c30bcb6af131591a04b11cad24e7b6d186beaff83059fcfd8ffbae2d1b`。截图中的每一块文字都能在当前系统安装的 `/usr/bin/gmoccapy` 中找到: | 截图区域 | 源码证据 | 含义 | |---|---|---| | `Important change(s)` 标题 | `/usr/bin/gmoccapy:557-560` | `_startup_message()` 建立启动提示标题;注释要求新增消息只能追加,不能删除旧消息,否则隐藏索引会错位。 | | 3.5.0 G43 提示 | `/usr/bin/gmoccapy:561-563` | GMOCCAPY 3.5.0 不再承诺换刀后自动保留 G43;想自动恢复必须使用 REMAP,示例在 GMOCCAPY 仿真配置中。 | | 3.5.1 计算器提示 | `/usr/bin/gmoccapy:564-565` | 工具表和偏置页默认启用计算器输入;设置或页面按钮可以关闭;MDI 和 G-code 编辑页也增加了计算器按钮。 | | `release notes` 链接 | `/usr/bin/gmoccapy:570-573` | 以 Pango markup 拼接 LinuxCNC 官方 release notes URL,并通过通知组件显示。点击它会打开文档,不会关闭提示。 | | `Don't show this again` | `notification.py:151-155` | `show_checkbox=True` 时创建 GTK `CheckButton`;它不是普通说明文字,而是真正影响后续启动行为的复选框。 | | 右侧 `X` | `notification.py:156-164` | 创建名为 `notification_close` 的 48x48 关闭按钮;点击后删除该消息,并把复选框状态发回 GMOCCAPY。 | ### 弹窗什么时候出现 系统运行时在 GUI 初始化和周期任务准备完成后,于 `/usr/bin/gmoccapy:519` 调用 `_startup_message()`。它读取偏好项 `hide_startup_messsage`(注意源码中确实有三个 `s` 的拼写): ```python hide_message = self.prefs.getpref("hide_startup_messsage", 0, int) if hide_message < len(messages): ... self.notification.add_message(message, INFO_ICON, show_checkbox=True) ``` 当前消息数组有两项,因此默认值 `0` 会显示两项。关闭时如果复选框被勾选,`/usr/bin/gmoccapy:6241-6242` 将 `self.num`(当前为 `2`)写回 `hide_startup_messsage`。下次启动判断 `2 < 2` 为假,提示不再出现。普通点击 `X` 不勾选复选框时,只删除本次通知,下次仍会显示。 ### 版本边界:截图运行时与仓库锁定源不同 这是本次分析中最重要的来源边界: - 截图对应的实际运行程序是 `/usr/bin/gmoccapy`,其中 `_RELEASE = "3.5.2"`,并包含 `_startup_message()`、3.5.0/3.5.1 文本和隐藏偏好逻辑。 - 仓库锁定源是 `linuxcnc/VERSION = 2.10.0~pre0`;`linuxcnc/src/emc/usr_intf/gmoccapy/gmoccapy.py:79` 的版本为 `3.4.3`,该文件没有 `_startup_message()` 实现,也没有截图中的 3.5.0/3.5.1 文本。 - 本地启动日志曾显示 `LinuxCNC 2.10.0~pre1` 和 `gmoccapy 3.5.2`,与截图完全一致。因此这张截图是系统安装包的运行时证据,不应反向宣称锁定仓库 2.10.0~pre0/3.4.3 源码已经包含该功能。 已记录的运行时文件哈希: ```text /usr/bin/gmoccapy 11e7aee9216d24e4cc41018306f2541845bca9a9d6e16c38580f3ede9cca8d4d /usr/share/gmoccapy/gmoccapy.glade 5fdc1557b02a716d30414fe739614fcd7c1d14cbe2e0a4c202c567a60b460adb /usr/lib/python3/dist-packages/gmoccapy/notification.py e0317fea738745f480c79d1f690bc52e88cc7f81bb4d14fa09c8c7196afb4e2f ``` ### 用户应如何处理 1. 只想本次继续操作:点击右侧 `X`,不要勾选复选框。 2. 不想以后重复看到:先勾选 `Don't show this again`,再点击 `X`。 3. 想查看变更依据:点击 `release notes`,但这需要浏览器/网络或本地文档可用。 4. 使用 G43 的程序:不要仅依赖界面自动行为;在 AUTO 程序中按机床配置和 REMAP 约定明确处理刀具长度补偿,并在正式加工前验证工具表和偏置。 ## 实际界面证据 ### 未加载状态 ![未加载程序](gmoccapy-before-load.png) 主界面顶部显示 `No Program loaded`。右侧竖向按钮中第三个为 AUTO 模式图标;在 MANUAL 页面时,AUTO 页面里的 `Load a new program` 不会显示在当前按钮组。 ### 文件选择页 ![加载程序文件选择页](gmoccapy-load-file-page.png) 这张截图是实际运行 GMOCCAPY 后进入的文件选择页。页面显示 `gcmc_lib`、`macros`、`ngcgui_lib` 等目录以及 `3D_Chips.ngc`、`3dtest.ngc` 等程序。底部右侧绿色对勾是确认选择,右下黄色回退箭头是返回。 进入这张页面的完整点击链是: 1. 关闭首次 `Important change(s)` 模态提示。 2. 在主界面右侧点击第三个模式图标,进入 AUTO;源码控件为 `rbt_auto`。 3. 等待 AUTO 按钮组出现,在其中点击打开文件图标;源码控件为 `btn_load`,tooltip 为 `Load a new program`。 4. `on_btn_load_clicked()` 将按钮页切换到文件选择页;此时才会看到本截图中的文件网格。 5. 选中 `.ngc` 文件后点击底部绿色对勾,源码控件为 `btn_select`。 因此,文件网格不是主界面的固定按钮,也不是 MDI 入口;在 MANUAL/JOG 页面直接寻找它不会找到。 ### 加载后的程序 ![加载 3dtest.ngc 后](gmoccapy-program-loaded.png) 通过 LinuxCNC 的 `command.program_open()` 加载: ```text /home/mes006/linuxcncWebWASM/linuxcnc/nc_files/3dtest.ngc ``` 加载成功的证据是: - 顶部由 `No Program loaded` 变成完整程序路径; - 预览区出现 G-code 刀具轨迹; - `linuxcnc.stat().file` 返回上述路径; - `interp_state` 保持空闲,加载本身不会自动运行程序。 ## 源码与界面映射 | 层 | 文件/符号 | 结论 | |---|---|---| | 主逻辑 | `linuxcnc/src/emc/usr_intf/gmoccapy/gmoccapy.py` | `on_btn_load_clicked()` 切到文件选择页;`on_IconFileSelection1_selected()` 调用 `hal_action_open.load_file(path)`。 | | 加载按钮 | `btn_load` / `img_open` | tooltip 是 `Load a new program`,只在 AUTO 按钮页 `hbtb_auto`。 | | 运行按钮 | `btn_run` / `img_run` | tooltip 是 `Run the loaded program`;加载后仍需手动运行。 | | 文件确认 | `btn_select` / `img_select` | tooltip 是 `select the highlighted file and return the path`。 | | 返回 | `btn_back_file_load` / `img_back_file_load` | 关闭文件选择页但不返回路径。 | | 文件资源 | `linuxcnc/lib/python/gladevcp/iconview.py` 及 GMOCCAPY 初始化 | 读取 `PROGRAM_PREFIX`,按配置扩展名展示文件和目录。 | | 首次提示 | GMOCCAPY preferences/release-notes 逻辑 | 模态提示优先于主界面,必须先关闭。 | ## 配置与资源分析 默认配置为 `linuxcnc/configs/sim/gmoccapy/gmoccapy.ini`: - `[DISPLAY] DISPLAY = gmoccapy`:选择 GMOCCAPY GUI。 - `[DISPLAY] PROGRAM_PREFIX = ../../nc_files/`:从配置目录解析到 `linuxcnc/nc_files`。 - `[RS274NGC] PARAMETER_FILE = sim.var`:仿真参数文件。 - `[RS274NGC] SUBROUTINE_PATH = macros`:宏和子程序搜索路径。 - `[EMCIO] TOOL_TABLE = tool.tbl`:工具表。 - `[HAL]` 加载 `core_sim.hal`、`spindle_sim.hal`、`simulated_home.hal`,并在 GUI 启动后加载 `gmoccapy_postgui.hal`。 `configs/sim/gmoccapy` 不是单一案例,而是一组配置族,包含标准三轴、四轴、XYZAB/XYZAC/XYZCW、多轴、侧面板、消息、工具传感器、用户页、等离子和车床配置。完整逐文件路径与哈希见 [文件清单](gmoccapy-file-inventory.md)。 ## 运行环境与限制 - 启动入口:[`../run-gmoccapy.sh`](../run-gmoccapy.sh),默认执行 `gmoccapy.ini`。 - 实际 GUI 进程:`/usr/bin/python3 /usr/bin/gmoccapy -ini .../gmoccapy.ini`。 - 当前环境没有实时内核,LinuxCNC 日志明确回退到 POSIX non-realtime;这不影响本次“加载和预览”验证,但不等同于实时硬件运行验证。 - `simulated_home.hal` 的共享 home switch 在本次手动尝试中报告 `Cannot home while shared home switch is closed j=2`,因此 AUTO 模式按钮可能保持禁用。加载程序本身仍可通过 GUI 文件页/API 验证。 - 加载和运行是两个动作:`program_open` 只读入程序并生成预览;需要 `AUTO` 页面中的 Run 按钮或 `R` 快捷键才会执行。 ## 推荐操作顺序 1. 启动 `./run-gmoccapy.sh`。 2. 关闭首次 `Important change(s)` 提示;可勾选 `Don't show this again`。 3. 确认急停复位、机器上电,并按配置完成 homing;否则 AUTO 可能被门控。 4. 点击右侧 AUTO 图标,进入 AUTO 按钮页。 5. 点击带打开文件/文件夹图标的 `Load a new program`。 6. 选择 `linuxcnc/nc_files` 下的 `.ngc` 文件,点击底部绿色对勾。 7. 检查顶部路径和预览轨迹,再使用 Run;不要把加载误认为已经执行。 ## 证据文件 - `gmoccapy-important-changes.png`:用户原始提示截图。 - `gmoccapy-before-load.png`:未加载程序。 - `gmoccapy-after-popup-close.png`:关闭提示后的主界面。 - `gmoccapy-load-file-page.png`:实际文件选择页。 - `gmoccapy-program-loaded.png`:加载后的程序和轨迹。 - `gmoccapy-file-inventory.json`:逐文件 SHA-256 清单。