完整指南:在 Control 标签页定制你的 GCODE 按钮与反馈面板)
物联网后端【免费下载链接】OctoPrintOctoPrint is the snappy web interface for your 3D printer!项目地址https://gitcode.com/gh_mirrors/oc/OctoPrint点击查看免费下载导读OctoPrint 的自定义控制Custom Controls允许你在界面顶部的 Control 标签页中自由添加自定义按钮与控制组件从最简单的点击即发送一条 GCODE按钮到支持滑块/输入框参数化的命令再到基于 Jinja2 模板引擎渲染的完整 GCODE 脚本乃至通过正则表达式把打印机回传的信息实时渲染到界面上的反馈控件。本文以 docs/features/custom_controls.rst 为核心结合仓库内配置文件模式定义与前端ControlViewModel源码系统讲解config.yaml中controls段落的完整语法、全部属性、完整示例以及背后的实现机制。读完本文你将能独立编写从简单按钮到参数化脚本、打印机反馈面板的整套自定义控制配置。什么是 Custom ControlsOctoPrint 允许在界面 Control 标签页中添加自定义控制。控制类型从简单按钮点击后向打印机发送一行或多行 GCODE开始逐步延伸到允许用户输入参数值的参数化命令直到由 Jinja2 模板引擎支撑的完整 GCODE 脚本模板。自定义控制统一配置在config.yaml的controls段落中该段落本质上是一个描述所有自定义控制的层级结构。config.yaml 的具体位置因操作系统而异Linux~/.octoprint/config.yamlWindows%APPDATA%/OctoPrint/config.yamlmacOS~/Library/Application Support/OctoPrint/config.yaml提示为保证添加自定义控制后你的config.yaml仍然合法建议先阅读 YAML 入门指南。完整的 config.yaml 参考见 config.yaml 文档。完整示例一条配置四种能力以下示例定义了一个 Fan 分区包含一个可通过滑块调节转速默认 255的风扇开启控件和一个关闭风扇的控件、一个 Example for multiple commands 分区包含一个固定命令按钮与一个参数化命令按钮、一个 Reporting 分区对 M114 输出做正则匹配并渲染反馈以及一个带用户输入的 GCODE 脚本控件 Dancecontrols: - name: Fan layout: horizontal children: - name: Enable Fan command: M106 S%(speed)s input: - name: Speed (0-255) parameter: speed default: 255 slider: min: 0 max: 255 - name: Disable Fan command: M107 - name: Example for multiple commands children: - name: Move X (static) confirm: You are about to move the X axis right by 10mm with 3000mm/min. commands: - G91 - G1 X10 F3000 - G90 - name: Move X (parametric) commands: - G91 - G1 X%(distance)s F%(speed)s - G90 input: - default: 10 name: Distance parameter: distance - default: 3000 name: Speed parameter: speed - name: Reporting children: - name: Get Position command: M114 regex: X:([-]?[0-9.]) Y:([-]?[0-9.]) Z:([-]?[0-9.]) E:([-]?[0-9.]) template: Position: X{0}, Y{1}, Z{2}, E{3} - name: Fun stuff children: - name: Dance script: custom/dance.gco input: - name: Go arounds parameter: repetitions slider: max: 10 min: 1 step: 1将上述内容追加到config.yaml、重启 OctoPrint 服务并切换到界面中的 Control 标签页即可得到下图所示的渲染效果可以看到自定义控制存在两种基本类型真正执行动作的控件提供按钮点击时向打印机发送一条或多条命令或展示从打印机接收到的输出以及仅作为其他控件容器的控件后者通过拥有children属性来识别用于包裹更多控件。提示如果你不想手工编辑配置文件可以查看随 OctoPrint 捆绑的 Custom Control Manager 插件它允许你通过 OctoPrint 的设置界面直接配置自定义控制。容器Containers属性详解容器本身不发送任何命令只负责组织与布局其内部的孩子控件。可用属性如下属性描述children该容器包含的子控件或子容器列表name可选显示在容器上方的名称相当于分区标题layout可选孩子控件的排布方式从上到下vertical、从左到右horizontal或以从左到右的网格排布horizontal_grid孩子可通过可选的width和offset控制占位。默认verticalcollapsed可选当设置了name时是否默认折叠容器。默认false从源码结构看这些约束在配置模式层被定义在 src/octoprint/schema/config/controls.py 中LayoutEnum枚举了vertical、horizontal、horizontal_grid三种合法取值CustomControlContainer中layout默认vertical、collapsed默认false。在前端 src/octoprint/static/js/app/viewmodels/control.js 的_processControl中如果layout缺失或不是上述三种取值之一会被强制回退为verticalcollapsed未定义时同样默认false与配置模式保持一致。控件Controls属性详解控件是真正干活的节点可用属性如下属性描述name控件名称对于发送命令的控件显示为按钮文字对于仅展示输出的控件显示为标签command可选单条 GCODE 命令。渲染为按钮点击即发送按钮文字为name值。与commands、script互斥。打印机离线或打印中或enabled定义的条件不满足时按钮被禁用commands可选GCODE 命令列表点击时依次发送。与command、script互斥其余行为同上script可选要发送的完整 GCODE 脚本名称。渲染为按钮点击即发送脚本。与command、commands互斥其余行为同上。输入参数值在脚本模板上下文中以parameter变量暴露如输入参数speed在脚本模板中写作parameter.speed此外 GCODE 模板上下文中定义的所有其他变量同样可用。示例见下文参数化 GCODE 脚本javascript可选点击command/commands对应按钮时执行的 JavaScript 片段可覆盖直接发送命令的默认行为实现更复杂的逻辑。片段会被eval执行作用域中控件本身作为局部变量data、ControlViewModel作为self提供additionalClasses可选应用到按钮上的额外 CSS 类默认类为btn。可用来定制按钮外观例如设为btn-danger让按钮变红enabled可选返回true/false的 JavaScript 片段决定控件是否可用可覆盖默认的启用逻辑默认在打印机离线时禁用。同样被eval执行作用域提供data与selfinput可选为command/commands定义的输入参数列表渲染为附加输入字段。command/commands中可包含将被用户输入值替换的占位符input.name输入字段的显示名称input.parameter输入字段的内部参数名用作command/commands中的占位符input.default输入字段的默认值input.slider可选若包含此属性渲染滑块而非输入框。若不想定义min/max/step中的任何一个写slider: {}即可按默认值渲染滑块input.slider.min可选滑块最小值默认 0input.slider.max可选滑块最大值默认 255input.slider.step可选滑块每格的步长默认 1regex可选用于匹配打印机回传行的正则表达式与template配合可在 UI 中渲染从打印机接收到的数据。请同时阅读下方注意事项template可选用于渲染regex匹配结果的模板占位符遵循 Python 格式字符串语法可使用正则中的命名组如对正则T:\s*(?Ptemperature\d(\.\d*)使用Temperature: {temperature}也可使用位置组如对正则X:([0-9.]) Y:([0-9.]) Z:([0-9.]) E:([0-9.])使用Position: X{0}, Y{1}, Z{2}, E{3}。请同时阅读下方注意事项confirm可选点击按钮前向用户展示的确认文案可用于 EEPROM 值修改等敏感操作以防止误触。文案会显示在确认对话框中效果如下图所示注意事项regex与template仅对通过config.yaml定义的控件生效。通过前端 getAdditionalControls 视图模型回调添加的控件不支持这两个属性。配置模式层在 src/octoprint/schema/config/controls.py 的CustomControl中给出了与上表一致的定义并额外提供了description字段可选显示为按钮/标签的工具提示。注意该模式同样规定command、commands、script三者互斥任一时刻只能定义一个。输入字段与滑块让命令参数化input是让按钮活起来的关键。以下配置定义一个风扇转速控制命令字符串中的%(speed)s占位符会被用户在输入框/滑块中设置的值替换name: Enable Fan command: M106 S%(speed)s input: - name: Speed (0-255) parameter: speed default: 255 slider: min: 0 max: 255在 OctoPrint 的默认 UI 中输入字段总是从左到右内联渲染。关于滑块默认值前端的_processControlsrc/octoprint/static/js/app/viewmodels/control.js做了细致的处理滑块缺省min0、max255默认值优先取default缺失时回退到min若default超出[min, max]范围会就近修正到较近的边界值确保滑块总能正常展示。非滑块输入字段则直接取default作为初始值未定义则为undefined。打印机反馈regex template 渲染实时输出regex与template组合可以让按钮点击后把打印机回传的输出实时渲染到界面上。以下例来自上文的完整示例- name: Get Position command: M114 regex: X:([-]?[0-9.]) Y:([-]?[0-9.]) Z:([-]?[0-9.]) E:([-]?[0-9.]) template: Position: X{0}, Y{1}, Z{2}, E{3}点击后 OctoPrint 发送M114打印机回传的坐标行会被regex匹配捕获组依次填入template的位置占位符最终以Position: X... Y... Z... E...的形式显示在控件标签上。从源码看这类反馈控件在后端与前端各有一层处理后端设置处理函数_process_custom_controlssrc/octoprint/settings/init.py会在配置加载阶段对同时具备regex与template的控件分别用 MD5 生成key与template_key用于把哪条正则与哪个模板输出关联起来对于含children的容器则递归处理子控件。前端ControlViewModel的_processControl会为带template且尚未有输出的控件建立可观察输出并登记到feedbackControlLookup映射表中key→template_key→ 输出 observable当收到RegisteredMessage事件onEventRegisteredMessageReceived时按事件负载中的key找到对应的输出并填充渲染值。因此反馈控件的数据流是后端配置预处理生成哈希键 → 前端注册输出槽 → 打印机回传行匹配正则 → 通过事件把渲染结果写入 UI。参数化 GCODE 脚本从按钮到完整动作编排script属性可以挂载存放在scripts/gcode目录OctoPrint 配置目录下即上文提到的~/.octoprint等位置的 Jinja2 GCODE 脚本模板。控件定义的输入参数在模板上下文中的parameter变量下可用例如parameter.speed。以下控制定义位于~/.octoprint/config.yamlname: Dance script: custom/dance.gco input: - default: 5 name: Go arounds parameter: repetitions slider: max: 10 min: 1 step: 1对应的脚本模板位于~/.octoprint/scripts/gcode/custom/dance.gco{% set center_x printer_profile.volume.width / 2 %} {% set center_y printer_profile.volume.depth / 2 %} {% set speed_x printer_profile.axes.x.speed %} {% set speed_y printer_profile.axes.y.speed %} {% set speed_z printer_profile.axes.z.speed %} M117 run {{ script.name }} G4 P500 G1 Z10 G1 X{{ center_x }} Y{{ center_y }} F{{ speed_x }} M117 lets dance! G91 G1 X-1 Y-1 F{{ speed_x }} {% for n in range(parameters.repetitions) %} M117 and {{ n 1 }} {% if n % 2 0 %} G1 Z1 F{{ speed_z }} G1 Z-2 F{{ speed_z }} G1 Z1 F{{ speed_z }} {% endif %} G1 X2 F{{ speed_x }} G1 Y2 F{{ speed_y }} G1 X-2 F{{ speed_x }} G1 Y-2 F{{ speed_y }} {% endfor %} G90 G1 X{{ center_x }} Y{{ center_y }} F{{ speed_x }} G28 X0 Y0注意脚本中对parameters.repetitions模板变量的使用它会包含用户通过 Go arounds 滑块选择的值从而控制循环跳舞的圈数。脚本同时演示了从 GCODE 脚本上下文读取printer_profile打印平台尺寸、各轴速度等与scriptscript.name即脚本名custom/dance.gco的用法。GCODE 脚本上下文还提供last_position最近一次 M114 坐标、last_temperature各工具与热床的 actual/target 温度、last_fanspeed、relative_axes_requested、relative_extruder_requested以及插件注入的plugins变量可用于编写更复杂的脚本逻辑。按钮行为细节javascript、enabled 与 confirm三个属性共同决定按钮点击前后的行为前端的clickCustom与_processControlsrc/octoprint/static/js/app/viewmodels/control.js展示了它们的执行逻辑confirm若控件定义了confirm点击按钮会先弹出确认对话框用户确认后才继续执行后续动作onproceed回调。javascript若定义了javascript且是字符串会被包装成函数并在点击时eval执行从而覆盖默认发送命令的行为执行上下文提供控件自身data与ControlViewModelself。enabled若定义了enabled且是字符串会被包装成返回布尔值的函数并eval执行未定义时使用默认启用逻辑——用户拥有 CONTROL 权限且打印机处于 operational就绪状态。默认情况下按钮在打印机离线或打印中也会被禁用。数据流前端渲染与 API 调用链自定义控制从配置到按钮的完整链路可以从源码中得到印证配置加载config.yaml中的controls段落经 src/octoprint/schema/config/init.py 的配置模式校验后进入设置系统并由_process_custom_controls做预处理regex/template 哈希、children 递归。API 暴露前端通过GET api/printer/command/custom获取控件列表对应服务端实现为 src/octoprint/server/api/printer.py 的getCustomControls受CONTROL权限保护它调用打印机层的get_additional_controls()接口定义见 src/octoprint/printer/init.py并返回序列化后的控件数据。前端渲染ControlViewModel的refreshControls拉取服务端控件并合并前端插件通过getAdditionalControls回调追加的控件经_processControl处理后渲染为按钮/输入框/滑块/输出标签。设置中的controls变化以及PrinterControlsChanged事件都会触发重新拉取与渲染。命令发送点击按钮时sendCustomCommand根据控件类型调用客户端 APIsrc/octoprint/static/js/app/client/control.js含command/commands的走POST api/printer/command携带commands与parameters含script的同样走该端点携带script、context、parameters。使用建议与限制修改config.yaml后需要重启 OctoPrint 服务才能生效Custom Control Manager 插件方式则可在设置界面即时调整。保持 YAML 缩进与语法合法建议对照 YAML 入门指南 检查。同一控件内command、commands、script互斥regex/template仅对 config.yaml 定义的控件生效前端插件添加的控件不支持。若需更精细的启用/禁用逻辑或按钮点击后的自定义动作利用enabled与javascript两个eval化属性注意其执行上下文data与self。对敏感操作改 EEPROM、大幅移动轴等务必使用confirm增加确认步骤防止误触。通过合理组合容器布局、参数化输入、脚本模板与正则反馈自定义控制几乎可以为任何日常操作打造专属的控制面板而无需额外编写插件。赞分享物联网后端【免费下载链接】OctoPrintOctoPrint is the snappy web interface for your 3D printer!项目地址https://gitcode.com/gh_mirrors/oc/OctoPrint点击查看免费下载相关推荐poi-tl列表编号功能深度解析构建专业文档的终极指南poi tl列表编号功能深度解析构建专业文档的终极指南 在Java生态中文档生成一直是个复杂而繁琐的任务而poi tl作为基于Apache POI的Wor模板引擎后端OctoPrint JavaScript 客户端库 control 组件打印机自定义控制与 GCODE 命令发送实战指南OctoPrint JavaScript 客户端库 control 组件打印机自定义控制与 GCODE 命令发送实战指南 OctoPrint 的 JavaSc物联网后端如何快速上手Lemonade3分钟搭建你的远程剪贴板服务如何快速上手Lemonade3分钟搭建你的远程剪贴板服务 Lemonade是一款轻量级远程工具能够通过TCP协议实现跨设备的复制、粘贴和浏览器打开功能。本文开发工具上一篇U校园自动答题助手Python智能工具让你告别手动刷题烦恼 下一篇Quill.js 开源项目教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考