Merge branch 'develop' into release

This commit is contained in:
张开科 2024-11-29 10:18:32 +08:00
commit 1a87ced3f5
12 changed files with 292 additions and 29 deletions

View File

@ -161,7 +161,7 @@ class KlipperScreenConfig:
bools = (
'invert_x', 'invert_y', 'invert_z', '24htime', 'only_heaters', 'show_cursor', 'confirm_estop',
'autoclose_popups', 'use_dpms', 'use_default_menu', 'side_macro_shortcut', 'use-matchbox-keyboard',
'show_heater_power', "show_scroll_steppers", "auto_open_extrude"
'show_heater_power', "show_scroll_steppers", "auto_open_extrude" , 'onboarding'
)
strs = (
'default_printer', 'language', 'print_sort_dir', 'theme', 'screen_blanking_printing', 'font_size',
@ -319,6 +319,7 @@ class KlipperScreenConfig:
{"print_sort_dir": {"section": "main", "type": None, "value": "name_asc"}},
{"print_view": {"section": "main", "type": None, "value": "thumbs"}},
{"language": {"section": "main", "name": _("Language"), "type": None, "value": "system_lang"}},
{"onboarding": {"section": "main", "type": "binary", "value": "False"}},
]
self.configurable_options.extend(panel_options)

View File

@ -30,11 +30,12 @@ class BasePanel(ScreenPanel):
self.control['back'].set_no_show_all(True)
self.control['home'] = self._gtk.Button('main', scale=abscale)
self.control['home'].connect("clicked", self._screen._menu_go_back, True)
self.control['home'].set_no_show_all(True)
self.move = {
"panel": "move",
}
self.control['move'] = self._gtk.Button('move', scale=abscale)
self.control['move'].connect("clicked", self.menu_item_clicked, self.move)
self.control['move'].connect("clicked", self.menu_item_clicked, self.move)
self.control['move'].set_no_show_all(True)
self.extrude = {
"panel": "extrude",
@ -82,7 +83,6 @@ class BasePanel(ScreenPanel):
self.action_bar.set_hexpand(False)
self.action_bar.set_vexpand(True)
self.action_bar.get_style_context().add_class('action_bar')
self.action_bar.set_size_request(self._gtk.action_bar_width, self._gtk.action_bar_height)
self.action_bar.add(self.control['back'])
self.action_bar.add(self.control['home'])
self.action_bar.add(self.control['move'])
@ -229,10 +229,15 @@ class BasePanel(ScreenPanel):
panels_has_back = ['gcodes', 'temperature']
cur_panel_count = len(self._screen._cur_panels)
is_last_panel_in_back_list = self._screen._cur_panels[-1] in panels_has_back
if cur_panel_count > 2 or is_last_panel_in_back_list:
self.control['back'].set_visible(True)
should_show_back = (cur_panel_count > 2 or is_last_panel_in_back_list or
(self._screen._cur_panels[0] != 'main_menu' and cur_panel_count >= 2))
self.control['back'].set_visible(should_show_back)
if any(child.get_visible() for child in self.action_bar.get_children()):
self.show_action_bar()
else:
self.control['back'].set_visible(False)
self.hide_action_bar()
self.current_panel = panel
self.set_title(panel.title)
self.content.add(panel.content)
@ -321,7 +326,7 @@ class BasePanel(ScreenPanel):
def set_control_sensitive(self, value=True, control='home'):
self.control[control].set_sensitive(value)
def show_shortcut(self, show=True):
show = (
show
@ -335,6 +340,14 @@ class BasePanel(ScreenPanel):
self.set_control_sensitive(self._screen._cur_panels[-1] != self.files['panel'], control='files')
self.set_control_sensitive(self._screen._cur_panels[-1] != self.more['panel'], control='more')
def show_action_bar(self):
self.action_bar.set_size_request(self._gtk.action_bar_width, self._gtk.action_bar_height)
self.control['home'].set_visible(True)
def hide_action_bar(self):
self.action_bar.set_size_request(-1, -1)
self.control['home'].set_visible(False)
def show_printer_select(self, show=True):
self.control['printer_select'].set_visible(
show and 'printer_select' not in self._screen._cur_panels

View File

@ -67,6 +67,7 @@ class Panel(ScreenPanel):
self.loading_msg = _('Loading...')
self.labels['path'] = Gtk.Label(label=self.loading_msg, vexpand=True, no_show_all=True)
self.labels['path'].set_ellipsize(Pango.EllipsizeMode.END)
self.labels['path'].show()
self.thumbsize = self._gtk.img_scale * self._gtk.button_image_scale * 2.5
logging.info(f"Thumbsize: {self.thumbsize}")

View File

@ -166,7 +166,7 @@ class Panel(ScreenPanel):
'extra': extruder})
self.buttons['extruder'][extruder].set_halign(Gtk.Align.START)
self.labels['temp_grid'] = Gtk.Grid()
self.labels['temp_grid'] = Gtk.Grid(column_homogeneous=True)
nlimit = 3 if self._screen.width <= 500 else 4
n = 0
if nlimit > 2 and len(self._printer.get_tools()) == 2:
@ -179,6 +179,7 @@ class Panel(ScreenPanel):
self.labels['temp_grid'].attach(self.buttons['extruder'][self.current_extruder], n, 0, 1, 1)
n += 1
self.buttons['heater'] = {}
n = 0
for dev in self._printer.get_heaters():
if n >= nlimit:
break
@ -194,7 +195,7 @@ class Panel(ScreenPanel):
self.buttons['heater'][dev].connect("clicked", self.menu_item_clicked,
{"panel": "numpad", "extra": dev})
self.buttons['heater'][dev].set_halign(Gtk.Align.START)
self.labels['temp_grid'].attach(self.buttons['heater'][dev], n, 0, 1, 1)
self.labels['temp_grid'].attach(self.buttons['heater'][dev], n, 1, 1, 1)
n += 1
extra_item = not self._show_heater_power
if self.ks_printer_cfg is not None:
@ -218,7 +219,7 @@ class Panel(ScreenPanel):
self.buttons['heater'][device].connect("clicked", self.menu_item_clicked,
{"panel": "numpad"})
self.buttons['heater'][device].set_halign(Gtk.Align.START)
self.labels['temp_grid'].attach(self.buttons['heater'][device], n, 0, 1, 1)
self.labels['temp_grid'].attach(self.buttons['heater'][device], n, 1, 1, 1)
n += 1
break
@ -232,10 +233,10 @@ class Panel(ScreenPanel):
info = Gtk.Grid(row_homogeneous=True)
info.get_style_context().add_class("printing-info")
info.attach(self.labels['temp_grid'], 0, 0, 1, 1)
info.attach(szfe, 0, 1, 1, 2)
info.attach(self.buttons['elapsed'], 0, 3, 1, 1)
info.attach(self.buttons['left'], 0, 4, 1, 1)
info.attach(self.labels['temp_grid'], 0, 0, 1, 2)
info.attach(szfe, 0, 2, 1, 2)
info.attach(self.buttons['elapsed'], 0, 4, 1, 1)
info.attach(self.buttons['left'], 0, 5, 1, 1)
self.status_grid = info
def create_extrusion_grid(self, widget=None):

61
panels/language_select.py Normal file
View File

@ -0,0 +1,61 @@
import logging
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, GLib
from ks_includes.screen_panel import ScreenPanel
class Panel(ScreenPanel):
def __init__(self, screen, title):
title = title or "Select Language"
super().__init__(screen, title)
self.language_map = {
'cs': 'Čeština',
'da': 'Dansk',
'de': 'Deutsch',
'de_formal': 'Höfliches Deutsch',
'en': 'English',
'es': 'Español',
'et': 'Eesti',
'fr': 'Français',
'he': 'עברית',
'hu': 'Magyar',
'it': 'Italiano',
'jp': '日本語',
'ko': '한국어',
'lt': 'Lietuvių',
'nl': 'Nederlands',
'pl': 'Polski',
'pt': 'Português',
'pt_BR': 'Português (Brasil)',
'ru': 'Русский',
'sl': 'Slovenščina',
'sv': 'Svenska',
'tr': 'Türkçe',
'uk': 'Українська',
'vi': 'Tiếng Việt',
'zh_CN': '简体中文',
'zh_TW': '繁體中文',
}
self.langs = {}
self.labels['lang_menu'] = self._gtk.ScrolledWindow()
self.labels['lang'] = Gtk.Grid()
self.labels['lang_menu'].add(self.labels['lang'])
self.labels['lang'].set_margin_start(50)
for lang in self._config.lang_list:
name = self.language_map.get(lang)
if name:
self.langs[lang] = {
"name": name,
"type": "button",
"callback": self.change_language,
}
self.add_option("lang", self.langs, lang, self.langs[lang])
self.content.add(self.labels["lang_menu"])
self.content.show_all()
def change_language(self, widget, lang):
reverse_language_map = {v: k for k, v in self.language_map.items()}
language_code = reverse_language_map.get(lang, 'en')
self._screen.change_language(widget, language_code)
self._screen.initial_connection()

69
panels/onboarding.py Normal file
View File

@ -0,0 +1,69 @@
import logging
import os
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Pango
from ks_includes.screen_panel import ScreenPanel
class Panel(ScreenPanel):
def __init__(self, screen, title):
title = title or _('Welcome')
super().__init__(screen, title)
buttons = [
{"name": _("Next"), "response": Gtk.ResponseType.YES, "style": 'dialog-secondary'}
]
image = self._gtk.Image(
"retainer", self._gtk.content_width * 0.3, self._gtk.content_height * 0.5
)
start_text = _("1. For first use, refer to the accompanying diagram to disassemble the fixed components of the X, Y, and Z axes.")
space = "\n\n"
end_text = _("2. Once the disassembly is complete, click the 'Next' button to proceed.")
label = Gtk.Label(hexpand=True, vexpand=True, wrap=True, wrap_mode=Pango.WrapMode.WORD_CHAR)
label.set_markup(f"<big>{start_text + space + end_text}</big>\n")
box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, vexpand=True)
image.set_margin_start(60)
image.set_margin_top(80)
box.pack_start(image, False, True, 0)
box.pack_start(label, False, False, 20)
self._gtk.Dialog(f'Welcome', buttons, box, self.confirm_print_response)
def create_raise_platform(self):
buttons = [
{"name": _("Raise Platform"), "response": Gtk.ResponseType.OK},
{"name": _("Finish"), "response": Gtk.ResponseType.APPLY, "style": 'dialog-secondary'}
]
image = self._gtk.Image(
"take_out", self._gtk.content_width * 0.3, self._gtk.content_height * 0.5
)
start_text = _("1. Ensure that all fixed components have been properly removed before proceeding.")
center_text = _("2. Press the 'Raise Platform' button to lift the platform and remove the items underneath.")
end_text = _("3. Once the operation is complete, click the \'Finish\' button to conclude the process.")
space = "\n\n"
label = Gtk.Label(hexpand=True, vexpand=True, wrap=True, wrap_mode=Pango.WrapMode.WORD_CHAR)
label.set_markup(f"<big>{start_text + space + center_text + space + end_text}</big>\n")
box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, vexpand=True)
image.set_margin_start(60)
image.set_margin_top(80)
box.pack_start(image, False, True, 0)
box.pack_start(label, False, False, 20)
self._gtk.Dialog(f'Test', buttons, box, self.confirm_print_response)
def confirm_print_response(self, dialog, response_id):
if response_id == Gtk.ResponseType.YES:
self._gtk.remove_dialog(dialog)
self.create_raise_platform()
elif response_id == Gtk.ResponseType.OK:
self._screen._ws.klippy.gcode_script("SET_KINEMATIC_POSITION Z=5\nG28")
elif response_id == Gtk.ResponseType.APPLY:
self._screen.show_panel("main_menu", remove_all=True, items=self._config.get_menu_items("__main"))
self._config.set("main", "onboarding", "False")
self._config.save_user_config_options()

View File

@ -24,15 +24,50 @@ class Panel(ScreenPanel):
name = list(option)[0]
self.add_option('settings', self.settings, name, option[name])
self.language_map = {
'cs': 'Čeština',
'da': 'Dansk',
'de': 'Deutsch',
'de_formal': 'Höfliches Deutsch',
'en': 'English',
'es': 'Español',
'et': 'Eesti',
'fr': 'Français',
'he': 'עברית',
'hu': 'Magyar',
'it': 'Italiano',
'jp': '日本語',
'ko': '한국어',
'lt': 'Lietuvių',
'nl': 'Nederlands',
'pl': 'Polski',
'pt': 'Português',
'pt_BR': 'Português (Brasil)',
'ru': 'Русский',
'sl': 'Slovenščina',
'sv': 'Svenska',
'tr': 'Türkçe',
'uk': 'Українська',
'vi': 'Tiếng Việt',
'zh_CN': '简体中文',
'zh_TW': '繁體中文',
}
self.labels['lang_menu'] = self._gtk.ScrolledWindow()
self.labels['lang'] = Gtk.Grid()
self.labels['lang_menu'].add(self.labels['lang'])
for lang in ["system_lang", *self._config.lang_list]:
for lang in self._config.lang_list:
name = self.language_map.get(lang)
self.langs[lang] = {
"name": lang,
"name": name,
"type": "button",
"callback": self._screen.change_language,
"callback": self.change_language,
}
self.add_option("lang", self.langs, lang, self.langs[lang])
self.content.add(self.labels['settings_menu'])
def change_language(self, widget, lang):
reverse_language_map = {v: k for k, v in self.language_map.items()}
language_code = reverse_language_map.get(lang, 'en')
self._screen.change_language(widget, language_code)

View File

@ -50,7 +50,7 @@ class Panel(ScreenPanel):
scroll.add(self.labels["text"])
info = Gtk.Box()
info.pack_start(image, False, True, 8)
info.pack_start(image, False, True, 50)
info.pack_end(scroll, True, True, 8)
main = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)

View File

@ -17,6 +17,8 @@ class Panel(ScreenPanel):
self.current_row = 0
self.mem_multiplier = None
self.model_config = None
self.info_panel = None
self.select_model = False
self.scales = {}
self.labels = {}
self.models = {}
@ -34,15 +36,20 @@ class Panel(ScreenPanel):
screen.printer.system_info = self.sysinfo['system_info']
self.sysinfo = self.sysinfo['system_info']
logging.debug(self.sysinfo)
if self.sysinfo:
self.content.add(self.create_layout())
self.info_panel = self.create_layout()
else:
self.content.add(Gtk.Label(label=_("No info available"), vexpand=True))
def back(self):
if self.select_model:
self.hide_select_model()
return True
if not self.sysinfo:
self._screen.panels_reinit.append("system")
return False
def create_layout(self):
self.labels["cpu_usage"] = Gtk.Label(label="", xalign=0)
self.grid.attach(self.labels["cpu_usage"], 0, self.current_row, 1, 1)
@ -70,6 +77,11 @@ class Panel(ScreenPanel):
scroll = self._gtk.ScrolledWindow()
scroll.add(self.grid)
self.content.add(scroll)
return scroll
def create_select_model(self):
if "model_menu" in self.labels:
return
if self.model_config is None:
self.model_config = ModelConfig()
self.labels["model_menu"] = self._gtk.ScrolledWindow()
@ -91,9 +103,10 @@ class Panel(ScreenPanel):
self.add_option(
"model", self.models, model_name, self.models[model_name]
)
return scroll
def change_model(self, widget, event):
self.model_config.generate_config(event)
def on_model_click(self, widget, event):
current_time = time.time()
if (current_time - self.last_click_time) <= self.click_threshold:
@ -101,9 +114,22 @@ class Panel(ScreenPanel):
else:
self.click_count = 0
self.last_click_time = current_time
if self.click_count == self.target_clicks:
if self.click_count >= self.target_clicks:
for child in self.content.get_children():
self.content.remove(child)
self.click_count = 0
self.load_menu(self, "model", _("model select"))
self.create_select_model()
self.content.add(self.labels["model_menu"])
self.content.show_all()
self.select_model = True
def hide_select_model(self):
for child in self.content.get_children():
self.content.remove(child)
if self.info_panel:
self.content.add(self.info_panel)
self.content.show_all()
self.select_model = False
def set_mem_multiplier(self, data):
memory_units = data.get("memory_units", "kB").lower()
@ -122,12 +148,13 @@ class Panel(ScreenPanel):
label = Gtk.Label(label=text, use_markup=True, xalign=0, wrap=True)
self.grid.attach(label, column, self.current_row, 1, 1)
self.current_row += 1
def machine_info(self):
self.add_label_to_grid(self.prettify("device"), 0, bold=True)
self.current_row -= 1
self.add_label_to_grid("Maker: CreatBot", 1)
event_box = Gtk.EventBox()
event_box.connect("button-press-event", self.on_model_click)
event_box.connect("button-release-event", self.on_model_click)
mode = self._screen.connecting_to_printer.split("-")[0]
label = Gtk.Label(label=f"Model: {mode}", use_markup=True, xalign=0, wrap=True)
self.grid.attach(event_box, 1, self.current_row, 1, 1)

View File

@ -167,7 +167,10 @@ class KlipperScreen(Gtk.Window):
self.base_panel.activate()
self.set_screenblanking_timeout(self._config.get_main_config().get('screen_blanking'))
self.log_notification("KlipperScreen Started", 1)
self.initial_connection()
lang = self._config.get_main_config().get("language", 'system_lang')
(self.show_language_select() if lang == 'system_lang' else self.initial_connection())
def state_execute(self, state, callback):
self.close_screensaver()
@ -716,9 +719,16 @@ class KlipperScreen(Gtk.Window):
self.reset_screensaver_timeout()
return
def show_language_select(self, widget=None):
self.show_panel("language_select", remove_all=True)
def show_onboarding(self, widget=None):
self.show_panel("onboarding", remove_all=True)
def show_printer_select(self, widget=None):
self.base_panel.show_heaters(False)
self.show_panel("printer_select", remove_all=True)
if 'printer_select' not in self._cur_panels:
self.base_panel.show_heaters(False)
self.show_panel("printer_select", remove_all=True)
def websocket_connection_cancel(self):
self.printer_initializing(
@ -781,8 +791,12 @@ class KlipperScreen(Gtk.Window):
self.printer.state = "not ready"
return
self.files.refresh_files()
self.show_panel("main_menu", remove_all=True, items=self._config.get_menu_items("__main"))
self._ws.klippy.gcode_script("UPDATE_DELAYED_GCODE ID=_CHECK_POWER_LOSS_RECOVERY DURATION=0.1")
guided = self._config.get_main_config().get("onboarding", False)
if guided == 'True':
self.show_onboarding()
else:
self.show_panel("main_menu", remove_all=True, items=self._config.get_menu_items("__main"))
self._ws.klippy.gcode_script("UPDATE_DELAYED_GCODE ID=_CHECK_POWER_LOSS_RECOVERY DURATION=0.1")
def state_startup(self):
self.printer_initializing(_("Klipper is attempting to start"))
@ -938,7 +952,8 @@ class KlipperScreen(Gtk.Window):
def printer_initializing(self, msg, go_to_splash=False):
if 'splash_screen' not in self.panels or go_to_splash:
self.show_panel("splash_screen", remove_all=True)
if self._cur_panels != ['splash_screen']:
self.show_panel("splash_screen", remove_all=True)
self.panels['splash_screen'].update_text(msg)
self.log_notification(msg, 0)

View File

@ -0,0 +1,19 @@
<svg width="183" height="92" viewBox="0 0 183 92" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="0.689018" y="35.188" width="180.582" height="15.9219" fill="#D9D9D9" stroke="black"/>
<rect x="0.689034" y="29.542" width="180.582" height="5.12016" fill="#D9D9D9" stroke="black"/>
<rect x="73.2277" y="6.42432" width="50.8806" height="24.9403" fill="#D9D9D9" stroke="black"/>
<line x1="0.688789" y1="0.162109" x2="0.688785" y2="91.6498" stroke="white"/>
<line x1="181.754" y1="0.162109" x2="181.754" y2="91.6498" stroke="white"/>
<rect x="72.8122" y="49.3818" width="21.3087" height="32.7224" fill="#D9D9D9" stroke="black"/>
<rect x="74.1459" y="49.3818" width="18.9062" height="32.7224" fill="#D9D9D9" stroke="black"/>
<path d="M79.0141 58.5168C79.0141 59.0586 78.5748 59.4979 78.033 59.4979C77.4911 59.4979 77.0519 59.0586 77.0519 58.5168C77.0519 57.9749 77.4911 57.5356 78.033 57.5356C78.5748 57.5356 79.0141 57.9749 79.0141 58.5168Z" fill="#D9D9D9" stroke="black"/>
<rect x="102.163" y="49.3955" width="21.3087" height="32.7224" fill="#D9D9D9" stroke="black"/>
<rect x="103.497" y="49.3955" width="18.9062" height="32.7224" fill="#D9D9D9" stroke="black"/>
<path d="M120.295 58.5173C120.295 59.0591 119.856 59.4984 119.314 59.4984C118.772 59.4984 118.333 59.0591 118.333 58.5173C118.333 57.9754 118.772 57.5361 119.314 57.5361C119.856 57.5361 120.295 57.9754 120.295 58.5173Z" fill="#D9D9D9" stroke="black"/>
<rect x="123.59" y="34.8457" width="9.94008" height="15.9311" fill="#D81F2F" stroke="black"/>
<path d="M123.276 35.3276L125.069 35.8029L125.137 50.7102L124.276 50.0744L123.269 49.3904" stroke="black"/>
<path d="M126.478 34.5801L125.808 35.1319C125.346 35.5118 125.078 36.0784 125.078 36.6764V36.8138" stroke="black"/>
<rect x="72.2277" y="51.1094" width="9.94008" height="15.9311" transform="rotate(180 72.2277 51.1094)" fill="#D81F2F" stroke="black"/>
<path d="M72.5427 50.6274L70.7494 50.1522L70.6808 35.2449L71.5418 35.8806L72.5489 36.5647" stroke="black"/>
<path d="M69.3398 51.375L70.0105 50.8232C70.4723 50.4433 70.7398 49.8767 70.7398 49.2787V49.1413" stroke="black"/>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@ -0,0 +1,21 @@
<svg width="179" height="139" viewBox="0 0 179 139" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0.65625 114.812C0.65625 123.352 16.352 131.247 41.8281 135.515C67.3042 139.787 98.6958 139.787 124.172 135.515C149.648 131.247 165.344 123.352 165.344 114.812C165.344 101.611 128.475 90.9062 83 90.9062C37.525 90.9062 0.65625 101.611 0.65625 114.812Z" fill="#2965DE"/>
<path d="M84.7531 14.8789L30.8312 44.6103L84.4237 72.655L137.628 43.8347L84.7531 14.8789Z" fill="#8FAAFE"/>
<path d="M29.8245 73.6035V100.663L84.3467 129.348L139.392 100.66V73.7443" fill="#8FAAFE"/>
<path d="M84.6097 72.6577L84.3281 129.345L139.392 100.657V72.6577L104.648 93.7669L84.6097 72.6577Z" fill="#3D6CFB"/>
<path d="M156.923 63.5523L104.643 93.7671L84.6071 72.6553L137.626 43.835L156.923 63.5523Z" fill="#6D92FF"/>
<path d="M65.7158 93.0497L11.4831 63.2811L30.8312 44.6077L85.1622 72.926L65.7158 93.0497ZM30.8312 44.6103L10.8031 30.3941L65.4422 1.57377L84.7531 15.0144L30.8312 44.6103ZM137.631 43.8347L84.7531 14.8842L106.216 0.625488L158.005 27.6661L137.631 43.8374V43.8347Z" fill="#6D92FF"/>
<path d="M106.576 58.2806H61.9418V43.8623H107.275V58.2806H106.459" fill="#2D2F42"/>
<path d="M106.576 58.2806H61.9418V43.8623H107.275V58.2806H106.459" stroke="white" stroke-miterlimit="10"/>
<path d="M107.275 43.8622H61.9418L66.2097 29.0356H103.007L107.275 43.8622Z" fill="#2C2D40" stroke="white" stroke-miterlimit="10"/>
<path d="M107.275 48.3158H61.9418L62.851 44.0107H106.366L107.275 48.3158Z" stroke="white" stroke-miterlimit="10"/>
<path d="M86.4733 43.8251H82.7249L83.0033 29.147H86.2135L86.4733 43.8251Z" stroke="white" stroke-miterlimit="10"/>
<path d="M62.2758 46.8125H106.793" stroke="white" stroke-miterlimit="10"/>
<path d="M150.828 128.898C150.828 128.898 147.182 120.928 142.463 115.013C141.659 113.878 137.169 107.607 136.383 107.065C135.539 106.472 127.695 102.554 125.724 100.132C123.754 97.7102 121.241 93.144 119.726 91.0988C118.982 90.202 116.969 88.1354 116.093 86.917C115.186 85.7118 114.525 84.7432 113.102 81.458C112.566 80.7012 111.138 78.3197 107.356 75.5138C107.103 75.3547 106.078 74.0473 105.766 70.9071C105.502 68.7991 105.385 68.6969 104.839 67.4562C104.569 66.8907 102.305 63.3871 102.713 62.0927C103.114 61.5148 103.772 59.3662 106.563 60.3997C108.294 61.2297 109.46 61.0515 113.797 66.0338C114.333 66.7905 115.474 68.8391 115.91 69.2611C116.282 69.7096 118.788 72.8883 120.381 74.1132C121.967 75.4155 123.717 77.0263 124.85 76.6741C125.983 76.3219 128.945 74.8434 129.274 74.1821C129.559 73.502 131.311 73.1959 131.573 72.8257C131.834 72.4555 133.588 69.4066 133.439 67.8525C133.2 66.4477 133.18 66.306 132.481 65.428C131.783 64.5501 131.652 63.5897 131.233 62.9351C130.814 62.2806 127.75 55.2734 127.101 54.1498C126.498 53.0451 125.681 51.2389 125.95 49.5133" stroke="white" stroke-width="1.4" stroke-miterlimit="10"/>
<path d="M131.147 63.4587C131.147 63.4587 129.901 63.444 128.35 61.6766C126.798 59.9092 126.617 59.1945 126.617 59.1945" stroke="white" stroke-width="1.4" stroke-miterlimit="10"/>
<path d="M129.667 60.3094C129.667 60.3094 126.468 59.1053 124.657 58.7213C122.834 58.3052 119.947 56.6724 119.133 55.8794C118.32 55.0864 118.227 54.8613 118.227 54.8613" stroke="white" stroke-width="1.4" stroke-miterlimit="10"/>
<path d="M128.002 56.7106C128.002 56.7106 124.272 55.3112 123.467 55.4539C122.693 55.5835 118.406 55.3894 117.344 54.9988C116.25 54.6213 113.648 53.7733 112.824 52.4964C111.999 51.2194 111.858 50.6011 111.858 50.6011" stroke="white" stroke-width="1.4" stroke-miterlimit="10"/>
<path d="M126.299 53.2022C126.299 53.2022 123.772 52.8117 122.053 51.8267C120.353 50.7964 120.159 50.6884 120.159 50.6884C120.159 50.6884 118.793 51.6622 116.079 51.2735C113.313 50.9432 111.189 50.8008 110.294 49.6278C109.399 48.4547 109.025 46.9931 109.366 46.1769C109.753 45.3796 112.118 45.01 114.003 45.0254C115.868 45.0862 119.233 43.8557 119.233 43.8557C119.233 43.8557 119.864 43.7468 122.309 44.3962C124.813 45.0966 129.69 45.5371 130.015 45.7794C130.34 46.0218 132.842 46.5351 133.574 47.587C134.378 48.7221 136.21 51.5389 136.897 52.5719C137.539 53.5858 140.64 56.9334 141.709 58.0726C142.823 59.2308 146.034 61.106 146.289 61.4522C146.544 61.7984 146.732 62.6229 146.732 62.6229C146.732 62.6229 148.172 66.3144 148.602 70.3829C149.026 74.5289 150.219 77.9839 150.348 78.7572" stroke="white" stroke-width="1.4" stroke-miterlimit="10"/>
<path d="M138.84 54.7422C138.84 54.7422 139.389 54.8922 140.812 55.8863C142.234 56.8803 146.397 59.7925 147.834 61.0059C149.271 62.2193 153.194 63.5395 153.194 63.5395C153.194 63.5395 155.417 65.2945 155.517 67.0942C155.729 67.7957 158.082 68.22 159.131 70.6824C160.179 73.1449 159.323 74.1722 159.287 77.38C159.259 80.6975 159.398 86.1626 160.131 89.5055C160.897 92.8353 161.856 95.4469 163.295 98.3125C164.715 101.223 168.17 107.995 168.513 108.831" stroke="white" stroke-width="1.4" stroke-miterlimit="10"/>
<path d="M105.343 69.0525C105.343 69.0525 106.224 67.2634 107.703 66.6564C108.254 66.1674 108.16 65.7553 107.977 65.4923C107.794 65.2293 107.713 63.3843 106.004 61.4182C105.262 60.7085 105.008 60.3623 103.548 60.9239C103.033 61.135 102.651 61.6676 102.651 61.6676" stroke="white" stroke-width="1.4" stroke-miterlimit="10"/>
</svg>

After

Width:  |  Height:  |  Size: 5.1 KiB