zkk 7f8d113e74 修复耗材检测显示偶尔不正确的问题,有些弹窗会异常问题,以及一点翻译优化
Squashed commit of the following:

commit cf7cafefbcd2274c9a481e58042d11db8cd79961
Merge: dc3478b4 8d259cea
Author: zkk <1007518571@qq.com>
Date:   Tue Jan 7 17:26:59 2025 +0800

    Merge commit '8d259ceadd5026cecc1dc61224d91aef4f3877b4' into release

commit 8d259ceadd5026cecc1dc61224d91aef4f3877b4
Author: zkk <1007518571@qq.com>
Date:   Tue Jan 7 17:15:46 2025 +0800

    实现 打印中恢复喷头温度 提示语的翻译

commit dd11c9683cb5af5407e650eea9b683b1066256c7
Author: zkk <1007518571@qq.com>
Date:   Tue Jan 7 16:52:04 2025 +0800

    优化单个喷头时不显示喷头偏移菜单

commit c3ec7a81bbe1490b76202485d0502a4829a3cee5
Author: zkk <1007518571@qq.com>
Date:   Fri Jan 3 17:52:24 2025 +0800

    修复屏幕耗材检测显示偶尔不准确的问题

commit 413bf6fc4a740f53d265c63abe7c51eaad483cb0
Author: zkk <1007518571@qq.com>
Date:   Fri Jan 3 15:00:54 2025 +0800

    修复耗材检测弹窗异常问题

commit dc3478b48c7da1dbae120d1270c9ab64646d6647
Merge: 02c7556c 3bfc1aa7
Author: zkk <1007518571@qq.com>
Date:   Thu Jan 2 11:18:07 2025 +0800

    Merge commit '3bfc1aa714e282d74b801155d830377ca58d8f59' into release

commit 3bfc1aa714e282d74b801155d830377ca58d8f59
Author: zkk <1007518571@qq.com>
Date:   Thu Jan 2 11:17:15 2025 +0800

    修复移轴页面移轴功能失效问题

commit 02c7556cdadf8de1ef3c54d2831920927cadbe30
Merge: 6bfa42e0 991003e6
Author: zkk <1007518571@qq.com>
Date:   Tue Dec 31 15:07:54 2024 +0800

    Merge commit '991003e6cbea335eca73d3783aa1837059614724' into release

commit 991003e6cbea335eca73d3783aa1837059614724
Author: zkk <1007518571@qq.com>
Date:   Tue Dec 31 15:03:34 2024 +0800

    优化完整 简体中文和繁体中文的翻译

commit 1a177e90d09b9b9949bff2a1e3c6b12173420620
Author: zkk <1007518571@qq.com>
Date:   Tue Dec 31 14:10:03 2024 +0800

    优化排除对象的英文语法错误

commit e8d509cb6c2883b1fadb5ab9f9ca658e61849055
Author: zkk <1007518571@qq.com>
Date:   Fri Dec 27 16:40:52 2024 +0800

    优化耗材检测显示内容

commit 1b7670485a918cb334119175777525f768e670be
Author: zkk <1007518571@qq.com>
Date:   Fri Dec 27 14:56:25 2024 +0800

    完善断料自动切头功能描述

commit ecc0c3dd16442497e56f5f8ab3a0c6be00bd180e
Author: zkk <1007518571@qq.com>
Date:   Fri Dec 27 13:40:01 2024 +0800

    实现弹窗翻译功能

commit bc6d60fa183af50b7b16fea685139ca9d5df90ea
Author: zkk <1007518571@qq.com>
Date:   Fri Dec 27 09:53:16 2024 +0800

    优化不合理名称和不合理大小写

commit 2e650926bdba1c65baa506be1b1dd09621e8d8ea
Author: zkk <1007518571@qq.com>
Date:   Thu Dec 26 15:06:11 2024 +0800

    修复10寸屏幕偏移值微调页面出界问题

commit c481b551f777a3a6cadf7be3bfcab38448b51694
Author: zkk <1007518571@qq.com>
Date:   Wed Dec 25 15:28:26 2024 +0800

    优化移轴设置页面没有返回按钮的问题

commit 2b3c9936bd693c8fc265d6352799f382680f4920
Author: zkk <1007518571@qq.com>
Date:   Wed Dec 25 10:05:04 2024 +0800

    删除移动设置页面中轴反转的选项

commit 5e37d59497c54086d3f1e215cbabc03254857a58
Author: zkk <1007518571@qq.com>
Date:   Wed Dec 25 09:05:03 2024 +0800

    优化选择语言标题

commit 5214c3697baac78bd0a465e33d6f4f3c1e30862e
Author: zkk <1007518571@qq.com>
Date:   Tue Dec 24 10:57:41 2024 +0800

    增加设置hostname功能

commit 3709a7465cc2e0d677ecc9979fb18144f7e0ec33
Author: zkk <1007518571@qq.com>
Date:   Tue Dec 24 10:43:46 2024 +0800

    增加工厂设置中打包模式

commit 0c2a2618beb68d50601e433beef06122fb0ffd40
Author: zkk <1007518571@qq.com>
Date:   Mon Dec 23 16:25:37 2024 +0800

    实现恢复出厂设置功能

commit e3a38f85613d53a4a063e835c34c701196010c6e
Author: zkk <1007518571@qq.com>
Date:   Mon Dec 23 15:48:17 2024 +0800

    一点格式化

commit 4e9e452e8bed4b53eaaae8f0a69142de8aa50611
Author: zkk <1007518571@qq.com>
Date:   Sat Dec 21 14:20:22 2024 +0800

    优化探针偏移值校准时如果当前激活为第一个喷头时不会重复激活喷头

commit 3b85e8e8d59b0d4eae75f80d9e637fe9dc272cbe
Merge: 882850db 10ec2029
Author: zkk <1007518571@qq.com>
Date:   Wed Dec 18 17:26:08 2024 +0800

    Merge branch 'develop' of https://server.creatbot.com/Gitea/CreatBot/CreatBotKlipperScreen into develop

commit 882850dbde648598e5f91281101d0ea01fd56d56
Author: zkk <1007518571@qq.com>
Date:   Wed Dec 18 17:21:16 2024 +0800

    补充双喷头偏移校准页面二维码图片

commit 10ec2029eb73e66874d5a0ec492c016480641110
Author: ruipeng <1041589370@qq.com>
Date:   Wed Dec 18 17:17:18 2024 +0800

    增加自动切换喷头开关选项

commit 3d6eed9d9526b77472ba7df29014b5768c594026
Author: zkk <1007518571@qq.com>
Date:   Mon Dec 16 16:33:34 2024 +0800

    喷头偏移值校准功能的实现

commit 40ecbb3ea4827c9bac1aa271cccc958c94c1114a
Author: zkk <1007518571@qq.com>
Date:   Fri Dec 13 09:20:00 2024 +0800

    z探针校准时指定默认激活工具头为第一个头

commit bce3caa409618ef5bc2067865940d14a1441c0f8
Author: zkk <1007518571@qq.com>
Date:   Fri Dec 13 09:19:19 2024 +0800

    优化z探针校准时候移动过慢问题

commit 6bfa42e036a521c8ff7db1bf8ccb65500eabb6ea
Merge: 1a87ced3 4f3aa9aa
Author: zkk <1007518571@qq.com>
Date:   Thu Dec 12 10:33:58 2024 +0800

    Merge commit '4f3aa9aa4c581ae9e7a740bd37f9e80ba064c27f' into release

commit 4f3aa9aa4c581ae9e7a740bd37f9e80ba064c27f
Merge: e3fd413d 1a69b518
Author: zkk <1007518571@qq.com>
Date:   Thu Dec 12 10:30:00 2024 +0800

    Merge branch 'develop' of https://server.creatbot.com/Gitea/CreatBot/CreatBotKlipperScreen into develop

commit 1a69b5180de733f15550a1294a7221d6070306a0
Author: ruipeng <1041589370@qq.com>
Date:   Wed Dec 11 11:44:36 2024 +0800

    新增D600pro2、D1000的V0版机型

commit e3fd413d6256414441e9fe653c1132b1799a5cb2
Author: zkk <1007518571@qq.com>
Date:   Tue Dec 10 14:34:13 2024 +0800

    修复打印时没有修改z偏移值 仍提示保存z偏移的按钮的bug

commit 594fb668fe94fe907c028bf65ecced43ea8660cb
Author: zkk <1007518571@qq.com>
Date:   Tue Dec 10 14:25:04 2024 +0800

    设置自适应调平选项默认为关闭状态

commit 1a87ced3f5725569a6b9a7ee5f5250044d01d852
Merge: 629416d1 6064a6e1
Author: zkk <1007518571@qq.com>
Date:   Fri Nov 29 10:18:32 2024 +0800

    Merge branch 'develop' into release

# Conflicts:
#	config/main_menu.conf
#	ks_includes/locales/zh_CN/LC_MESSAGES/KlipperScreen.mo   resolved by cf7cafefbcd2274c9a481e58042d11db8cd79961 version
#	ks_includes/locales/zh_CN/LC_MESSAGES/KlipperScreen.po
#	ks_includes/locales/zh_TW/LC_MESSAGES/KlipperScreen.mo   resolved by cf7cafefbcd2274c9a481e58042d11db8cd79961 version
#	ks_includes/locales/zh_TW/LC_MESSAGES/KlipperScreen.po
#	ks_includes/prompts_text.py
#	ks_includes/widgets/prompts.py
#	screen.py
2025-01-07 17:35:27 +08:00

314 lines
16 KiB
Python

import logging
import re
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Pango
from ks_includes.KlippyGcodes import KlippyGcodes
from ks_includes.screen_panel import ScreenPanel
from ks_includes.widgets.autogrid import AutoGrid
from ks_includes.KlippyGtk import find_widget
class Panel(ScreenPanel):
def __init__(self, screen, title):
title = title or _("Extrude")
super().__init__(screen, title)
self.current_extruder = self._printer.get_stat("toolhead", "extruder")
macros = self._printer.get_config_section_list("gcode_macro ")
self.load_filament = any("LOAD_FILAMENT" in macro.upper() for macro in macros)
self.unload_filament = any("UNLOAD_FILAMENT" in macro.upper() for macro in macros)
self.speeds = ['1', '2', '5', '25']
self.distances = ['5', '10', '15', '25']
if self.ks_printer_cfg is not None:
dis = self.ks_printer_cfg.get("extrude_distances", '')
if re.match(r'^[0-9,\s]+$', dis):
dis = [str(i.strip()) for i in dis.split(',')]
if 1 < len(dis) < 5:
self.distances = dis
vel = self.ks_printer_cfg.get("extrude_speeds", '')
if re.match(r'^[0-9,\s]+$', vel):
vel = [str(i.strip()) for i in vel.split(',')]
if 1 < len(vel) < 5:
self.speeds = vel
self.distance = int(self.distances[1])
self.speed = int(self.speeds[1])
self.buttons = {
'extrude': self._gtk.Button("extrude", _("Extrude"), "color4"),
'load': self._gtk.Button("arrow-down", _("Load"), "color3"),
'unload': self._gtk.Button("arrow-up", _("Unload"), "color2"),
'retract': self._gtk.Button("retract", _("Retract"), "color1"),
'temperature': self._gtk.Button("heat-up", _("Temperature"), "color4"),
'spoolman': self._gtk.Button("spoolman", "Spoolman", "color3"),
'pressure': self._gtk.Button("settings", _("Pressure Advance"), "color2"),
'retraction': self._gtk.Button("settings", _("Retraction"), "color1")
}
self.buttons['extrude'].connect("clicked", self.extrude, "+")
self.buttons['load'].connect("clicked", self.load_unload, "+")
self.buttons['unload'].connect("clicked", self.load_unload, "-")
self.buttons['retract'].connect("clicked", self.extrude, "-")
self.buttons['temperature'].connect("clicked", self.menu_item_clicked, {
"panel": "temperature"
})
self.buttons['spoolman'].connect("clicked", self.menu_item_clicked, {
"panel": "spoolman"
})
self.buttons['pressure'].connect("clicked", self.menu_item_clicked, {
"panel": "pressure_advance"
})
self.buttons['retraction'].connect("clicked", self.menu_item_clicked, {
"panel": "retraction"
})
xbox = Gtk.Box(homogeneous=True)
limit = 4
i = 0
extruder_buttons = []
self.labels = {}
for extruder in self._printer.get_tools():
if self._printer.extrudercount == 1:
self.labels[extruder] = self._gtk.Button("extruder", "")
else:
n = self._printer.get_tool_number(extruder)
self.labels[extruder] = self._gtk.Button(f"extruder-{n}", f"T{n}")
self.labels[extruder].connect("clicked", self.change_extruder, extruder)
if extruder == self.current_extruder:
self.labels[extruder].get_style_context().add_class("button_active")
if self._printer.extrudercount < limit:
xbox.add(self.labels[extruder])
i += 1
else:
extruder_buttons.append(self.labels[extruder])
for widget in self.labels.values():
label = find_widget(widget, Gtk.Label)
label.set_justify(Gtk.Justification.CENTER)
label.set_line_wrap(True)
label.set_lines(2)
if extruder_buttons:
self.labels['extruders'] = AutoGrid(extruder_buttons, vertical=self._screen.vertical_mode)
self.labels['extruders_menu'] = self._gtk.ScrolledWindow()
self.labels['extruders_menu'].add(self.labels['extruders'])
if self._printer.extrudercount >= limit:
changer = self._gtk.Button("toolchanger")
changer.connect("clicked", self.load_menu, 'extruders', _('Extruders'))
xbox.add(changer)
self.labels["current_extruder"] = self._gtk.Button("extruder", "")
xbox.add(self.labels["current_extruder"])
self.labels["current_extruder"].connect("clicked", self.load_menu, 'extruders', _('Extruders'))
if not self._screen.vertical_mode:
xbox.add(self.buttons['pressure'])
i += 1
if self._printer.get_config_section("firmware_retraction") and not self._screen.vertical_mode:
xbox.add(self.buttons['retraction'])
i += 1
if i < limit:
xbox.add(self.buttons['temperature'])
if i < (limit - 1) and self._printer.spoolman:
xbox.add(self.buttons['spoolman'])
distgrid = Gtk.Grid()
for j, i in enumerate(self.distances):
self.labels[f"dist{i}"] = self._gtk.Button(label=i)
self.labels[f"dist{i}"].connect("clicked", self.change_distance, int(i))
ctx = self.labels[f"dist{i}"].get_style_context()
ctx.add_class("horizontal_togglebuttons")
if int(i) == self.distance:
ctx.add_class("horizontal_togglebuttons_active")
distgrid.attach(self.labels[f"dist{i}"], j, 0, 1, 1)
speedgrid = Gtk.Grid()
for j, i in enumerate(self.speeds):
self.labels[f"speed{i}"] = self._gtk.Button(label=i)
self.labels[f"speed{i}"].connect("clicked", self.change_speed, int(i))
ctx = self.labels[f"speed{i}"].get_style_context()
ctx.add_class("horizontal_togglebuttons")
if int(i) == self.speed:
ctx.add_class("horizontal_togglebuttons_active")
speedgrid.attach(self.labels[f"speed{i}"], j, 0, 1, 1)
distbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
self.labels['extrude_dist'] = Gtk.Label(_("Distance (mm)"))
distbox.pack_start(self.labels['extrude_dist'], True, True, 0)
distbox.add(distgrid)
speedbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
self.labels['extrude_speed'] = Gtk.Label(_("Speed (mm/s)"))
speedbox.pack_start(self.labels['extrude_speed'], True, True, 0)
speedbox.add(speedgrid)
filament_sensors = self._printer.get_filament_sensors()
res = self._screen.apiclient.send_request("printer/objects/query?" + "&".join(filament_sensors))
if res.get('status'):
self._printer.data.update(res['status'])
sensors = Gtk.Grid(valign=Gtk.Align.CENTER, row_spacing=5, column_spacing=5)
if len(filament_sensors) > 0:
for s, x in enumerate(filament_sensors):
if s > limit:
break
name = x[23:].strip()
self.labels[x] = {
'label': Gtk.Label(label=_("Not Enabled"), hexpand=True, halign=Gtk.Align.CENTER,
ellipsize=Pango.EllipsizeMode.END),
'switch': Gtk.Switch(width_request=round(self._gtk.font_size * 2),
height_request=round(self._gtk.font_size)),
'box': Gtk.Box()
}
self.labels[x]['switch'].connect("notify::active", self.enable_disable_fs, name, x)
self.labels[x]['box'].pack_start(self.labels[x]['label'], True, True, 10)
self.labels[x]['box'].pack_start(self.labels[x]['switch'], False, False, 0)
self.labels[x]['box'].get_style_context().add_class("filament_sensor")
sensors.attach(self.labels[x]['box'], s, 0, 1, 1)
grid = Gtk.Grid(column_homogeneous=True)
grid.attach(xbox, 0, 0, 4, 1)
if self._screen.vertical_mode:
grid.attach(self.buttons['extrude'], 0, 1, 2, 1)
grid.attach(self.buttons['retract'], 2, 1, 2, 1)
grid.attach(self.buttons['load'], 0, 2, 2, 1)
grid.attach(self.buttons['unload'], 2, 2, 2, 1)
settings_box = Gtk.Box(homogeneous=True)
settings_box.add(self.buttons['pressure'])
if self._printer.get_config_section("firmware_retraction"):
settings_box.add(self.buttons['retraction'])
grid.attach(settings_box, 0, 3, 4, 1)
grid.attach(distbox, 0, 4, 4, 1)
grid.attach(speedbox, 0, 5, 4, 1)
grid.attach(sensors, 0, 6, 4, 1)
else:
grid.attach(self.buttons['extrude'], 0, 2, 1, 1)
grid.attach(self.buttons['load'], 1, 2, 1, 1)
grid.attach(self.buttons['unload'], 2, 2, 1, 1)
grid.attach(self.buttons['retract'], 3, 2, 1, 1)
grid.attach(distbox, 0, 3, 2, 1)
grid.attach(speedbox, 2, 3, 2, 1)
grid.attach(sensors, 0, 4, 4, 1)
self.menu = ['extrude_menu']
self.labels['extrude_menu'] = grid
self.content.add(self.labels['extrude_menu'])
def enable_buttons(self, enable):
for button in self.buttons:
if button in ("pressure", "retraction", "spoolman", "temperature"):
continue
self.buttons[button].set_sensitive(enable)
def activate(self):
self.enable_buttons(self._printer.state in ("ready", "paused"))
def process_update(self, action, data):
if action == "notify_gcode_response":
if "action:cancel" in data or "action:paused" in data:
self.enable_buttons(True)
elif "action:resumed" in data:
self.enable_buttons(False)
return
if action != "notify_status_update":
return
for x in self._printer.get_tools():
if x in data:
self.update_temp(
x,
self._printer.get_stat(x, "temperature"),
self._printer.get_stat(x, "target"),
self._printer.get_stat(x, "power"),
)
if "current_extruder" in self.labels:
self.labels["current_extruder"].set_label(self.labels[self.current_extruder].get_label())
if ("toolhead" in data and "extruder" in data["toolhead"] and
data["toolhead"]["extruder"] != self.current_extruder):
for extruder in self._printer.get_tools():
self.labels[extruder].get_style_context().remove_class("button_active")
self.current_extruder = data["toolhead"]["extruder"]
self.labels[self.current_extruder].get_style_context().add_class("button_active")
if "current_extruder" in self.labels:
n = self._printer.get_tool_number(self.current_extruder)
self.labels["current_extruder"].set_image(self._gtk.Image(f"extruder-{n}"))
for x in self._printer.get_filament_sensors():
if x in data:
if 'enabled' in data[x]:
self.labels[x]['switch'].set_active(data[x]['enabled'])
if 'filament_detected' in data[x]:
if self._printer.get_stat(x, "enabled"):
if data[x]['filament_detected']:
self.labels[x]['box'].get_style_context().remove_class("filament_sensor_empty")
self.labels[x]['box'].get_style_context().add_class("filament_sensor_detected")
self.labels[x]['label'].set_text(_("Inserted"))
else:
self.labels[x]['box'].get_style_context().remove_class("filament_sensor_detected")
self.labels[x]['box'].get_style_context().add_class("filament_sensor_empty")
self.labels[x]['label'].set_text(_("Not Inserted"))
logging.info(f"{x}: {self._printer.get_stat(x)}")
def change_distance(self, widget, distance):
logging.info(f"### Distance {distance}")
self.labels[f"dist{self.distance}"].get_style_context().remove_class("horizontal_togglebuttons_active")
self.labels[f"dist{distance}"].get_style_context().add_class("horizontal_togglebuttons_active")
self.distance = distance
def change_extruder(self, widget, extruder):
logging.info(f"Changing extruder to {extruder}")
if self.labels[extruder].get_style_context().has_class("button_active"):
self.menu_item_clicked(None, {"panel": "numpad", 'extra': f"{extruder}"})
return
for tool in self._printer.get_tools():
self.labels[tool].get_style_context().remove_class("button_active")
self.labels[extruder].get_style_context().add_class("button_active")
self._screen._send_action(widget, "printer.gcode.script",
{"script": f"T{self._printer.get_tool_number(extruder)}"})
def change_speed(self, widget, speed):
logging.info(f"### Speed {speed}")
self.labels[f"speed{self.speed}"].get_style_context().remove_class("horizontal_togglebuttons_active")
self.labels[f"speed{speed}"].get_style_context().add_class("horizontal_togglebuttons_active")
self.speed = speed
def extrude(self, widget, direction):
self._screen._ws.klippy.gcode_script(KlippyGcodes.EXTRUDE_REL)
self._screen._send_action(widget, "printer.gcode.script",
{"script": f"G1 E{direction}{self.distance} F{self.speed * 60}"})
def load_unload(self, widget, direction):
if direction == "-":
if not self.unload_filament:
self._screen.show_popup_message("Macro UNLOAD_FILAMENT not found")
else:
self._screen._send_action(widget, "printer.gcode.script",
{"script": f"UNLOAD_FILAMENT SPEED={self.speed * 60}"})
if direction == "+":
if not self.load_filament:
self._screen.show_popup_message("Macro LOAD_FILAMENT not found")
else:
self._screen._send_action(widget, "printer.gcode.script",
{"script": f"LOAD_FILAMENT SPEED={self.speed * 60}"})
def enable_disable_fs(self, switch, gparams, name, x):
if switch.get_active():
self._screen._ws.klippy.gcode_script(f"SET_FILAMENT_SENSOR SENSOR={name} ENABLE=1")
if self._printer.get_stat(x, "filament_detected"):
self.labels[x]['box'].get_style_context().add_class("filament_sensor_detected")
self.labels[x]['label'].set_text(_("Inserted"))
else:
self.labels[x]['box'].get_style_context().add_class("filament_sensor_empty")
self.labels[x]['label'].set_text(_("Not Inserted"))
else:
self._screen._ws.klippy.gcode_script(f"SET_FILAMENT_SENSOR SENSOR={name} ENABLE=0")
self.labels[x]['box'].get_style_context().remove_class("filament_sensor_empty")
self.labels[x]['box'].get_style_context().remove_class("filament_sensor_detected")
self.labels[x]['label'].set_text(_("Not Enabled"))
def update_temp(self, extruder, temp, target, power):
if not temp:
return
new_label_text = f"{temp or 0:.0f}"
if target:
new_label_text += f"/{target:.0f}°"
if self._show_heater_power and power:
new_label_text += f" {power * 100:3.0f}%"
find_widget(self.labels[extruder], Gtk.Label).set_text(new_label_text)