Compare commits

..
Author SHA1 Message Date
Hanif Koh 0c0bf4cdd9 Keep Per-Nozzle Values When a User Preset Syncs Through the Cloud
The cloud upload sent only the keys that differ from the parent, so a
variant layout equal to the parent's was left out. On download the
loader sized every per-variant value by the missing layout, cut it to
one value and kept the parent's values for the other nozzles and nozzle
volume types. On dual-nozzle printers the right nozzle's settings
silently reverted to the parent's after a sync.

Upload the variant layout always, as the local save already does, and
read copies stored without it against the parent's layout when they
carry one value per parent variant.
2026-10-11 06:32:48 +08:00
132 changed files with 11827 additions and 37448 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+1 -2
View File
@@ -333,8 +333,6 @@ src/slic3r/GUI/OAuthDialog.cpp
src/slic3r/GUI/PluginPickerDialog.cpp
src/slic3r/GUI/PluginsConfigDialog.cpp
src/slic3r/GUI/PluginsDialog.cpp
src/slic3r/GUI/PrinterWebView.cpp
src/slic3r/GUI/Project.cpp
src/slic3r/GUI/PublishSettingsDialog.hpp
src/slic3r/GUI/PurgeModeDialog.cpp
src/slic3r/GUI/TerminalDialog.cpp
@@ -343,6 +341,7 @@ src/slic3r/GUI/TextureLibrary.cpp
src/slic3r/GUI/TextureProjectorFrame.cpp
src/slic3r/GUI/UVEditorCanvas.cpp
src/slic3r/GUI/UserManager.cpp
src/slic3r/GUI/WebDownPluginDlg.cpp
src/slic3r/GUI/WebViewDialog.cpp
src/slic3r/GUI/Widgets/AMSItem.cpp
src/slic3r/GUI/Widgets/DialogButtons.cpp
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+1 -41
View File
@@ -1,6 +1,6 @@
{
"name": "Anker",
"version": "02.04.00.06",
"version": "02.04.00.05",
"force_update": "0",
"description": "Anker configurations",
"machine_model_list": [
@@ -304,26 +304,6 @@
"name": "Generic PLA Silk @Anker 0.25 nozzle",
"sub_path": "filament/Generic PLA Silk @Anker 0.25 nozzle.json"
},
{
"name": "AnkerMake PLA+ Basic @Anker base",
"sub_path": "filament/AnkerMake PLA+ Basic @Anker base.json"
},
{
"name": "AnkerMake PLA+ Glitter @Anker base",
"sub_path": "filament/AnkerMake PLA+ Glitter @Anker base.json"
},
{
"name": "AnkerMake PLA+ Matte @Anker base",
"sub_path": "filament/AnkerMake PLA+ Matte @Anker base.json"
},
{
"name": "AnkerMake PLA+ Metallic @Anker base",
"sub_path": "filament/AnkerMake PLA+ Metallic @Anker base.json"
},
{
"name": "AnkerMake PLA+ Silk @Anker base",
"sub_path": "filament/AnkerMake PLA+ Silk @Anker base.json"
},
{
"name": "Generic PLA+ @Anker",
"sub_path": "filament/Generic PLA+ @Anker.json"
@@ -347,26 +327,6 @@
{
"name": "Generic TPU @Anker",
"sub_path": "filament/Generic TPU @Anker.json"
},
{
"name": "AnkerMake PLA+ Basic @Anker",
"sub_path": "filament/AnkerMake PLA+ Basic @Anker.json"
},
{
"name": "AnkerMake PLA+ Glitter @Anker",
"sub_path": "filament/AnkerMake PLA+ Glitter @Anker.json"
},
{
"name": "AnkerMake PLA+ Matte @Anker",
"sub_path": "filament/AnkerMake PLA+ Matte @Anker.json"
},
{
"name": "AnkerMake PLA+ Metallic @Anker",
"sub_path": "filament/AnkerMake PLA+ Metallic @Anker.json"
},
{
"name": "AnkerMake PLA+ Silk @Anker",
"sub_path": "filament/AnkerMake PLA+ Silk @Anker.json"
}
],
"machine_list": [
@@ -1,50 +0,0 @@
{
"type": "filament",
"name": "AnkerMake PLA+ Basic @Anker base",
"inherits": "Generic PLA+ @Anker base",
"from": "system",
"filament_id": "OFUuZlQL",
"instantiation": "false",
"filament_vendor": [
"AnkerMake"
],
"nozzle_temperature": [
"200"
],
"nozzle_temperature_initial_layer": [
"230"
],
"hot_plate_temp": [
"65"
],
"textured_plate_temp": [
"65"
],
"hot_plate_temp_initial_layer": [
"65"
],
"textured_plate_temp_initial_layer": [
"65"
],
"filament_flow_ratio": [
"1"
],
"close_fan_the_first_x_layers": [
"3"
],
"fan_cooling_layer_time": [
"60"
],
"slow_down_layer_time": [
"8"
],
"slow_down_min_speed": [
"30"
],
"default_filament_colour": [
"#FFFFFF"
],
"filament_max_volumetric_speed": [
"22"
]
}
@@ -1,16 +0,0 @@
{
"type": "filament",
"name": "AnkerMake PLA+ Basic @Anker",
"inherits": "AnkerMake PLA+ Basic @Anker base",
"from": "system",
"setting_id": "EfM5rmn4w6pMBajC",
"instantiation": "true",
"compatible_printers": [
"Anker M5 0.4 nozzle",
"Anker M5 0.6 nozzle",
"Anker M5 All-Metal 0.4 nozzle",
"Anker M5 All-Metal 0.6 nozzle",
"Anker M5C 0.4 nozzle",
"Anker M5C 0.6 nozzle"
]
}
@@ -1,50 +0,0 @@
{
"type": "filament",
"name": "AnkerMake PLA+ Glitter @Anker base",
"inherits": "Generic PLA+ @Anker base",
"from": "system",
"filament_id": "OFxCURdg",
"instantiation": "false",
"filament_vendor": [
"AnkerMake"
],
"nozzle_temperature": [
"200"
],
"nozzle_temperature_initial_layer": [
"230"
],
"hot_plate_temp": [
"65"
],
"textured_plate_temp": [
"65"
],
"hot_plate_temp_initial_layer": [
"65"
],
"textured_plate_temp_initial_layer": [
"65"
],
"filament_flow_ratio": [
"1"
],
"close_fan_the_first_x_layers": [
"3"
],
"fan_cooling_layer_time": [
"60"
],
"slow_down_layer_time": [
"6"
],
"slow_down_min_speed": [
"30"
],
"default_filament_colour": [
"#00AD66"
],
"filament_max_volumetric_speed": [
"22"
]
}
@@ -1,16 +0,0 @@
{
"type": "filament",
"name": "AnkerMake PLA+ Glitter @Anker",
"inherits": "AnkerMake PLA+ Glitter @Anker base",
"from": "system",
"setting_id": "blGHp0htgHEj7khE",
"instantiation": "true",
"compatible_printers": [
"Anker M5 0.4 nozzle",
"Anker M5 0.6 nozzle",
"Anker M5 All-Metal 0.4 nozzle",
"Anker M5 All-Metal 0.6 nozzle",
"Anker M5C 0.4 nozzle",
"Anker M5C 0.6 nozzle"
]
}
@@ -1,50 +0,0 @@
{
"type": "filament",
"name": "AnkerMake PLA+ Matte @Anker base",
"inherits": "Generic PLA+ @Anker base",
"from": "system",
"filament_id": "OFKDOyNK",
"instantiation": "false",
"filament_vendor": [
"AnkerMake"
],
"nozzle_temperature": [
"210"
],
"nozzle_temperature_initial_layer": [
"230"
],
"hot_plate_temp": [
"65"
],
"textured_plate_temp": [
"65"
],
"hot_plate_temp_initial_layer": [
"65"
],
"textured_plate_temp_initial_layer": [
"65"
],
"filament_flow_ratio": [
"1"
],
"close_fan_the_first_x_layers": [
"3"
],
"fan_cooling_layer_time": [
"60"
],
"slow_down_layer_time": [
"6"
],
"slow_down_min_speed": [
"30"
],
"default_filament_colour": [
"#FFFFFF"
],
"filament_max_volumetric_speed": [
"22"
]
}
@@ -1,13 +0,0 @@
{
"type": "filament",
"name": "AnkerMake PLA+ Matte @Anker",
"inherits": "AnkerMake PLA+ Matte @Anker base",
"from": "system",
"setting_id": "tPgwC1eEXyWPOn9S",
"instantiation": "true",
"compatible_printers": [
"Anker M5 0.4 nozzle",
"Anker M5 All-Metal 0.4 nozzle",
"Anker M5C 0.4 nozzle"
]
}
@@ -1,56 +0,0 @@
{
"type": "filament",
"name": "AnkerMake PLA+ Metallic @Anker base",
"inherits": "Generic PLA+ @Anker base",
"from": "system",
"filament_id": "OFBfbmtb",
"instantiation": "false",
"filament_vendor": [
"AnkerMake"
],
"nozzle_temperature": [
"200"
],
"textured_plate_temp": [
"60"
],
"textured_plate_temp_initial_layer": [
"60"
],
"filament_flow_ratio": [
"1"
],
"close_fan_the_first_x_layers": [
"3"
],
"fan_cooling_layer_time": [
"60"
],
"slow_down_layer_time": [
"6"
],
"slow_down_min_speed": [
"30"
],
"overhang_fan_speed": [
"50"
],
"reduce_fan_stop_start_freq": [
"0"
],
"filament_retraction_length": [
"1"
],
"filament_retraction_speed": [
"50"
],
"filament_deretraction_speed": [
"50"
],
"default_filament_colour": [
"#ACAC8A"
],
"filament_max_volumetric_speed": [
"20"
]
}
@@ -1,13 +0,0 @@
{
"type": "filament",
"name": "AnkerMake PLA+ Metallic @Anker",
"inherits": "AnkerMake PLA+ Metallic @Anker base",
"from": "system",
"setting_id": "jlbAMNNaEacdUASZ",
"instantiation": "true",
"compatible_printers": [
"Anker M5 0.4 nozzle",
"Anker M5 All-Metal 0.4 nozzle",
"Anker M5C 0.4 nozzle"
]
}
@@ -1,62 +0,0 @@
{
"type": "filament",
"name": "AnkerMake PLA+ Silk @Anker base",
"inherits": "Generic PLA+ @Anker base",
"from": "system",
"filament_id": "OFkxTGQc",
"instantiation": "false",
"filament_vendor": [
"AnkerMake"
],
"nozzle_temperature": [
"210"
],
"nozzle_temperature_initial_layer": [
"230"
],
"hot_plate_temp": [
"65"
],
"textured_plate_temp": [
"65"
],
"hot_plate_temp_initial_layer": [
"65"
],
"textured_plate_temp_initial_layer": [
"65"
],
"filament_flow_ratio": [
"1"
],
"close_fan_the_first_x_layers": [
"3"
],
"fan_cooling_layer_time": [
"60"
],
"slow_down_layer_time": [
"2"
],
"slow_down_min_speed": [
"20"
],
"filament_retraction_length": [
"0.5"
],
"filament_retraction_speed": [
"20"
],
"filament_wipe": [
"0"
],
"default_filament_colour": [
"#99ADA3"
],
"filament_deretraction_speed": [
"20"
],
"filament_max_volumetric_speed": [
"13"
]
}
@@ -1,15 +0,0 @@
{
"type": "filament",
"name": "AnkerMake PLA+ Silk @Anker",
"inherits": "AnkerMake PLA+ Silk @Anker base",
"from": "system",
"setting_id": "eVM9Ckwjl5vEvEKN",
"instantiation": "true",
"compatible_printers": [
"Anker M5 0.4 nozzle",
"Anker M5 All-Metal 0.4 nozzle",
"Anker M5 All-Metal 0.6 nozzle",
"Anker M5C 0.4 nozzle",
"Anker M5C 0.6 nozzle"
]
}
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "Anycubic",
"version": "02.04.00.09",
"version": "02.04.00.08",
"force_update": "0",
"description": "Anycubic configurations",
"machine_model_list": [
@@ -110,7 +110,7 @@
"default_filament_profile": [
"Generic PLA @Anycubic"
],
"machine_start_gcode": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG0 Z0.2 F1800 ; move nozzle to print position\nG92 E0 ; specify current extruder position as zero\nM109 S[nozzle_temperature_initial_layer] ; wait for nozzle temp to stabilize\nG1 Y10 X180 E50 F1200 ; extrude a line in front of the printer\nG92 E0 ; specify current extruder position as zero\nG0 Z20 F6000 ; move head up\nG1 E-7 F2400 ; retract\nG04 S2 ; wait 2s\nG0 X0 F6000 ; wipe from oozed filament\nG1 E-1 F2400 ; undo some of the retraction to avoid oozing\nG1 F6000 ; set travel speed to move to start printing point\nM117",
"machine_start_gcode": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG0 Z0.2 F1800 ; move nozzle to print position\nG92 E0 ; specify current extruder position as zero\nG1 Y10 X180 E50 F1200 ; extrude a line in front of the printer\nG92 E0 ; specify current extruder position as zero\nG0 Z20 F6000 ; move head up\nG1 E-7 F2400 ; retract\nG04 S2 ; wait 2s\nG0 X0 F6000 ; wipe from oozed filament\nG1 E-1 F2400 ; undo some of the retraction to avoid oozing\nG1 F6000 ; set travel speed to move to start printing point\nM117",
"machine_end_gcode": "G4 ; wait\nG92 E0\nG1{if max_layer_z < printable_height} Z{z_offset+min(max_layer_z+30, printable_height)}{endif} ; move print head up\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors",
"before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]",
"layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]",
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "Bambulab",
"url": "http://www.bambulab.com/Parameters/vendor/BBL.json",
"version": "02.08.00.14",
"version": "02.08.00.13",
"force_update": "0",
"description": "the initial version of BBL configurations",
"machine_model_list": [
@@ -8,7 +8,6 @@
"0.4"
],
"printer_variant": "0.4",
"use_3mf": "1",
"bed_exclude_area": [
"0x0",
"28x0",
@@ -9,7 +9,6 @@
"0.4"
],
"printer_variant": "0.4",
"use_3mf": "1",
"best_object_pos": "0.3x0.5",
"bed_exclude_area": [],
"bed_temperature_formula": "by_highest_temp",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "Prusa",
"version": "02.04.00.17",
"version": "02.04.00.16",
"force_update": "0",
"description": "Prusa configurations",
"machine_model_list": [
@@ -45,7 +45,7 @@
"35"
],
"filament_start_gcode": [
"M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.04{elsif nozzle_diameter[filament_extruder_id]==0.25}0.1{elsif nozzle_diameter[filament_extruder_id]==0.3}0.06{elsif nozzle_diameter[filament_extruder_id]==0.35}0.05{elsif nozzle_diameter[filament_extruder_id]==0.5}0.03{elsif nozzle_diameter[filament_extruder_id]==0.6}0.02{elsif nozzle_diameter[filament_extruder_id]==0.8}0.01{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|COREONE).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.02{elsif nozzle_diameter[filament_extruder_id]==0.5}0.018{elsif nozzle_diameter[filament_extruder_id]==0.6}0.012{elsif nozzle_diameter[filament_extruder_id]==0.8}0.01{elsif nozzle_diameter[filament_extruder_id]==0.25}0.09{elsif nozzle_diameter[filament_extruder_id]==0.3}0.065{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S40 ; set heatbreak target temp"
"M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.04{elsif nozzle_diameter[filament_extruder_id]==0.25}0.1{elsif nozzle_diameter[filament_extruder_id]==0.3}0.06{elsif nozzle_diameter[filament_extruder_id]==0.35}0.05{elsif nozzle_diameter[filament_extruder_id]==0.5}0.03{elsif nozzle_diameter[filament_extruder_id]==0.6}0.02{elsif nozzle_diameter[filament_extruder_id]==0.8}0.01{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|CORE One).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.02{elsif nozzle_diameter[filament_extruder_id]==0.5}0.018{elsif nozzle_diameter[filament_extruder_id]==0.6}0.012{elsif nozzle_diameter[filament_extruder_id]==0.8}0.01{elsif nozzle_diameter[filament_extruder_id]==0.25}0.09{elsif nozzle_diameter[filament_extruder_id]==0.3}0.065{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S40 ; set heatbreak target temp"
],
"hot_plate_temp": [
"110"
@@ -78,7 +78,7 @@
"35"
],
"filament_start_gcode": [
"M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.04{elsif nozzle_diameter[filament_extruder_id]==0.25}0.1{elsif nozzle_diameter[filament_extruder_id]==0.3}0.06{elsif nozzle_diameter[filament_extruder_id]==0.35}0.05{elsif nozzle_diameter[filament_extruder_id]==0.5}0.03{elsif nozzle_diameter[filament_extruder_id]==0.6}0.02{elsif nozzle_diameter[filament_extruder_id]==0.8}0.01{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|COREONE).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.02{elsif nozzle_diameter[filament_extruder_id]==0.5}0.018{elsif nozzle_diameter[filament_extruder_id]==0.6}0.012{elsif nozzle_diameter[filament_extruder_id]==0.8}0.01{elsif nozzle_diameter[filament_extruder_id]==0.25}0.09{elsif nozzle_diameter[filament_extruder_id]==0.3}0.065{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S40 ; set heatbreak target temp"
"M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.04{elsif nozzle_diameter[filament_extruder_id]==0.25}0.1{elsif nozzle_diameter[filament_extruder_id]==0.3}0.06{elsif nozzle_diameter[filament_extruder_id]==0.35}0.05{elsif nozzle_diameter[filament_extruder_id]==0.5}0.03{elsif nozzle_diameter[filament_extruder_id]==0.6}0.02{elsif nozzle_diameter[filament_extruder_id]==0.8}0.01{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|CORE One).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.02{elsif nozzle_diameter[filament_extruder_id]==0.5}0.018{elsif nozzle_diameter[filament_extruder_id]==0.6}0.012{elsif nozzle_diameter[filament_extruder_id]==0.8}0.01{elsif nozzle_diameter[filament_extruder_id]==0.25}0.09{elsif nozzle_diameter[filament_extruder_id]==0.3}0.065{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S40 ; set heatbreak target temp"
],
"hot_plate_temp": [
"110"
@@ -50,7 +50,7 @@
"0.8"
],
"filament_start_gcode": [
"M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.07{elsif nozzle_diameter[filament_extruder_id]==0.25}0.12{elsif nozzle_diameter[filament_extruder_id]==0.3}0.09{elsif nozzle_diameter[filament_extruder_id]==0.35}0.08{elsif nozzle_diameter[filament_extruder_id]==0.6}0.04{elsif nozzle_diameter[filament_extruder_id]==0.5}0.05{elsif nozzle_diameter[filament_extruder_id]==0.8}0.02{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|COREONE).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.053{elsif nozzle_diameter[filament_extruder_id]==0.5}0.042{elsif nozzle_diameter[filament_extruder_id]==0.6}0.032{elsif nozzle_diameter[filament_extruder_id]==0.8}0.018{elsif nozzle_diameter[filament_extruder_id]==0.25}0.18{elsif nozzle_diameter[filament_extruder_id]==0.3}0.1{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S36 ; set heatbreak target temp"
"M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.07{elsif nozzle_diameter[filament_extruder_id]==0.25}0.12{elsif nozzle_diameter[filament_extruder_id]==0.3}0.09{elsif nozzle_diameter[filament_extruder_id]==0.35}0.08{elsif nozzle_diameter[filament_extruder_id]==0.6}0.04{elsif nozzle_diameter[filament_extruder_id]==0.5}0.05{elsif nozzle_diameter[filament_extruder_id]==0.8}0.02{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|CORE One).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.053{elsif nozzle_diameter[filament_extruder_id]==0.5}0.042{elsif nozzle_diameter[filament_extruder_id]==0.6}0.032{elsif nozzle_diameter[filament_extruder_id]==0.8}0.018{elsif nozzle_diameter[filament_extruder_id]==0.25}0.18{elsif nozzle_diameter[filament_extruder_id]==0.3}0.1{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S36 ; set heatbreak target temp"
],
"filament_wipe": [
"1"
@@ -38,7 +38,7 @@
"15"
],
"filament_start_gcode": [
"M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.05{elsif nozzle_diameter[filament_extruder_id]==0.25}0.14{elsif nozzle_diameter[filament_extruder_id]==0.3}0.07{elsif nozzle_diameter[filament_extruder_id]==0.35}0.06{elsif nozzle_diameter[filament_extruder_id]==0.6}0.03{elsif nozzle_diameter[filament_extruder_id]==0.5}0.035{elsif nozzle_diameter[filament_extruder_id]==0.8}0.015{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|COREONE).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.036{elsif nozzle_diameter[filament_extruder_id]==0.5}0.025{elsif nozzle_diameter[filament_extruder_id]==0.6}0.022{elsif nozzle_diameter[filament_extruder_id]==0.8}0.014{elsif nozzle_diameter[filament_extruder_id]==0.25}0.12{elsif nozzle_diameter[filament_extruder_id]==0.3}0.08{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S36 ; set heatbreak target temp"
"M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.05{elsif nozzle_diameter[filament_extruder_id]==0.25}0.14{elsif nozzle_diameter[filament_extruder_id]==0.3}0.07{elsif nozzle_diameter[filament_extruder_id]==0.35}0.06{elsif nozzle_diameter[filament_extruder_id]==0.6}0.03{elsif nozzle_diameter[filament_extruder_id]==0.5}0.035{elsif nozzle_diameter[filament_extruder_id]==0.8}0.015{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|CORE One|CORE One L).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.036{elsif nozzle_diameter[filament_extruder_id]==0.5}0.025{elsif nozzle_diameter[filament_extruder_id]==0.6}0.022{elsif nozzle_diameter[filament_extruder_id]==0.8}0.014{elsif nozzle_diameter[filament_extruder_id]==0.25}0.12{elsif nozzle_diameter[filament_extruder_id]==0.3}0.08{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S36 ; set heatbreak target temp"
],
"filament_z_hop": [
"0.6"
@@ -58,7 +58,7 @@
"7"
],
"filament_start_gcode": [
"M900 K{if nozzle_diameter[0]==0.4}0.05{elsif nozzle_diameter[0]==0.25}0.14{elsif nozzle_diameter[0]==0.3}0.07{elsif nozzle_diameter[0]==0.35}0.06{elsif nozzle_diameter[0]==0.6}0.03{elsif nozzle_diameter[0]==0.5}0.035{elsif nozzle_diameter[0]==0.8}0.015{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|COREONE).*/}\nM572 S{if nozzle_diameter[0]==0.4}0.03{elsif nozzle_diameter[0]==0.5}0.022{elsif nozzle_diameter[0]==0.6}0.018{elsif nozzle_diameter[0]==0.8}0.012{elsif nozzle_diameter[0]==0.25}0.12{elsif nozzle_diameter[0]==0.3}0.075{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S36 ; set heatbreak target temp"
"M900 K{if nozzle_diameter[0]==0.4}0.05{elsif nozzle_diameter[0]==0.25}0.14{elsif nozzle_diameter[0]==0.3}0.07{elsif nozzle_diameter[0]==0.35}0.06{elsif nozzle_diameter[0]==0.6}0.03{elsif nozzle_diameter[0]==0.5}0.035{elsif nozzle_diameter[0]==0.8}0.015{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|CORE One).*/}\nM572 S{if nozzle_diameter[0]==0.4}0.03{elsif nozzle_diameter[0]==0.5}0.022{elsif nozzle_diameter[0]==0.6}0.018{elsif nozzle_diameter[0]==0.8}0.012{elsif nozzle_diameter[0]==0.25}0.12{elsif nozzle_diameter[0]==0.3}0.075{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S36 ; set heatbreak target temp"
],
"filament_z_hop": [
"0.6",
@@ -63,7 +63,7 @@
"0"
],
"filament_start_gcode": [
"M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.04{elsif nozzle_diameter[filament_extruder_id]==0.25}0.1{elsif nozzle_diameter[filament_extruder_id]==0.3}0.06{elsif nozzle_diameter[filament_extruder_id]==0.35}0.05{elsif nozzle_diameter[filament_extruder_id]==0.5}0.03{elsif nozzle_diameter[filament_extruder_id]==0.6}0.02{elsif nozzle_diameter[filament_extruder_id]==0.8}0.01{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|COREONE).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.02{elsif nozzle_diameter[filament_extruder_id]==0.5}0.018{elsif nozzle_diameter[filament_extruder_id]==0.6}0.012{elsif nozzle_diameter[filament_extruder_id]==0.8}0.01{elsif nozzle_diameter[filament_extruder_id]==0.25}0.09{elsif nozzle_diameter[filament_extruder_id]==0.3}0.065{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S40 ; set heatbreak target temp"
"M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.04{elsif nozzle_diameter[filament_extruder_id]==0.25}0.1{elsif nozzle_diameter[filament_extruder_id]==0.3}0.06{elsif nozzle_diameter[filament_extruder_id]==0.35}0.05{elsif nozzle_diameter[filament_extruder_id]==0.5}0.03{elsif nozzle_diameter[filament_extruder_id]==0.6}0.02{elsif nozzle_diameter[filament_extruder_id]==0.8}0.01{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|CORE One).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.02{elsif nozzle_diameter[filament_extruder_id]==0.5}0.018{elsif nozzle_diameter[filament_extruder_id]==0.6}0.012{elsif nozzle_diameter[filament_extruder_id]==0.8}0.01{elsif nozzle_diameter[filament_extruder_id]==0.25}0.09{elsif nozzle_diameter[filament_extruder_id]==0.3}0.065{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S40 ; set heatbreak target temp"
],
"filament_type": [
"ASA"
@@ -65,7 +65,7 @@
"0"
],
"filament_start_gcode": [
"M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.07{elsif nozzle_diameter[filament_extruder_id]==0.3}0.09{elsif nozzle_diameter[filament_extruder_id]==0.35}0.08{elsif nozzle_diameter[filament_extruder_id]==0.6}0.04{elsif nozzle_diameter[filament_extruder_id]==0.5}0.05{elsif nozzle_diameter[filament_extruder_id]==0.8}0.02{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|COREONE).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.05{elsif nozzle_diameter[filament_extruder_id]==0.5}0.035{elsif nozzle_diameter[filament_extruder_id]==0.6}0.025{elsif nozzle_diameter[filament_extruder_id]==0.8}0.016{elsif nozzle_diameter[filament_extruder_id]==0.25}0.14{elsif nozzle_diameter[filament_extruder_id]==0.3}0.09{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S45 ; set heatbreak target temp"
"M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.07{elsif nozzle_diameter[filament_extruder_id]==0.3}0.09{elsif nozzle_diameter[filament_extruder_id]==0.35}0.08{elsif nozzle_diameter[filament_extruder_id]==0.6}0.04{elsif nozzle_diameter[filament_extruder_id]==0.5}0.05{elsif nozzle_diameter[filament_extruder_id]==0.8}0.02{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|CORE One).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.05{elsif nozzle_diameter[filament_extruder_id]==0.5}0.035{elsif nozzle_diameter[filament_extruder_id]==0.6}0.025{elsif nozzle_diameter[filament_extruder_id]==0.8}0.016{elsif nozzle_diameter[filament_extruder_id]==0.25}0.14{elsif nozzle_diameter[filament_extruder_id]==0.3}0.09{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S45 ; set heatbreak target temp"
],
"filament_type": [
"PA11-CF"
@@ -63,7 +63,7 @@
"0"
],
"filament_start_gcode": [
"M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.07{elsif nozzle_diameter[filament_extruder_id]==0.3}0.09{elsif nozzle_diameter[filament_extruder_id]==0.35}0.08{elsif nozzle_diameter[filament_extruder_id]==0.6}0.04{elsif nozzle_diameter[filament_extruder_id]==0.5}0.05{elsif nozzle_diameter[filament_extruder_id]==0.8}0.02{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|COREONE).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.05{elsif nozzle_diameter[filament_extruder_id]==0.5}0.035{elsif nozzle_diameter[filament_extruder_id]==0.6}0.025{elsif nozzle_diameter[filament_extruder_id]==0.8}0.016{elsif nozzle_diameter[filament_extruder_id]==0.25}0.14{elsif nozzle_diameter[filament_extruder_id]==0.3}0.09{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S45 ; set heatbreak target temp"
"M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.07{elsif nozzle_diameter[filament_extruder_id]==0.3}0.09{elsif nozzle_diameter[filament_extruder_id]==0.35}0.08{elsif nozzle_diameter[filament_extruder_id]==0.6}0.04{elsif nozzle_diameter[filament_extruder_id]==0.5}0.05{elsif nozzle_diameter[filament_extruder_id]==0.8}0.02{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|CORE One).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.05{elsif nozzle_diameter[filament_extruder_id]==0.5}0.035{elsif nozzle_diameter[filament_extruder_id]==0.6}0.025{elsif nozzle_diameter[filament_extruder_id]==0.8}0.016{elsif nozzle_diameter[filament_extruder_id]==0.25}0.14{elsif nozzle_diameter[filament_extruder_id]==0.3}0.09{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S45 ; set heatbreak target temp"
],
"filament_type": [
"PC"
@@ -65,7 +65,7 @@
"0"
],
"filament_start_gcode": [
"M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.07{elsif nozzle_diameter[filament_extruder_id]==0.3}0.09{elsif nozzle_diameter[filament_extruder_id]==0.35}0.08{elsif nozzle_diameter[filament_extruder_id]==0.6}0.04{elsif nozzle_diameter[filament_extruder_id]==0.5}0.05{elsif nozzle_diameter[filament_extruder_id]==0.8}0.02{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|COREONE).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.05{elsif nozzle_diameter[filament_extruder_id]==0.5}0.035{elsif nozzle_diameter[filament_extruder_id]==0.6}0.025{elsif nozzle_diameter[filament_extruder_id]==0.8}0.016{elsif nozzle_diameter[filament_extruder_id]==0.25}0.14{elsif nozzle_diameter[filament_extruder_id]==0.3}0.09{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S45 ; set heatbreak target temp"
"M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.07{elsif nozzle_diameter[filament_extruder_id]==0.3}0.09{elsif nozzle_diameter[filament_extruder_id]==0.35}0.08{elsif nozzle_diameter[filament_extruder_id]==0.6}0.04{elsif nozzle_diameter[filament_extruder_id]==0.5}0.05{elsif nozzle_diameter[filament_extruder_id]==0.8}0.02{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|CORE One).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.05{elsif nozzle_diameter[filament_extruder_id]==0.5}0.035{elsif nozzle_diameter[filament_extruder_id]==0.6}0.025{elsif nozzle_diameter[filament_extruder_id]==0.8}0.016{elsif nozzle_diameter[filament_extruder_id]==0.25}0.14{elsif nozzle_diameter[filament_extruder_id]==0.3}0.09{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S45 ; set heatbreak target temp"
],
"filament_type": [
"PC-CF"
@@ -69,7 +69,7 @@
"0"
],
"filament_start_gcode": [
"M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.07{elsif nozzle_diameter[filament_extruder_id]==0.25}0.12{elsif nozzle_diameter[filament_extruder_id]==0.3}0.09{elsif nozzle_diameter[filament_extruder_id]==0.35}0.08{elsif nozzle_diameter[filament_extruder_id]==0.6}0.04{elsif nozzle_diameter[filament_extruder_id]==0.5}0.05{elsif nozzle_diameter[filament_extruder_id]==0.8}0.02{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|COREONE).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.053{elsif nozzle_diameter[filament_extruder_id]==0.5}0.042{elsif nozzle_diameter[filament_extruder_id]==0.6}0.032{elsif nozzle_diameter[filament_extruder_id]==0.8}0.018{elsif nozzle_diameter[filament_extruder_id]==0.25}0.18{elsif nozzle_diameter[filament_extruder_id]==0.3}0.1{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S36 ; set heatbreak target temp"
"M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.07{elsif nozzle_diameter[filament_extruder_id]==0.25}0.12{elsif nozzle_diameter[filament_extruder_id]==0.3}0.09{elsif nozzle_diameter[filament_extruder_id]==0.35}0.08{elsif nozzle_diameter[filament_extruder_id]==0.6}0.04{elsif nozzle_diameter[filament_extruder_id]==0.5}0.05{elsif nozzle_diameter[filament_extruder_id]==0.8}0.02{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|CORE One).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.053{elsif nozzle_diameter[filament_extruder_id]==0.5}0.042{elsif nozzle_diameter[filament_extruder_id]==0.6}0.032{elsif nozzle_diameter[filament_extruder_id]==0.8}0.018{elsif nozzle_diameter[filament_extruder_id]==0.25}0.18{elsif nozzle_diameter[filament_extruder_id]==0.3}0.1{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S36 ; set heatbreak target temp"
],
"filament_type": [
"PETG"
@@ -64,7 +64,7 @@
"0"
],
"filament_start_gcode": [
"M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.05{elsif nozzle_diameter[filament_extruder_id]==0.25}0.14{elsif nozzle_diameter[filament_extruder_id]==0.3}0.07{elsif nozzle_diameter[filament_extruder_id]==0.35}0.06{elsif nozzle_diameter[filament_extruder_id]==0.6}0.03{elsif nozzle_diameter[filament_extruder_id]==0.5}0.035{elsif nozzle_diameter[filament_extruder_id]==0.8}0.015{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|COREONE).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.036{elsif nozzle_diameter[filament_extruder_id]==0.5}0.025{elsif nozzle_diameter[filament_extruder_id]==0.6}0.022{elsif nozzle_diameter[filament_extruder_id]==0.8}0.014{elsif nozzle_diameter[filament_extruder_id]==0.25}0.12{elsif nozzle_diameter[filament_extruder_id]==0.3}0.08{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S36 ; set heatbreak target temp"
"M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.05{elsif nozzle_diameter[filament_extruder_id]==0.25}0.14{elsif nozzle_diameter[filament_extruder_id]==0.3}0.07{elsif nozzle_diameter[filament_extruder_id]==0.35}0.06{elsif nozzle_diameter[filament_extruder_id]==0.6}0.03{elsif nozzle_diameter[filament_extruder_id]==0.5}0.035{elsif nozzle_diameter[filament_extruder_id]==0.8}0.015{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|CORE One|CORE One L).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.036{elsif nozzle_diameter[filament_extruder_id]==0.5}0.025{elsif nozzle_diameter[filament_extruder_id]==0.6}0.022{elsif nozzle_diameter[filament_extruder_id]==0.8}0.014{elsif nozzle_diameter[filament_extruder_id]==0.25}0.12{elsif nozzle_diameter[filament_extruder_id]==0.3}0.08{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S36 ; set heatbreak target temp"
],
"filament_type": [
"PLA"
@@ -65,7 +65,7 @@
"1"
],
"filament_start_gcode": [
"M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.05{elsif nozzle_diameter[filament_extruder_id]==0.25}0.14{elsif nozzle_diameter[filament_extruder_id]==0.3}0.07{elsif nozzle_diameter[filament_extruder_id]==0.35}0.06{elsif nozzle_diameter[filament_extruder_id]==0.6}0.03{elsif nozzle_diameter[filament_extruder_id]==0.5}0.035{elsif nozzle_diameter[filament_extruder_id]==0.8}0.015{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|COREONE).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.036{elsif nozzle_diameter[filament_extruder_id]==0.5}0.025{elsif nozzle_diameter[filament_extruder_id]==0.6}0.022{elsif nozzle_diameter[filament_extruder_id]==0.8}0.014{elsif nozzle_diameter[filament_extruder_id]==0.25}0.12{elsif nozzle_diameter[filament_extruder_id]==0.3}0.08{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S36 ; set heatbreak target temp"
"M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.05{elsif nozzle_diameter[filament_extruder_id]==0.25}0.14{elsif nozzle_diameter[filament_extruder_id]==0.3}0.07{elsif nozzle_diameter[filament_extruder_id]==0.35}0.06{elsif nozzle_diameter[filament_extruder_id]==0.6}0.03{elsif nozzle_diameter[filament_extruder_id]==0.5}0.035{elsif nozzle_diameter[filament_extruder_id]==0.8}0.015{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|CORE One).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.036{elsif nozzle_diameter[filament_extruder_id]==0.5}0.025{elsif nozzle_diameter[filament_extruder_id]==0.6}0.022{elsif nozzle_diameter[filament_extruder_id]==0.8}0.014{elsif nozzle_diameter[filament_extruder_id]==0.25}0.12{elsif nozzle_diameter[filament_extruder_id]==0.3}0.08{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S36 ; set heatbreak target temp"
],
"filament_type": [
"PVB"
@@ -64,7 +64,7 @@
"0"
],
"filament_start_gcode": [
"M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.05{elsif nozzle_diameter[filament_extruder_id]==0.25}0.14{elsif nozzle_diameter[filament_extruder_id]==0.3}0.07{elsif nozzle_diameter[filament_extruder_id]==0.35}0.06{elsif nozzle_diameter[filament_extruder_id]==0.6}0.03{elsif nozzle_diameter[filament_extruder_id]==0.5}0.035{elsif nozzle_diameter[filament_extruder_id]==0.8}0.015{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|COREONE).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.036{elsif nozzle_diameter[filament_extruder_id]==0.5}0.025{elsif nozzle_diameter[filament_extruder_id]==0.6}0.022{elsif nozzle_diameter[filament_extruder_id]==0.8}0.014{elsif nozzle_diameter[filament_extruder_id]==0.25}0.12{elsif nozzle_diameter[filament_extruder_id]==0.3}0.08{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S36 ; set heatbreak target temp"
"M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.05{elsif nozzle_diameter[filament_extruder_id]==0.25}0.14{elsif nozzle_diameter[filament_extruder_id]==0.3}0.07{elsif nozzle_diameter[filament_extruder_id]==0.35}0.06{elsif nozzle_diameter[filament_extruder_id]==0.6}0.03{elsif nozzle_diameter[filament_extruder_id]==0.5}0.035{elsif nozzle_diameter[filament_extruder_id]==0.8}0.015{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|CORE One).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.036{elsif nozzle_diameter[filament_extruder_id]==0.5}0.025{elsif nozzle_diameter[filament_extruder_id]==0.6}0.022{elsif nozzle_diameter[filament_extruder_id]==0.8}0.014{elsif nozzle_diameter[filament_extruder_id]==0.25}0.12{elsif nozzle_diameter[filament_extruder_id]==0.3}0.08{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S36 ; set heatbreak target temp"
],
"filament_type": [
"PLA"
File diff suppressed because it is too large Load Diff
@@ -10,7 +10,7 @@
<link rel="stylesheet" type="text/css" href="../css/theme.css" />
<script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="../js/json2.js"></script>
<script type="text/javascript" src="../../include/i18n.js"></script>
<script type="text/javascript" src="../../data/text.js"></script>
<script type="text/javascript" src="../js/globalapi.js"></script>
<script type="text/javascript" src="../js/common.js"></script>
<script src="./index.js"></script>
@@ -23,14 +23,14 @@
<div class="cbr-column-title-container">
<div class="search-icon"></div>
<input type="text" class="cbr-search-bar" placeholder=" " tabindex="1"/>
<span class="cbr-search-placeholder" data-i18n="printer">Printer</span>
<span class="cbr-search-placeholder trans" tid="t15">printer</span>
<div class="clear-icon"></div>
</div>
<div class="cbr-content thin-scroll" id="MachineList">
<div class="CValues">
<label><input type="checkbox" mode="all" onClick="ChooseAllMachine()" /><span data-i18n="all">All</span></label>
<label><input type="checkbox" mode="all" onClick="ChooseAllMachine()" /><span class="trans" tid="t11">all</span></label>
</div>
<div class="cbr-no-items" data-i18n="no_items">No items</div>
<div class="cbr-no-items">No items</div>
</div>
</div>
@@ -38,14 +38,14 @@
<div class="cbr-column-title-container">
<div class="search-icon"></div>
<input type="text" class="cbr-search-bar" placeholder=" " tabindex="2"/>
<span class="cbr-search-placeholder" data-i18n="filament">Filament</span>
<span class="cbr-search-placeholder trans" tid="t16">filament</span>
<div class="clear-icon"></div>
</div>
<div class="cbr-content thin-scroll" id="FilatypeList">
<div class="CValues">
<label><input type="checkbox" onClick="ChooseAllFilament()" /><span data-i18n="all">All</span></label>
<label><input type="checkbox" class="trans" tid="t11" onClick="ChooseAllFilament()" /><span class="trans" tid="t11">all</span></label>
</div>
<div class="cbr-no-items" data-i18n="no_items">No items</div>
<div class="cbr-no-items">No items</div>
</div>
</div>
@@ -53,22 +53,22 @@
<div class="cbr-column-title-container">
<div class="search-icon"></div>
<input type="text" class="cbr-search-bar" placeholder=" " tabindex="3"/>
<span class="cbr-search-placeholder" data-i18n="process">Process</span>
<span class="cbr-search-placeholder trans" tid="t17">presets</span>
<div class="clear-icon"></div>
</div>
<div class="cbr-content thin-scroll" id="PresetList">
<div class="CValues">
<label><input type="checkbox" onClick="ChooseAllPreset()" /><span data-i18n="all">All</span></label>
<label><input type="checkbox" class="trans" tid="t11" onClick="ChooseAllPreset()" /><span class="trans" tid="t11">all</span></label>
</div>
<div class="cbr-no-items" data-i18n="no_items">No items</div>
<div class="cbr-no-items">No items</div>
</div>
</div>
</div>
<div id="AcceptArea">
<div id="export_cloud_btn" class="ButtonStyleConfirm ButtonTypeChoice" data-i18n="export_cloud">Export to OrcaCloud</div>
<div id="export_local_btn" class="ButtonStyleRegular ButtonTypeChoice" data-i18n="export_folder">Export to folder</div>
<div id="close_btn" class="ButtonStyleRegular ButtonTypeChoice" data-i18n="close">Close</div>
<div id="export_cloud_btn" class="ButtonStyleConfirm ButtonTypeChoice">Export to OrcaCloud</div>
<div id="export_local_btn" class="ButtonStyleRegular ButtonTypeChoice">Export to folder</div>
<div id="close_btn" class="ButtonStyleRegular ButtonTypeChoice">Close</div>
</div>
</body>
@@ -12,7 +12,8 @@ var g_search = {
function OnInit()
{
TranslatePage();
if (typeof TranslatePage === "function")
TranslatePage();
InstallInputSafeKeydown();
BindSearchInputs();
@@ -16,31 +16,29 @@
<h1 id="pagePresetName" class="page-title"></h1>
</header>
<div id="configEmpty" class="detail-empty" data-i18n="no_capabilities">This preset does not use any plugin capabilities</div>
<div id="configEmpty" class="detail-empty">This preset does not use any plugin capabilities</div>
<div id="configLayout" class="config-layout" hidden>
<div id="configSidebar" class="config-sidebar thin-scroll" role="listbox"
aria-label="Capabilities used by this preset" data-i18n-aria-label="capabilities_label"></div>
aria-label="Capabilities used by this preset"></div>
<div class="config-view">
<div id="configError" class="config-error" role="status" aria-live="polite" hidden></div>
<div id="configEditor" class="config-editor" hidden>
<textarea id="configText" class="config-textarea thin-scroll" spellcheck="false"
autocomplete="off" autocapitalize="off" aria-label="Capability configuration (JSON)"
data-i18n-aria-label="config_json_label"></textarea>
autocomplete="off" autocapitalize="off" aria-label="Capability configuration (JSON)"></textarea>
</div>
<!-- Custom capability UI. Sandboxed without allow-same-origin, so the plugin's HTML runs in
an opaque origin and reaches the host only through the injected window.orca bridge. -->
<iframe id="configCustom" class="config-custom" title="Plugin configuration" data-i18n-title="config_frame_title"
<iframe id="configCustom" class="config-custom" title="Plugin configuration"
sandbox="allow-scripts" referrerpolicy="no-referrer" hidden></iframe>
<div id="configFooter" class="config-view-footer" hidden>
<span id="configValidation" class="config-validation" role="status" aria-live="polite"></span>
<div class="config-actions">
<button id="configRestoreBtn" class="ButtonStyleRegular ButtonTypeChoice" type="button"
title="Discard this preset's override and use the global configuration again"
data-i18n-title="restore_title" data-i18n="restore_defaults">
title="Discard this preset's override and use the global configuration again">
Restore defaults
</button>
<button id="configSaveBtn" class="ButtonStyleConfirm ButtonTypeChoice" type="button" data-i18n="save">Save</button>
<button id="configSaveBtn" class="ButtonStyleConfirm ButtonTypeChoice" type="button">Save</button>
</div>
</div>
</div>
@@ -50,7 +48,6 @@
<span id="statusText" class="status-text"></span>
</footer>
</main>
<script src="../../include/i18n.js"></script>
<script src="../js/plugin-config-ui.js"></script>
<script src="index.js"></script>
</body>
@@ -304,7 +304,7 @@ function ValidateConfigText() {
SetConfigValidation("");
return true;
} catch (err) {
SetConfigValidation(String(err?.message || T("invalid_json", "Invalid JSON")));
SetConfigValidation(String(err?.message || "Invalid JSON"));
return false;
}
}
@@ -393,8 +393,6 @@ function OnCustomConfigMessage(event) {
}
document.addEventListener("DOMContentLoaded", () => {
TranslatePage();
const sidebar = document.getElementById("configSidebar");
if (sidebar)
sidebar.addEventListener("click", OnConfigSidebarClick);
+42 -49
View File
@@ -12,7 +12,7 @@
<link rel="stylesheet" type="text/css" href="../css/theme.css" />
<script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="../js/json2.js"></script>
<script type="text/javascript" src="../../include/i18n.js"></script>
<script type="text/javascript" src="../../data/text.js"></script>
<script type="text/javascript" src="../js/globalapi.js"></script>
<script type="text/javascript" src="../js/common.js"></script>
<script src="../js/plugin-config-ui.js"></script>
@@ -32,10 +32,8 @@
</svg>
</span>
<input id="plugin_search_input" class="plugin-search-input" type="text"
placeholder="Search plugins" autocomplete="off" spellcheck="false" aria-label="Search plugins"
data-i18n-placeholder="search_plugins" data-i18n-aria-label="search_plugins" />
<button id="plugin_search_clear" class="plugin-search-clear" type="button" title="Clear" aria-label="Clear search"
data-i18n-title="clear" data-i18n-aria-label="clear_search">
placeholder="Search plugins" autocomplete="off" spellcheck="false" aria-label="Search plugins" />
<button id="plugin_search_clear" class="plugin-search-clear" type="button" title="Clear" aria-label="Clear search">
<svg viewBox="0 0 16 16" width="12" height="12" fill="none" stroke="currentColor"
stroke-width="1.6" stroke-linecap="round" aria-hidden="true">
<line x1="5" y1="5" x2="11" y2="11" />
@@ -43,28 +41,27 @@
</svg>
</button>
<button id="plugin_search_cc" class="plugin-search-toggle" type="button"
aria-pressed="false" title="Match case" data-i18n-title="match_case">Aa</button>
aria-pressed="false" title="Match case">Aa</button>
<button id="plugin_search_w" class="plugin-search-toggle" type="button"
aria-pressed="false" title="Match whole word" data-i18n-title="match_whole_word"><span class="plugin-search-underline">ab</span></button>
aria-pressed="false" title="Match whole word"><span class="plugin-search-underline">ab</span></button>
</div>
<!-- <button id="open_terminal" class="ButtonStyleRegular ButtonTypeChoice left-btn">-->
<!-- Open Terminal-->
<!-- </button>-->
<button id="refresh_btn" class="ButtonStyleRegular ButtonTypeChoice" data-i18n="refresh">
<button id="refresh_btn" class="ButtonStyleRegular ButtonTypeChoice">
Refresh
</button>
<div id="exploreDropdown" class="explore-dropdown">
<button id="explore_menu_btn" class="ButtonStyleConfirm ButtonTypeChoice explore-menu-btn" type="button"
aria-haspopup="true" aria-expanded="false" aria-controls="exploreMenu" title="More plugin install options"
data-i18n-title="install_options">
aria-haspopup="true" aria-expanded="false" aria-controls="exploreMenu" title="More plugin install options">
<span class="explore-menu-icon" aria-hidden="true"></span>
</button>
<button id="explore_btn" class="ButtonStyleConfirm ButtonTypeChoice explore-main-btn" type="button">
Install plugin
</button>
<div id="exploreMenu" class="explore-menu" role="menu" hidden>
<button type="button" class="explore-menu-item" role="menuitem" data-install-action="explore" data-i18n="install_plugin">Install plugin</button>
<button type="button" class="explore-menu-item" role="menuitem" data-install-action="install-local" data-i18n="install_local_plugin">Install local plugin</button>
<button type="button" class="explore-menu-item" role="menuitem" data-install-action="explore">Install plugin</button>
<button type="button" class="explore-menu-item" role="menuitem" data-install-action="install-local">Install local plugin</button>
</div>
</div>
</div>
@@ -72,15 +69,15 @@
<main class="content">
<section class="pane plugin-list-pane">
<div class="hdr plugin-cols">
<span data-i18n="activate">Activate</span>
<span>Activate</span>
<span class="sort-th" data-sort-field="name" role="button" tabindex="0"
title="Sort by name" data-i18n-title="sort_by_name" data-i18n="name">Name<span class="sort-tri" aria-hidden="true"></span></span>
title="Sort by name">Name<span class="sort-tri" aria-hidden="true"></span></span>
<span class="sort-th" data-sort-field="version" role="button" tabindex="0"
title="Sort by version" data-i18n-title="sort_by_version" data-i18n="plugin_version">Plugin Version<span class="sort-tri" aria-hidden="true"></span></span>
title="Sort by version">Plugin Version<span class="sort-tri" aria-hidden="true"></span></span>
<span class="sort-th" data-sort-field="source" role="button" tabindex="0"
title="Sort by source" data-i18n-title="sort_by_source" data-i18n="source">Source<span class="sort-tri" aria-hidden="true"></span></span>
title="Sort by source">Source<span class="sort-tri" aria-hidden="true"></span></span>
<span class="sort-th" data-sort-field="status" role="button" tabindex="0"
title="Sort by status" data-i18n-title="sort_by_status" data-i18n="status">Status<span class="sort-tri" aria-hidden="true"></span></span>
title="Sort by status">Status<span class="sort-tri" aria-hidden="true"></span></span>
</div>
<div id="pluginList" class="body thin-scroll"></div>
</section>
@@ -88,21 +85,20 @@
<!-- Drag to redistribute the dialog's height between the list and the details pane; the hit
area is the whole strip, the visible divider is the line drawn inside it. -->
<div id="paneSplitter" class="pane-splitter" role="separator" aria-orientation="horizontal"
aria-label="Resize the plugin list" title="Drag to resize; double-click to reset"
data-i18n-aria-label="resize_list" data-i18n-title="resize_hint"></div>
aria-label="Resize the plugin list" title="Drag to resize; double-click to reset"></div>
<section class="pane details-pane">
<div class="detail-tabs" role="tablist" aria-label="Plugin details" data-i18n-aria-label="details_label">
<div class="detail-tabs" role="tablist" aria-label="Plugin details">
<button id="pluginInfoTab" class="detail-tab active" type="button" role="tab"
aria-selected="true" aria-controls="pluginInfoPanel" data-tab="plugin-info" data-i18n="tab_info">Plugin Info</button>
aria-selected="true" aria-controls="pluginInfoPanel" data-tab="plugin-info">Plugin Info</button>
<button id="descriptionTab" class="detail-tab" type="button" role="tab" tabindex="-1"
aria-selected="false" aria-controls="descriptionPanel" data-tab="description" data-i18n="description">Description</button>
aria-selected="false" aria-controls="descriptionPanel" data-tab="description">Description</button>
<button id="configTab" class="detail-tab" type="button" role="tab" tabindex="-1"
aria-selected="false" aria-controls="configPanel" data-tab="config" data-i18n="tab_config">Config</button>
aria-selected="false" aria-controls="configPanel" data-tab="config">Config</button>
<button id="changelogTab" class="detail-tab" type="button" role="tab" tabindex="-1"
aria-selected="false" aria-controls="changelogPanel" data-tab="changelog" data-i18n="tab_changelog">Changelog</button>
aria-selected="false" aria-controls="changelogPanel" data-tab="changelog">Changelog</button>
<button id="diagnosticsTab" class="detail-tab" type="button" role="tab" tabindex="-1"
aria-selected="false" aria-controls="diagnosticsPanel" data-tab="diagnostics" data-i18n="tab_diagnostics">Diagnostics</button>
aria-selected="false" aria-controls="diagnosticsPanel" data-tab="diagnostics">Diagnostics</button>
</div>
<div class="detail-tab-panels">
@@ -114,32 +110,31 @@
</div>
<div class="detail-fields">
<div class="detail-field-row">
<div class="detail-label" data-i18n="source">Source</div>
<div class="detail-label">Source</div>
<div id="detailSource" class="detail-value">-</div>
</div>
<div class="detail-field-row">
<div class="detail-label" data-i18n="types">Types</div>
<div class="detail-label">Types</div>
<div id="detailTypes" class="detail-value">-</div>
</div>
<div class="detail-field-row">
<div class="detail-label" data-i18n="author">Author</div>
<div class="detail-label">Author</div>
<div id="detailAuthor" class="detail-value">-</div>
</div>
<div class="detail-field-row">
<div class="detail-label" data-i18n="installed_version">Installed Version</div>
<div class="detail-label">Installed Version</div>
<div class="detail-value">
<span id="detailInstalledVersion">-</span>
</div>
</div>
<div class="detail-field-row">
<div class="detail-label" data-i18n="latest_version">Latest Version</div>
<div class="detail-label">Latest Version</div>
<div class="detail-value detail-version-row">
<span id="detailLatestVersion">-</span>
<span id="detailUpdateBadge" class="version-update-badge" hidden
aria-label="Update available" title="Update available"
data-i18n-aria-label="update_available" data-i18n-title="update_available"></span>
aria-label="Update available" title="Update available"></span>
<button id="detailUpdateBtn" type="button" class="plugin-update-btn" hidden
title="Update to the latest version" data-i18n-title="update_title" data-i18n="update">Update</button>
title="Update to the latest version">Update</button>
</div>
</div>
</div>
@@ -148,27 +143,26 @@
<section id="descriptionPanel" class="detail-tab-panel thin-scroll" role="tabpanel" tabindex="0"
aria-labelledby="descriptionTab" data-panel="description" hidden>
<h2 class="detail-section-title" data-i18n="description">Description</h2>
<div id="detailDescription" class="detail-description" data-i18n="no_description">No description available</div>
<h2 class="detail-section-title">Description</h2>
<div id="detailDescription" class="detail-description">No description available</div>
</section>
<section id="configPanel" class="detail-tab-panel" role="tabpanel" tabindex="0"
aria-labelledby="configTab" data-panel="config" hidden>
<div id="configEmpty" class="detail-empty" data-i18n="config_select_plugin">Select a plugin to configure its capabilities</div>
<div id="configEmpty" class="detail-empty">Select a plugin to configure its capabilities</div>
<div id="configLayout" class="config-layout" hidden>
<div id="configSidebar" class="config-sidebar thin-scroll" role="listbox"
aria-label="Configurable capabilities" data-i18n-aria-label="configurable_capabilities"></div>
aria-label="Configurable capabilities"></div>
<div class="config-view">
<div id="configError" class="config-error" role="status" aria-live="polite" hidden></div>
<div id="configEditor" class="config-editor" hidden>
<textarea id="configText" class="config-textarea thin-scroll" spellcheck="false"
autocomplete="off" autocapitalize="off" aria-label="Capability configuration (JSON)"
data-i18n-aria-label="config_json_label"></textarea>
autocomplete="off" autocapitalize="off" aria-label="Capability configuration (JSON)"></textarea>
</div>
<!-- Custom capability UI. Sandboxed without allow-same-origin, so the plugin's HTML
runs in an opaque origin and reaches the host only through the injected
window.orca bridge. -->
<iframe id="configCustom" class="config-custom" title="Plugin configuration" data-i18n-title="config_frame_title"
<iframe id="configCustom" class="config-custom" title="Plugin configuration"
sandbox="allow-scripts" referrerpolicy="no-referrer" hidden></iframe>
<!-- JSON-editor chrome only: a custom UI renders its own save/restore controls and
drives them through the window.orca bridge. -->
@@ -176,11 +170,10 @@
<span id="configValidation" class="config-validation" role="status" aria-live="polite"></span>
<div class="config-actions">
<button id="configRestoreBtn" class="ButtonStyleRegular ButtonTypeChoice" type="button"
title="Discard the settings saved for this capability and restore the plugin's defaults"
data-i18n-title="restore_title" data-i18n="restore_defaults">
title="Discard the settings saved for this capability and restore the plugin's defaults">
Restore defaults
</button>
<button id="configSaveBtn" class="ButtonStyleConfirm ButtonTypeChoice" type="button" data-i18n="save">Save</button>
<button id="configSaveBtn" class="ButtonStyleConfirm ButtonTypeChoice" type="button">Save</button>
</div>
</div>
</div>
@@ -189,22 +182,22 @@
<section id="changelogPanel" class="detail-tab-panel thin-scroll" role="tabpanel" tabindex="0"
aria-labelledby="changelogTab" data-panel="changelog" hidden>
<table id="changelogTable" class="detail-table changelog-table" aria-label="Plugin changelog" data-i18n-aria-label="changelog_label">
<table id="changelogTable" class="detail-table changelog-table" aria-label="Plugin changelog">
<thead>
<tr>
<th scope="col" data-i18n="version">Version</th>
<th scope="col" data-i18n="date">Date</th>
<th scope="col" data-i18n="changes">Changes</th>
<th scope="col">Version</th>
<th scope="col">Date</th>
<th scope="col">Changes</th>
</tr>
</thead>
<tbody id="changelogBody"></tbody>
</table>
<div id="changelogEmpty" class="detail-empty" data-i18n="no_changelog" hidden>No changelog available</div>
<div id="changelogEmpty" class="detail-empty" hidden>No changelog available</div>
</section>
<section id="diagnosticsPanel" class="detail-tab-panel thin-scroll" role="tabpanel" tabindex="0"
aria-labelledby="diagnosticsTab" data-panel="diagnostics" hidden>
<div id="detailStatusBody" class="detail-status-body" data-i18n="no_issues">No issues detected</div>
<div id="detailStatusBody" class="detail-status-body">No issues detected</div>
</section>
</div>
</section>
+49 -67
View File
@@ -1,11 +1,11 @@
const pluginsById = new Map();
const pluginInstallActions = {
"explore": {
label: T("install_plugin", "Install plugin"),
label: "Install plugin",
command: "open_plugin_hub"
},
"install-local": {
label: T("install_local_plugin", "Install local plugin"),
label: "Install local plugin",
command: "install_local_plugin"
}
};
@@ -47,7 +47,8 @@ function OnInit() {
exploreMenu = document.getElementById("exploreMenu");
exploreMenuButton = document.getElementById("explore_menu_btn");
TranslatePage();
if (typeof TranslatePage === "function")
TranslatePage();
document.getElementById("refresh_btn")?.addEventListener("click", () => SendMessage("refresh_plugins"));
document.getElementById("explore_btn")?.addEventListener("click", () => {
@@ -448,7 +449,7 @@ function RenderPlugins() {
if (pluginsById.size === 0) {
const empty = document.createElement("div");
empty.className = "empty-state";
empty.textContent = T("no_plugins", "No plugins found");
empty.textContent = "No plugins found";
pluginList.appendChild(empty);
SyncPluginListHeaderGutter();
return;
@@ -503,9 +504,11 @@ function RenderPlugins() {
if (searching && shown === 0) {
const empty = document.createElement("div");
empty.className = "empty-state";
empty.appendChild(document.createTextNode('No plugins match "'));
const term = document.createElement("b");
term.textContent = pluginSearch.query;
AppendTemplate(empty, T("no_match", 'No plugins match "%s"'), term);
empty.appendChild(term);
empty.appendChild(document.createTextNode('"'));
pluginList.appendChild(empty);
}
@@ -596,13 +599,13 @@ function IsPluginLoading(plugin) {
function SourceLabel(source) {
switch (String(source || "").toLowerCase()) {
case "mine":
return T("source_mine", "Mine");
return "Mine";
case "subscribed":
return T("source_subscribed", "Subscribed");
return "Subscribed";
case "orphaned":
return T("source_orphaned", "Orphaned");
return "Orphaned";
default:
return T("source_local", "Local");
return "Local";
}
}
@@ -638,7 +641,7 @@ function CheckCell(row, plugin) {
checkbox.dataset.pluginKey = row.dataset.pluginKey;
if (checkbox.indeterminate) {
checkbox.setAttribute("aria-checked", "mixed");
checkbox.setAttribute("aria-label", T("mixed_capabilities", "Some plugin capabilities are enabled"));
checkbox.setAttribute("aria-label", "Some plugin capabilities are enabled");
}
const checkboxMark = document.createElement("span");
checkboxMark.className = "plugin-checkbox-mark";
@@ -661,14 +664,9 @@ function LabelCell(plugin, isExpanded = false, capabilityCount = 0, nameRanges =
const expandButton = document.createElement("button");
expandButton.type = "button";
expandButton.className = "plugin-expand-btn";
const labelName = pluginLabelText || "plugin";
expandButton.setAttribute("aria-label", isExpanded
? T("collapse_named", "Collapse %s capabilities", labelName)
: T("expand_named", "Expand %s capabilities", labelName));
expandButton.setAttribute("aria-label", `${isExpanded ? "Collapse" : "Expand"} ${pluginLabelText || "plugin"} capabilities`);
expandButton.setAttribute("aria-expanded", isExpanded ? "true" : "false");
expandButton.title = isExpanded
? T("collapse", "Collapse capabilities")
: T("expand", "Expand capabilities");
expandButton.title = isExpanded ? "Collapse capabilities" : "Expand capabilities";
const icon = document.createElement("span");
icon.className = "plugin-expand-icon";
expandButton.appendChild(icon);
@@ -690,7 +688,7 @@ function LabelCell(plugin, isExpanded = false, capabilityCount = 0, nameRanges =
if (hasCloudLink) {
labelElement.href = "#";
labelElement.classList.add("plugin-cloud-link");
labelElement.title = T("open_in_browser", "Open this plugin in your browser");
labelElement.title = "Open this plugin in your browser";
}
nameWrap.appendChild(labelElement);
@@ -698,7 +696,7 @@ function LabelCell(plugin, isExpanded = false, capabilityCount = 0, nameRanges =
const countBadge = document.createElement("span");
countBadge.className = "plugin-capability-count";
countBadge.textContent = String(capabilityCount);
countBadge.title = T("capability_count", "Capabilities: %s", capabilityCount);
countBadge.title = `${capabilityCount} capabilities`;
nameWrap.appendChild(countBadge);
}
labelCell.appendChild(nameWrap);
@@ -724,7 +722,7 @@ function RenderCapabilityTree(plugin, capabilities, capRanges = null) {
const tree = document.createElement("div");
tree.className = "capabilities-tree";
tree.setAttribute("role", "group");
tree.setAttribute("aria-label", T("capabilities", "Capabilities"));
tree.setAttribute("aria-label", "Capabilities");
capabilities.forEach((capability, index) => {
tree.appendChild(RenderCapabilityRow(plugin, capability, index === capabilities.length - 1, capRanges));
@@ -771,7 +769,7 @@ function RenderCapabilityRow(plugin, capability, isLast, capRanges = null) {
const runButton = document.createElement("button");
runButton.type = "button";
runButton.className = "capability-run-btn script-run-btn";
runButton.title = T("run_named", 'Run "%s"', capabilityName);
runButton.title = `Run "${capabilityName}"`;
runButton.setAttribute("aria-label", runButton.title);
const runIcon = document.createElement("span");
runIcon.className = "icon16 plugin-run-icon";
@@ -806,7 +804,7 @@ function CapabilityCheckCell(plugin, capability) {
checkbox.dataset.capabilityToggle = "true";
checkbox.dataset.capabilityName = capabilityName;
checkbox.dataset.capabilityType = capabilityType;
checkbox.setAttribute("aria-label", T("enable_named", "Enable %s", capabilityName));
checkbox.setAttribute("aria-label", `Enable ${capabilityName || "capability"}`);
const checkboxMark = document.createElement("span");
checkboxMark.className = "plugin-checkbox-mark";
checkboxLabel.appendChild(checkbox);
@@ -828,7 +826,7 @@ function VersionCell(plugin) {
const versionLabel = document.createElement("span");
versionLabel.className = "version-value";
versionLabel.textContent = GetDisplayVersion(plugin) || T("not_available", "N/A");
versionLabel.textContent = GetDisplayVersion(plugin) || "N/A";
cell.appendChild(versionLabel);
const updateBadge = UpdateStatusBadge(plugin);
@@ -847,11 +845,11 @@ function UpdateStatusBadge(plugin) {
badge.className = "version-update-badge";
if (updateStatus === "unauthorized") {
badge.classList.add("is-warning");
badge.title = T("unauthorized", "Unauthorized for updates");
badge.setAttribute("aria-label", badge.title);
badge.title = "Unauthorized for updates";
badge.setAttribute("aria-label", "Unauthorized for updates");
} else {
badge.title = T("update_available", "Update available");
badge.setAttribute("aria-label", badge.title);
badge.title = "Update available";
badge.setAttribute("aria-label", "Update available");
}
return badge;
@@ -864,7 +862,7 @@ function StatusCell(plugin) {
const statusLabel = document.createElement("span");
statusLabel.className = "status-label";
statusLabel.textContent = StatusLabel(plugin);
statusLabel.textContent = GetStatus(plugin);
cell.appendChild(statusLabel);
return cell;
@@ -877,7 +875,7 @@ function RenderDetails() {
const detailStatusBody = document.getElementById("detailStatusBody");
SetText("detailInstalledVersion",
plugin ? (IsPluginInstalled(plugin) ? (GetInstalledVersion(plugin) || "-") : T("not_installed", "Not installed")) : "-");
plugin ? (IsPluginInstalled(plugin) ? (GetInstalledVersion(plugin) || "-") : "Not installed") : "-");
SetText("detailLatestVersion", plugin ? (GetLatestVersion(plugin) || "-") : "-");
const detailSource = document.getElementById("detailSource");
if (detailSource) {
@@ -935,12 +933,12 @@ function RenderConfig(plugin) {
// Capabilities only exist once the plugin is activated: say that, rather than claiming it has
// none to configure.
empty.textContent = !plugin
? T("config_select_plugin", "Select a plugin to configure its capabilities")
? "Select a plugin to configure its capabilities"
: (IsPluginLoading(plugin)
? T("config_loading", "Loading the plugin…")
? "Loading the plugin…"
: (GetStatus(plugin) === "Activated"
? T("config_no_capabilities", "This plugin exposes no capabilities")
: T("config_activate", "Activate this plugin to configure its capabilities")));
? "This plugin exposes no capabilities"
: "Activate this plugin to configure its capabilities"));
empty.hidden = false;
layout.hidden = true;
sidebar.replaceChildren();
@@ -1123,7 +1121,7 @@ function ValidateConfigText() {
SetConfigValidation("");
return true;
} catch (err) {
SetConfigValidation(String(err?.message || T("invalid_json", "Invalid JSON")));
SetConfigValidation(String(err?.message || "Invalid JSON"));
return false;
}
}
@@ -1239,19 +1237,21 @@ function RenderDescription(plugin) {
const isCloud = plugin && (plugin.source === "mine" || plugin.source === "subscribed" || plugin.source === "orphaned");
if (isCloud && String(plugin?.sharing_token || "")) {
node.appendChild(document.createTextNode("View on OrcaCloud "));
const link = document.createElement("a");
link.href = "#";
link.className = "plugin-cloud-link";
link.title = T("open_in_browser", "Open this plugin in your browser");
link.textContent = "here";
link.title = "Open this plugin in your browser";
link.addEventListener("click", (event) => {
event.preventDefault();
sendOpenPluginOnCloud(String(plugin.plugin_key || ""));
});
AppendTemplate(node, T("view_on_cloud", "View on OrcaCloud <a>here</a>"), link);
node.appendChild(link);
return;
}
node.textContent = T("no_description", "No description available");
node.textContent = "No description available";
}
function RenderChangelog(plugin) {
@@ -1305,8 +1305,8 @@ function ApplyDetailUpdateBadge(node, plugin) {
if (updateStatus === "unauthorized") {
node.hidden = false;
node.classList.add("is-warning");
node.title = T("unauthorized", "Unauthorized for updates");
node.setAttribute("aria-label", node.title);
node.title = "Unauthorized for updates";
node.setAttribute("aria-label", "Unauthorized for updates");
return;
}
@@ -1339,37 +1339,19 @@ function UpdateSelectedPlugin() {
});
}
// The status arrives as an identifier, which also names the status-* CSS classes.
function StatusLabel(plugin) {
switch (GetStatus(plugin)) {
case "Activated":
return T("status_activated", "Activated");
case "Loading":
return T("status_loading", "Loading");
case "Error":
return T("status_error", "Error");
case "RuntimeError":
return T("status_runtime_error", "Runtime error");
case "Inactive":
return T("status_inactive", "Inactive");
default:
return GetStatus(plugin);
}
}
function StatusDescription(plugin) {
switch (GetStatus(plugin)) {
case "Activated":
return T("status_activated_desc", "This plugin is active and ready to be used.");
return "This plugin is active and ready to be used.";
case "Loading":
return T("status_loading_desc", "This plugin is still loading.");
return "This plugin is still loading.";
case "Error":
return T("status_error_desc", "This plugin is blocked until its error is fixed.");
return "This plugin is blocked until its error is fixed.";
case "RuntimeError":
return T("status_runtime_error_desc", "This plugin is loaded but a capability reported an error.");
return "This plugin is loaded but a capability reported an error.";
case "Inactive":
default:
return T("status_inactive_desc", "This plugin is inactive. Activate it to install or load it.");
return "This plugin is inactive. Activate it to install or load it.";
}
}
@@ -1377,13 +1359,13 @@ function RenderDetailSummary(container, plugin) {
container.replaceChildren();
if (!plugin) {
container.textContent = T("select_plugin", "Select a plugin to view its status and details.");
container.textContent = "Select a plugin to view its status and details.";
return;
}
const statusChip = document.createElement("span");
statusChip.className = `detail-status-chip status-${GetStatus(plugin).toLowerCase()}`;
statusChip.textContent = StatusLabel(plugin);
statusChip.textContent = GetStatus(plugin);
container.appendChild(statusChip);
const message = document.createElement("div");
@@ -1395,7 +1377,7 @@ function RenderDetailSummary(container, plugin) {
if (plugin.orphaned === true) {
const warning = document.createElement("div");
warning.className = "detail-description detail-warning-text";
warning.textContent = T("orphaned_note", "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used.");
warning.textContent = "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used.";
container.appendChild(warning);
}
@@ -1403,14 +1385,14 @@ function RenderDetailSummary(container, plugin) {
if (updateStatus === "update_available") {
const note = document.createElement("div");
note.className = "detail-description detail-note-text";
note.textContent = T("newer_version_note", "A newer plugin version is available.");
note.textContent = "A newer plugin version is available.";
container.appendChild(note);
}
if (updateStatus === "unauthorized") {
const note = document.createElement("div");
note.className = "detail-description detail-note-text is-warning";
note.textContent = T("unauthorized_note", "Cloud updates are unavailable because this plugin is unauthorized for updates.");
note.textContent = "Cloud updates are unavailable because this plugin is unauthorized for updates.";
container.appendChild(note);
}
}
@@ -11,7 +11,7 @@
<link rel="stylesheet" type="text/css" href="../css/theme.css" />
<script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="../js/json2.js"></script>
<script type="text/javascript" src="../../include/i18n.js"></script>
<script type="text/javascript" src="../../data/text.js"></script>
<script type="text/javascript" src="../js/globalapi.js"></script>
<script type="text/javascript" src="../js/common.js"></script>
<!-- <script type="text/javascript" src="./23.js"></script> -->
@@ -21,7 +21,7 @@
<div class="app">
<div class="split">
<div class="top-toolbar">
<button id="refresh_btn" class="ButtonStyleConfirm ButtonTypeChoice toolbar-btn" data-i18n="refresh">Refresh</button>
<button id="refresh_btn" class="ButtonStyleConfirm ButtonTypeChoice toolbar-btn">Refresh</button>
<!-- <label class="auto-update-switch" for="auto_update_toggle">
<span class="auto-update-label">Auto update</span>
@@ -35,18 +35,18 @@
<section class="pane top">
<div class="hdr top-cols">
<span data-i18n="name">Name</span>
<span data-i18n="type">Type</span>
<span data-i18n="version">Version</span>
<span data-i18n="update">Update</span>
<span>Name</span>
<span>Type</span>
<span>Version</span>
<span>Update</span>
</div>
<div id="topList" class="body"></div>
</section>
<section class="pane bottom">
<div class="hdr bot-cols">
<span data-i18n="name">Name</span>
<span data-i18n="type">Type</span>
<span>Name</span>
<span>Type</span>
</div>
<div id="bottomList" class="body"></div>
</section>
@@ -55,15 +55,15 @@
<!-- Footer -->
<div id="AcceptArea">
<div id="export_btn" class="ButtonStyleConfirm ButtonTypeChoice" data-i18n="export_presets" hidden>Export Presets</div>
<div id="close_btn" class="ButtonStyleRegular ButtonTypeChoice" data-i18n="close">Close</div>
<div id="export_btn" class="ButtonStyleConfirm ButtonTypeChoice" hidden>Export Presets</div>
<div id="close_btn" class="ButtonStyleRegular ButtonTypeChoice">Close</div>
</div>
<!-- Context Menu -->
<div id="ctxMenu" class="ctx" hidden>
<button class="ctx-item" data-action="open_folder" data-i18n="open_folder">Open folder in explorer</button>
<button id = "delete_btn" class="ctx-item-delete" data-action="delete_bundle" data-i18n="delete_bundle" hidden>Delete bundle</button>
<button id = "unsubscribe_btn" class="ctx-item-subscribed" data-action="unsubscribe_bundle" data-i18n="unsubscribe_bundle" hidden>Unsubscribe bundle</button>
<button class="ctx-item" data-action="open_folder">Open folder in explorer</button>
<button id = "delete_btn" class="ctx-item-delete" data-action="delete_bundle" hidden>Delete bundle</button>
<button id = "unsubscribe_btn" class="ctx-item-subscribed" data-action="unsubscribe_bundle" hidden>Unsubscribe bundle</button>
</div>
@@ -3,14 +3,8 @@ const bundlesById = new Map(); // bundleId -> bundle object
const printersByBundle = new Map(); // bundleId -> Map(index -> printerName)
const filamentsByBundle = new Map(); // bundleId -> Map(index -> filamentName)
const processesByBundle = new Map(); // bundleId -> Map(index -> presetName)
const UPDATE_TOOLTIP = T("update_available", "Update available");
const UNAUTHORIZED_TOOLTIP = T("unauthorized_bundle", "Unauthorized bundle");
// Display names for the bundle types the native side sends (also kept raw in data-bundle-type).
const BUNDLE_TYPE_LABELS = {
Subscribed: T("type_subscribed", "Subscribed"),
Local: T("type_local", "Local"),
Default: T("type_default", "Default")
};
const UPDATE_TOOLTIP = "Update available";
const UNAUTHORIZED_TOOLTIP = "Unauthorized bundle";
// ========= DOM =========
let topList = null;
@@ -236,11 +230,11 @@ function renderTop() {
: `<span class="bundle-status-icon-spacer" aria-hidden="true"></span>`}
${
b.type === "Subscribed" ?
`<a href="#" class="bundle-name-text bundle-cloud-link" title="${escapeAttr(T("open_in_browser", "Open this bundle in your browser"))}">${escapeHtml(b.name)}</a>`
`<a href="#" class="bundle-name-text bundle-cloud-link" title="Open this bundle in your browser">${escapeHtml(b.name)}</a>`
: `<span class="bundle-name-text">${escapeHtml(b.name)}</span>`
}
</div>
<span title="${escapeAttr(BundleTypeLabel(b.type))}">${escapeHtml(BundleTypeLabel(b.type))}</span>
<span title="${escapeAttr(b.type)}">${escapeHtml(b.type)}</span>
<span title="${escapeAttr(b.version)}">${escapeHtml(b.version)}</span>
<div class="cell bundle-update-cell">
<button
@@ -248,7 +242,7 @@ function renderTop() {
class="bundle-update-btn ${(!b.unauthorized && b.update_available) ? "is-enabled" : "is-disabled"}"
${(!b.unauthorized && b.update_available) ? "" : "disabled"}
data-id="${escapeAttr(b.id)}"
>${escapeHtml(T("update", "Update"))}</button>
>Update</button>
</div>
</div>
`).join("");
@@ -288,9 +282,9 @@ function renderBottomForBundle(bundleId) {
// Convert to a flat list of rows { typeLabel, name }
const rows = [];
for (const [, name] of printers) rows.push({ type: T("printer", "Printer"), name });
for (const [, name] of filaments) rows.push({ type: T("filament", "Filament"), name });
for (const [, name] of processes) rows.push({ type: T("process", "Process"), name });
for (const [, name] of printers) rows.push({ type: "Printer", name });
for (const [, name] of filaments) rows.push({ type: "Filament", name });
for (const [, name] of processes) rows.push({ type: "Process", name });
bottomList.innerHTML = rows.map((r, idx) => `
<div class="row" data-id="${escapeAttr(bundleId)}" data-idx="${idx}">
@@ -357,10 +351,6 @@ function hideMenu() {
contextRow = null;
}
// ========= Utilities =========
function BundleTypeLabel(type) {
return BUNDLE_TYPE_LABELS[type] || type;
}
function safeJsonParse(s) {
try { return JSON.parse(s); } catch { return null; }
}
+2 -2
View File
@@ -1421,8 +1421,8 @@ function focusInput() { setTimeout(function () { if (qEl) qEl.focus(); }, 0); }
function OnInit() {
qEl = $("q"); listEl = $("list"); favEl = $("favBar"); clearEl = $("clear"); eyeEl = $("favEyebrow"); countEl = $("count"); detailEl = $("detail");
ghostEl = $("ghost"); ghostTypedEl = $("ghostTyped"); ghostSuffixEl = $("ghostSuffix");
// This page has no data-i18n markup and defines its own `$` and T(), so it does not load
// include/i18n.js. Its strings all go through T().
// text.js's TranslatePage() targets jQuery `.trans` nodes; this page has none and defines its own
// `$`, so don't call it. Runtime strings go through T() instead.
qEl.placeholder = T("sd_search", "Search actions");
qEl.setAttribute("aria-label", T("sd_search", "Search actions"));
if (clearEl) {
@@ -11,7 +11,7 @@
<link rel="stylesheet" href="./styles.css" />
<script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="../js/json2.js"></script>
<script type="text/javascript" src="../../include/i18n.js"></script>
<script type="text/javascript" src="../../data/text.js"></script>
<script type="text/javascript" src="../js/globalapi.js"></script>
<script type="text/javascript" src="../../include/xterm/xterm.js"></script>
<script type="text/javascript" src="../../include/xterm/xterm-addon-fit.js"></script>
@@ -21,8 +21,8 @@
<div class="app">
<div id="terminal-container"></div>
<div class="input-row">
<input type="text" id="cmd-input" placeholder="python ... or uv ..." data-i18n-placeholder="command_hint" />
<button id="run-btn" data-i18n="run">Run</button>
<input type="text" id="cmd-input" placeholder="python ... or uv ..." />
<button id="run-btn">Run</button>
</div>
</div>
</body>
+4 -3
View File
@@ -36,7 +36,8 @@ function WatchXtermTheme() {
}
function OnInit() {
TranslatePage();
if (typeof TranslatePage === "function")
TranslatePage();
term = new Terminal({
cursorBlink: true,
@@ -76,7 +77,7 @@ function OnInit() {
onRun();
});
term.writeln(T("ready", "Plugin terminal ready."));
term.writeln("Plugin terminal ready.");
}
function onRun() {
@@ -121,7 +122,7 @@ function HandleStudio(value) {
case "process_done":
setRunning(false);
term.writeln("\x1b[90m" + T("exit_code", "Process exited with code: %s", payload.exit_code) + "\x1b[0m");
term.writeln("\x1b[90mProcess exited with code: " + payload.exit_code + "\x1b[0m");
break;
case "process_error":
+2 -2
View File
@@ -9,7 +9,7 @@
<link rel="stylesheet" type="text/css" href="../css/dark.css" />
<script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="../js/json2.js"></script>
<script type="text/javascript" src="../../include/i18n.js"></script>
<script type="text/javascript" src="../../data/text.js"></script>
<script type="text/javascript" src="../js/globalapi.js"></script>
<script type="text/javascript" src="../js/common.js"></script>
<script type="text/javascript" src="load.js"></script>
@@ -17,7 +17,7 @@
<body onLoad="OnInit()">
<div id="LoadBlock">
<img id="LoadingSvg" src="loading.svg" />
<div id="LoadTip" data-i18n="loading">Loading…</div>
<div id="LoadTip" class="trans" tid="t126">Loading……</div>
</div>
</body>
</html>
+4 -4
View File
@@ -9,7 +9,7 @@
<link rel="stylesheet" type="text/css" href="../css/dark.css" />
<link rel="stylesheet" type="text/css" href="1.css" />
<script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="../../include/i18n.js"></script>
<script type="text/javascript" src="../../data/text.js"></script>
<script type="text/javascript" src="../js/globalapi.js"></script>
<script type="text/javascript" src="../js/common.js"></script>
</head>
@@ -17,10 +17,10 @@
<div id="SlicerIcon" style="text-align: center;">
<img src="../../image/logo.png"/>
</div>
<div id="Title" data-i18n="welcome">Welcome to Orca Slicer</div>
<div id="STip" data-i18n="setup_intro">Orca Slicer will be set up in several steps. Let's start!</div>
<div id="Title" class="trans" tid="t1">Welcome to Orca Slicer</div>
<div id="STip" class="trans" tid="t2">Orca Slicer will be setup in several steps. Let's start!</div>
<div id="BtnArea">
<a id="StartBtn" class="ButtonStyleConfirm ButtonTypeChoice" href="../11/index.html" data-i18n="get_started">Get Started</a>
<a id="StartBtn" class="ButtonStyleConfirm ButtonTypeChoice trans" tid="t24" href="../11/index.html">Get Started</a>
</div>
</body>
</html>
+8 -8
View File
@@ -10,23 +10,23 @@
<link rel="stylesheet" type="text/css" href="../css/dark.css" />
<script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="../js/json2.js"></script>
<script type="text/javascript" src="../../include/i18n.js"></script>
<script type="text/javascript" src="../../data/text.js"></script>
<script type="text/javascript" src="../js/globalapi.js"></script>
<script type="text/javascript" src="../js/common.js"></script>
<script type="text/javascript" src="11.js"></script>
</head>
<body onLoad="OnInit()">
<div id="Title">
<div data-i18n="login_region">Please select your login region</div>
<div class="trans" tid="t47">Please select your login region</div>
</div>
<div id="Content">
<div id="EarthIcon"><img src="earth.png"/></div>
<div id="RegionList">
<div class="RegionItem RegionSelected TextS1" region="Asia-Pacific" onclick="ChooseRegion('Asia-Pacific')" data-i18n="asia_pacific">Asia-Pacific</div>
<div class="RegionItem" region="China" onclick="ChooseRegion('China')" data-i18n="china">China</div>
<div class="RegionItem" region="Europe" onclick="ChooseRegion('Europe')" data-i18n="europe">Europe</div>
<div class="RegionItem" region="North America" onclick="ChooseRegion('North America')" data-i18n="north_america">North America</div>
<div class="RegionItem" region="Others" onclick="ChooseRegion('Others')" data-i18n="others">Others</div>
<div class="trans RegionItem RegionSelected TextS1" tid="t48" region="Asia-Pacific" onclick="ChooseRegion('Asia-Pacific')">Asia-Pacific</div>
<div class="trans RegionItem" tid="t49" region="China" onclick="ChooseRegion('China')">China</div>
<div class="trans RegionItem" tid="t60" region="Europe" onclick="ChooseRegion('Europe')">Europe</div>
<div class="trans RegionItem" tid="t61" region="North America" onclick="ChooseRegion('North America')">North America</div>
<div class="trans RegionItem" tid="t62" region="Others" onclick="ChooseRegion('Others')">Others</div>
</div>
<!-- <div id="ChangeTip">
<div><img class="TipIcon" src="tip.png" /></div>
@@ -34,7 +34,7 @@
</div>-->
</div>
<div id="AcceptArea">
<div class="ButtonStyleConfirm ButtonTypeChoice" id="AcceptBtn" onclick="GotoPolicyPage()" data-i18n="next">Next</div>
<div class="ButtonStyleConfirm ButtonTypeChoice trans" id="AcceptBtn" tid="t9" onclick="GotoPolicyPage()">Next</div>
</div>
</body>
</html>
+10 -11
View File
@@ -50,17 +50,17 @@ function HandleStudio( pVal )
let hasError = pVal.hasOwnProperty("error");
noticeBar.classList.toggle("notice-error", hasError);
if (hasError) {
noticeBar.textContent = T("error", "Error");
noticeBar.textContent = "Error";
noticeText.textContent = pVal["error"];
} else if (pVal["vendors"] && pVal["vendors"].length > 0) {
noticeBar.textContent = T("new_printers_found", "New printers found");
noticeText.textContent = T("new_vendors_installed", "New printer vendors installed: %s", pVal["vendors"].join(", "));
noticeBar.textContent = "New printers found";
noticeText.textContent = "New printer vendors installed: " + pVal["vendors"].join(", ");
} else if (pVal["declined"]) {
noticeBar.textContent = T("information", "Information");
noticeText.textContent = T("vendors_declined", "New printer vendors were found, but installation was cancelled.");
noticeBar.textContent = "Information";
noticeText.textContent = "New printer vendors were found, but installation was cancelled.";
} else {
noticeBar.textContent = T("information", "Information");
noticeText.textContent = T("no_new_printers", "No new printers found.");
noticeBar.textContent = "Information";
noticeText.textContent = "No new printers found.";
}
ShowNotice(1);
@@ -272,7 +272,7 @@ function CreateVendorBlock(vendorName)
if( alt == "BBL" )
alt = "Bambu Lab";
if( alt == "Custom")
alt = T("custom_printer", "Custom Printer");
alt = "Custom Printer";
if( alt == "Other")
alt = "Orca colosseum";
@@ -315,7 +315,7 @@ function CreatePrinterBlock(OneModel)
' </div>'+
' <div class="PrinterInfoMark">?</div>'+
' <div class="PrinterInfo">'+
' <div class="title">' + T("nozzle", "Nozzle") + '</div>'+
' <div class="title trans">Nozzle</div>'+
' <div class="value">' + OneModel['nozzle_diameter'].replaceAll(";", " · ") + '</div>'+
' </div>'+
' <div style="display: flex;">'+
@@ -377,8 +377,7 @@ function OnExit()
if( nTotal==0 ) {
let noticeBar = document.getElementById("NoticeBar");
noticeBar.classList.add("notice-error");
noticeBar.textContent = T("error", "Error");
document.getElementById("NoticeText").textContent = T("printer_required", "At least one printer must be selected.");
noticeBar.textContent = "Error";
ShowNotice(1);
return 0;
}
+9 -9
View File
@@ -12,7 +12,7 @@
<script type="text/javascript" src="test.js"></script>
<script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="../js/json2.js"></script>
<script type="text/javascript" src="../../include/i18n.js"></script>
<script type="text/javascript" src="../../data/text.js"></script>
<script type="text/javascript" src="../js/globalapi.js"></script>
<script type="text/javascript" src="../js/common.js"></script>
<script type="text/javascript" src="../21/common.js"></script> <!-- ORCA use common sources for setup guide and standalone dialog -->
@@ -20,12 +20,12 @@
</head>
<body onLoad="OnInit()">
<div id="Title">
<div data-i18n="printer_selection">Printer Selection</div>
<div class="trans" tid="t10">Printer Selection</div>
</div>
<div id="SidebarContainer">
<div id="Sidebar" class="thin-scroll">
<div class="title" data-i18n="vendors">Vendors</div>
<div class="title">Vendors</div>
<div class="area" id="SidebarVendors">
<!-- <div class="SidebarItem"></div> -->
</div>
@@ -39,7 +39,7 @@
<div class="search" hasvalue="0">
<div class="search-icon icon16"></div>
<input type="text" class="searchTerm" placeholder=" " oninput="textInput(this)">
<span class="search-placeholder" data-i18n="search">Search</span>
<span class="search-placeholder trans">Search...</span>
</div>
<div class="LayoutSelector">
<div class="TabGroup">
@@ -81,17 +81,17 @@
</div>
<div id="AcceptArea">
<div class="ButtonStyleRegular ButtonTypeChoice" id="PreBtn" onclick="window.open('../1/index.html','_self')" data-i18n="back">Back</div>
<div class="ButtonStyleConfirm ButtonTypeChoice" id="AcceptBtn" onclick="GotoFilamentPage()" data-i18n="next">Next</div>
<div class="ButtonStyleRegular ButtonTypeChoice trans" id="PreBtn" tid="t8" onclick="window.open('../1/index.html','_self')">Back</div>
<div class="ButtonStyleConfirm ButtonTypeChoice trans" id="AcceptBtn" tid="t9" onclick="GotoFilamentPage()">Next</div>
</div>
<div id="NoticeMask"></div>
<div id="NoticeBody">
<div id="NoticeBar" data-i18n="error">Error</div>
<div id="NoticeBar" class="trans" tid="t18">error</div>
<div id="NoticeContent">
<div id="NoticeText" data-i18n="printer_required">At least one printer must be selected.</div>
<div id="NoticeText" class="trans" tid="t37">At least one printer must be selected.</div>
<div id="NoticeBtns">
<div class="ButtonStyleConfirm ButtonTypeChoice" onClick="ShowNotice(0)" data-i18n="ok">OK</div>
<div class="ButtonStyleConfirm ButtonTypeChoice trans" tid="t36" onClick="ShowNotice(0)">ok</div>
</div>
</div>
</div>
+27 -27
View File
@@ -12,7 +12,7 @@
<script type="text/javascript" src="test.js"></script>
<script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="../js/json2.js"></script>
<script type="text/javascript" src="../../include/i18n.js"></script>
<script type="text/javascript" src="../../data/text.js"></script>
<script type="text/javascript" src="../js/globalapi.js"></script>
<script type="text/javascript" src="../js/common.js"></script>
<script type="text/javascript" src="../22/common.js"></script> <!-- ORCA use common sources for setup guide and standalone dialog -->
@@ -20,7 +20,7 @@
</head>
<body onLoad="OnInit()">
<div id="Title">
<div data-i18n="filament_selection">Filament Selection</div>
<div class="trans" tid="t14">Filament Selection</div>
</div>
<div id="Content" class="ZScrol">
<!-- ORCA column browser -->
@@ -29,14 +29,14 @@
<div class="cbr-column-title-container">
<div class="search-icon"></div>
<input type="text" class="cbr-search-bar" placeholder=" " tabindex="1"/>
<span class="cbr-search-placeholder" data-i18n="printer">Printer</span>
<span class="cbr-search-placeholder trans" tid="t15">printer</span>
<div class="clear-icon"></div>
</div>
<div class="cbr-content thin-scroll" id="MachineList">
<div class="CValues">
<label><input type="checkbox" mode="all" onClick="ChooseAllMachine()" /><span data-i18n="all">All</span></label>
<label><input type="checkbox" mode="all" onClick="ChooseAllMachine()" /><span class="trans" tid="t11">all</span></label>
</div>
<div class="cbr-no-items" data-i18n="no_items">No items</div>
<div class="cbr-no-items">No items</div>
</div>
</div>
@@ -44,14 +44,14 @@
<div class="cbr-column-title-container">
<div class="search-icon"></div>
<input type="text" class="cbr-search-bar" placeholder=" " tabindex="2"/>
<span class="cbr-search-placeholder" data-i18n="filament_type">Filament type</span>
<span class="cbr-search-placeholder trans" tid="t16">filament type</span>
<div class="clear-icon"></div>
</div>
<div class="cbr-content thin-scroll" id="FilatypeList">
<div class="CValues">
<label><input type="checkbox" onClick="ChooseAllFilament()" /><span data-i18n="all">All</span></label>
<label><input type="checkbox" class="trans" tid="t11" onClick="ChooseAllFilament()" /><span class="trans" tid="t11">all</span></label>
</div>
<div class="cbr-no-items" data-i18n="no_items">No items</div>
<div class="cbr-no-items">No items</div>
</div>
</div>
@@ -59,14 +59,14 @@
<div class="cbr-column-title-container">
<div class="search-icon"></div>
<input type="text" class="cbr-search-bar" placeholder=" " tabindex="3"/>
<span class="cbr-search-placeholder" data-i18n="vendor">Vendor</span>
<span class="cbr-search-placeholder trans" tid="t17">vendor</span>
<div class="clear-icon"></div>
</div>
<div class="cbr-content thin-scroll" id="VendorList">
<div class="CValues">
<label><input type="checkbox" onClick="ChooseAllVendor()" /><span data-i18n="all">All</span></label>
<label><input type="checkbox" class="trans" tid="t11" onClick="ChooseAllVendor()" /><span class="trans" tid="t11">all</span></label>
</div>
<div class="cbr-no-items" data-i18n="no_items">No items</div>
<div class="cbr-no-items">No items</div>
</div>
</div>
@@ -75,48 +75,48 @@
<div class="cbr-filter-box">
<div class="filter-icon"></div>
<input type="text" class="cbr-filter-bar" placeholder=" " tabindex="4"/>
<span class="cbr-filter-placeholder" data-i18n="filter_items">Filter items</span>
<span class="cbr-filter-placeholder trans">Filter items</span>
<div class="clear-icon"></div>
</div>
<div class="ComboBox NoLabel">
<div class="arrow-icon"></div>
<select id="filter-tags">
<option value="0" disabled selected hidden></option>
<option value="1" data-i18n="checked">Checked</option>
<option value="2" data-i18n="unchecked">Unchecked</option>
<option value="1">Checked</option>
<option value="2">Unchecked</option>
</select>
</div>
<div class="list-item-count"></div>
<div class="cbr-filter-btns">
<span class="cbr-filter-mode-filter" data-i18n="select_filtered">Select filtered</span>
<span class="cbr-filter-mode-visible" data-i18n="select_visible">Select visible</span>
<div class="ButtonStyleConfirm ButtonTypeWindow" onClick="SelectAllFilament(1)" data-i18n="all">All</div>
<div class="ButtonStyleRegular ButtonTypeWindow" onClick="SelectAllFilament(0)" data-i18n="clear_all">Clear all</div>
<span class="cbr-filter-mode-filter trans">Select filtered</span>
<span class="cbr-filter-mode-visible trans">Select visible</span>
<div class="ButtonStyleConfirm ButtonTypeWindow trans" tid="t11" onClick="SelectAllFilament(1)">all</div>
<div class="ButtonStyleRegular ButtonTypeWindow trans" tid="t12" onClick="SelectAllFilament(0)">Clear all</div>
</div>
</div>
<div class="cbr-content thin-scroll" id="ItemBlockArea">
<!-- <label class="MItem"><input type="checkbox" class="trans" tid="t11" onClick="SelectAllFilament()" /><span class="trans" tid="t11">all</span></label> -->
<div class="cbr-no-items" data-i18n="no_items">No items</div>
<div class="cbr-no-items">No items</div>
</div>
</div>
</div>
</div>
<div id="AcceptArea">
<div class="ButtonStyleRegular ButtonTypeChoice" id="PreBtn" onclick="ReturnPreviewPage()" data-i18n="back">Back</div>
<div class="ButtonStyleRegular ButtonTypeChoice" id="AcceptBtn" onclick="FinishGuide()" data-i18n="finish">Finish</div>
<div class="ButtonStyleConfirm ButtonTypeChoice" id="GotoNetPluginBtn" onclick="GotoNetPluginPage()" data-i18n="next">Next</div>
<div class="ButtonStyleRegular ButtonTypeChoice trans" tid="t8" id="PreBtn" onclick="ReturnPreviewPage()">Back</div>
<div class="ButtonStyleRegular ButtonTypeChoice trans" tid="t25" id="AcceptBtn" onclick="FinishGuide()">finish</div>
<div class="ButtonStyleConfirm ButtonTypeChoice trans" tid="t9" id="GotoNetPluginBtn" onclick="GotoNetPluginPage()">Next</div>
</div>
<div id="NoticeMask">
</div>
<div id="NoticeBody">
<div id="NoticeBar" data-i18n="error">Error</div>
<div id="NoticeBar" class="trans" tid="t18">error</div>
<div id="NoticeContent">
<div id="NoticeText" data-i18n="filament_required">At least one filament must be selected.</div>
<div id="NoticeText" data-i18n="use_default_filament">Do you want to use the default filament?</div>
<div id="NoticeText" class="trans" tid="t19">At least one filament must be selected. </div>
<div id="NoticeText" class="trans" tid="t20">Do you want to use default filament ?</div>
<div id="NoticeBtns">
<div class="ButtonStyleConfirm ButtonTypeChoice" onClick="ChooseDefaultFilament()" data-i18n="yes">Yes</div>
<div class="ButtonStyleRegular ButtonTypeChoice" onClick="ShowNotice(0)" data-i18n="no">No</div>
<div class="ButtonStyleConfirm ButtonTypeChoice trans" tid="t21" onClick="ChooseDefaultFilament()">Yes</div>
<div class="ButtonStyleRegular ButtonTypeChoice trans" tid="t22" onClick="ShowNotice(0)">No</div>
</div>
</div>
</div>
+28 -28
View File
@@ -11,7 +11,7 @@
<link rel="stylesheet" type="text/css" href="../css/dark.css" />
<script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="../js/json2.js"></script>
<script type="text/javascript" src="../../include/i18n.js"></script>
<script type="text/javascript" src="../../data/text.js"></script>
<script type="text/javascript" src="../js/globalapi.js"></script>
<script type="text/javascript" src="../js/common.js"></script>
<script type="text/javascript" src="../22/common.js"></script> <!-- ORCA use common sources for setup guide and standalone dialog -->
@@ -19,8 +19,8 @@
</head>
<body onLoad="OnInit()">
<div id="Title">
<div id="SystemFilamentBtn" class="TitleSelected" onClick="OnSelectMenu(1)" data-i18n="system_filaments">System Filaments</div>
<div id="CustomFilamentBtn" class="TitleUnselected" onClick="OnSelectMenu(2)" data-i18n="custom_filaments">Custom Filaments</div>
<div id="SystemFilamentBtn" class="TitleSelected trans" tid="t109" onClick="OnSelectMenu(1)">System Filaments</div>
<div id="CustomFilamentBtn" class="TitleUnselected trans" tid="t110" onClick="OnSelectMenu(2)">Custom Filaments</div>
</div>
<div id="Content" class="ZScrol">
@@ -32,14 +32,14 @@
<div class="cbr-column-title-container">
<div class="search-icon"></div>
<input type="text" class="cbr-search-bar" placeholder=" " tabindex="1"/>
<span class="cbr-search-placeholder" data-i18n="printer">Printer</span>
<span class="cbr-search-placeholder trans" tid="t15">printer</span>
<div class="clear-icon"></div>
</div>
<div class="cbr-content thin-scroll" id="MachineList">
<div class="CValues">
<label><input type="checkbox" mode="all" onClick="ChooseAllMachine()" /><span data-i18n="all">All</span></label>
<label><input type="checkbox" mode="all" onClick="ChooseAllMachine()" /><span class="trans" tid="t11">all</span></label>
</div>
<div class="cbr-no-items" data-i18n="no_items">No items</div>
<div class="cbr-no-items">No items</div>
</div>
</div>
@@ -47,14 +47,14 @@
<div class="cbr-column-title-container">
<div class="search-icon"></div>
<input type="text" class="cbr-search-bar" placeholder=" " tabindex="2"/>
<span class="cbr-search-placeholder" data-i18n="filament_type">Filament type</span>
<span class="cbr-search-placeholder trans" tid="t16">filament type</span>
<div class="clear-icon"></div>
</div>
<div class="cbr-content thin-scroll" id="FilatypeList">
<div class="CValues">
<label><input type="checkbox" onClick="ChooseAllFilament()" /><span data-i18n="all">All</span></label>
<label><input type="checkbox" class="trans" tid="t11" onClick="ChooseAllFilament()" /><span class="trans" tid="t11">all</span></label>
</div>
<div class="cbr-no-items" data-i18n="no_items">No items</div>
<div class="cbr-no-items">No items</div>
</div>
</div>
@@ -62,14 +62,14 @@
<div class="cbr-column-title-container">
<div class="search-icon"></div>
<input type="text" class="cbr-search-bar" placeholder=" " tabindex="3"/>
<span class="cbr-search-placeholder" data-i18n="vendor">Vendor</span>
<span class="cbr-search-placeholder trans" tid="t17">vendor</span>
<div class="clear-icon"></div>
</div>
<div class="cbr-content thin-scroll" id="VendorList">
<div class="CValues">
<label><input type="checkbox" onClick="ChooseAllVendor()" /><span data-i18n="all">All</span></label>
<label><input type="checkbox" class="trans" tid="t11" onClick="ChooseAllVendor()" /><span class="trans" tid="t11">all</span></label>
</div>
<div class="cbr-no-items" data-i18n="no_items">No items</div>
<div class="cbr-no-items">No items</div>
</div>
</div>
@@ -78,28 +78,28 @@
<div class="cbr-filter-box">
<div class="filter-icon"></div>
<input type="text" class="cbr-filter-bar" placeholder=" " tabindex="4"/>
<span class="cbr-filter-placeholder" data-i18n="filter_items">Filter items</span>
<span class="cbr-filter-placeholder trans">Filter items</span>
<div class="clear-icon"></div>
</div>
<div class="ComboBox NoLabel">
<div class="arrow-icon"></div>
<select id="filter-tags">
<option value="0" disabled selected hidden></option>
<option value="1" data-i18n="checked">Checked</option>
<option value="2" data-i18n="unchecked">Unchecked</option>
<option value="1">Checked</option>
<option value="2">Unchecked</option>
</select>
</div>
<div class="list-item-count"></div>
<div class="cbr-filter-btns">
<span class="cbr-filter-mode-filter" data-i18n="select_filtered">Select filtered</span>
<span class="cbr-filter-mode-visible" data-i18n="select_visible">Select visible</span>
<div class="ButtonStyleConfirm ButtonTypeWindow" onClick="SelectAllFilament(1)" data-i18n="all">All</div>
<div class="ButtonStyleRegular ButtonTypeWindow" onClick="SelectAllFilament(0)" data-i18n="clear_all">Clear all</div>
<span class="cbr-filter-mode-filter trans">Select filtered</span>
<span class="cbr-filter-mode-visible trans">Select visible</span>
<div class="ButtonStyleConfirm ButtonTypeWindow trans" tid="t11" onClick="SelectAllFilament(1)">all</div>
<div class="ButtonStyleRegular ButtonTypeWindow trans" tid="t12" onClick="SelectAllFilament(0)">Clear all</div>
</div>
</div>
<div class="cbr-content thin-scroll" id="ItemBlockArea">
<!-- <label class="MItem"><input type="checkbox" class="trans" tid="t11" onClick="SelectAllFilament()" /><span class="trans" tid="t11">all</span></label> -->
<div class="cbr-no-items" data-i18n="no_items">No items</div>
<div class="cbr-no-items">No items</div>
</div>
</div>
</div>
@@ -108,7 +108,7 @@
<div id="CustomFilamentsArea">
<div id="CFilament_Btn_Area">
<div class="ButtonStyleConfirm ButtonTypeWindow" onClick="OnClickCustomFilamentAdd()" data-i18n="create_new">Create New</div>
<div class="ButtonStyleConfirm ButtonTypeWindow trans" tid="t111" onClick="OnClickCustomFilamentAdd()">Create New</div>
</div>
<div id="CFilament_List" class="thin-scroll">
</div>
@@ -116,19 +116,19 @@
</div>
<div id="AcceptArea">
<div class="ButtonStyleConfirm ButtonTypeChoice" id="AcceptBtn" onclick="ConfirmSelect()" data-i18n="confirm">Confirm</div>
<div class="ButtonStyleRegular ButtonTypeChoice" id="PreBtn" onclick="CancelSelect()" data-i18n="cancel">Cancel</div>
<div class="ButtonStyleConfirm ButtonTypeChoice trans" tid="t39" id="AcceptBtn" onclick="ConfirmSelect()">Confirm</div>
<div class="ButtonStyleRegular ButtonTypeChoice trans" tid="t38" id="PreBtn" onclick="CancelSelect()">Cancel</div>
</div>
<div id="NoticeMask">
</div>
<div id="NoticeBody">
<div id="NoticeBar" data-i18n="error">Error</div>
<div id="NoticeBar" class="trans" tid="t18">error</div>
<div id="NoticeContent">
<div id="NoticeText" data-i18n="filament_required">At least one filament must be selected.</div>
<div id="NoticeText" data-i18n="use_default_filament">Do you want to use the default filament?</div>
<div id="NoticeText" class="trans" tid="t19">At least one filament must be selected. </div>
<div id="NoticeText" class="trans" tid="t20">Do you want to use default filament ?</div>
<div id="NoticeBtns">
<div class="ButtonStyleConfirm ButtonTypeChoice" onClick="ChooseDefaultFilament()" data-i18n="yes">Yes</div>
<div class="ButtonStyleRegular ButtonTypeChoice" onClick="ShowNotice(0)" data-i18n="no">No</div>
<div class="ButtonStyleConfirm ButtonTypeChoice trans" tid="t21" onClick="ChooseDefaultFilament()">yes</div>
<div class="ButtonStyleRegular ButtonTypeChoice trans" tid="t22" onClick="ShowNotice(0)">no</div>
</div>
</div>
</div>
+11 -11
View File
@@ -12,7 +12,7 @@
<!-- <script type="text/javascript" src="test.js"></script> -->
<script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="../js/json2.js"></script>
<script type="text/javascript" src="../../include/i18n.js"></script>
<script type="text/javascript" src="../../data/text.js"></script>
<script type="text/javascript" src="../js/globalapi.js"></script>
<script type="text/javascript" src="../js/common.js"></script>
<script type="text/javascript" src="../21/common.js"></script> <!-- ORCA use common sources for setup guide and standalone dialog -->
@@ -20,12 +20,12 @@
</head>
<body onLoad="OnInit()">
<div id="Title">
<div data-i18n="printer_selection">Printer Selection</div>
<div class="trans" tid="t10">Printer Selection</div>
</div>
<div id="SidebarContainer">
<div id="Sidebar" class="thin-scroll">
<div class="title" data-i18n="vendors">Vendors</div>
<div class="title">Vendors</div>
<div class="area" id="SidebarVendors">
<!-- <div class="SidebarItem"></div> -->
</div>
@@ -39,7 +39,7 @@
<div class="search" hasvalue="0">
<div class="search-icon icon16"></div>
<input type="text" class="searchTerm" placeholder=" " oninput="textInput(this)">
<span class="search-placeholder" data-i18n="search">Search</span>
<span class="search-placeholder trans">Search...</span>
</div>
<div class="LayoutSelector">
<div class="TabGroup">
@@ -81,19 +81,19 @@
</div>
<div id="AcceptArea">
<div class="ButtonStyleRegular ButtonTypeChoice" id="CreateBtn" onclick="CreateNewPrinter()" data-i18n="create">Create</div>
<div class="ButtonStyleRegular ButtonTypeChoice" id="CheckNewPrintersBtn" onclick="CheckForNewPrinters()" data-i18n="check_new_printers">Check for new printers</div>
<div class="ButtonStyleConfirm ButtonTypeChoice" id="AcceptBtn" onclick="ConfirmSelect()" data-i18n="confirm">Confirm</div>
<div class="ButtonStyleRegular ButtonTypeChoice" id="PreBtn" onclick="CancelSelect()" data-i18n="cancel">Cancel</div>
<div class="ButtonStyleRegular ButtonTypeChoice trans" id="CreateBtn" onclick="CreateNewPrinter()">Create</div>
<div class="ButtonStyleRegular ButtonTypeChoice" id="CheckNewPrintersBtn" onclick="CheckForNewPrinters()">Check for new printers</div>
<div class="ButtonStyleConfirm ButtonTypeChoice trans" tid="t39" id="AcceptBtn" onclick="ConfirmSelect()">Confirm</div>
<div class="ButtonStyleRegular ButtonTypeChoice trans" tid="t38" id="PreBtn" onclick="CancelSelect()">Cancel</div>
</div>
<div id="NoticeMask"></div>
<div id="NoticeBody">
<div id="NoticeBar" data-i18n="error">Error</div>
<div id="NoticeBar" class="trans" tid="t18">error</div>
<div id="NoticeContent">
<div id="NoticeText" data-i18n="printer_required">At least one printer must be selected.</div>
<div id="NoticeText" class="trans" tid="t37">At least one printer must be selected.</div>
<div id="NoticeBtns">
<div class="ButtonStyleConfirm ButtonTypeChoice" onClick="ShowNotice(0)" data-i18n="ok">OK</div>
<div class="ButtonStyleConfirm ButtonTypeChoice trans" tid="t36" onClick="ShowNotice(0)">ok</div>
</div>
</div>
</div>
+46
View File
@@ -0,0 +1,46 @@
.PolicyArea
{
background-color: #4A4A51;
}
#PolicyTxt
{
padding: 12px;
word-wrap:break-word;
overflow-y: auto;
min-height: 200px;
text-indent: 2em;
border-style: solid;
border-width: 1px;
border-color: #D7D7D7;
}
#PolicyTxt::-webkit-scrollbar {/*滚动条整体样式*/
width: 5px; /*高宽分别对应横竖滚动条的尺寸*/
height: 1px;
}
#PolicyTxt::-webkit-scrollbar-thumb {/*滚动条里面小方块*/
border-radius: 10px;
-webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
background-color: #AAAAAA;
}
#PolicyTxt::-webkit-scrollbar-track {/*滚动条里面轨道*/
-webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
border-radius: 10px;
background: #EDEDED;
}
#C_List li
{
margin-left: 4em;
}
p
{
text-indent:2em;
margin-bottom: 2px;
}
+80
View File
@@ -0,0 +1,80 @@
function OnInit()
{
TranslatePage();
SendPrivacySelect();
}
function SendPrivacySelect()
{
let nVal="refuse";
if( $('#ChoosePrivacy').is(':checked') )
nVal="agree";
var tSend={};
tSend['sequence_id']=Math.round(new Date() / 1000);
tSend['command']="user_private_choice";
tSend['data']={};
tSend['data']['action']=nVal;
SendWXMessage( JSON.stringify(tSend) );
}
function GotoNextPage()
{
RequestProfile();
}
function RequestProfile()
{
var tSend={};
tSend['sequence_id']=Math.round(new Date() / 1000);
tSend['command']="request_userguide_profile";
SendWXMessage( JSON.stringify(tSend) );
}
function HandleStudio( pVal )
{
let strCmd=pVal['command'];
//alert(strCmd);
if(strCmd=='response_userguide_profile')
{
HandleModelInfo(pVal['response']);
}
}
function HandleModelInfo( pVal )
{
let Modellist=pVal["model"];
let nModel=Modellist.length;
if(nModel==1)
{
// let pModel=Modellist[0];
//
// var tSend={};
// tSend['sequence_id']=Math.round(new Date() / 1000);
// tSend['command']="save_userguide_models";
// tSend['data']={};
//
// let ModelName=pModel['model'];
//
// tSend['data'][ModelName]={};
// tSend['data'][ModelName]['model']=pModel['model'];
// tSend['data'][ModelName]['nozzle_diameter']=pModel['nozzle_diameter'];
// tSend['data'][ModelName]['vendor']=pModel['vendor'];
//
// SendWXMessage( JSON.stringify(tSend) );
window.location.href="../22/index.html";
return;
}
window.location.href="../21/index.html";
}
+40
View File
@@ -0,0 +1,40 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="Cache-Control" content="max-age=7200" />
<title>引导_P1</title>
<link rel="stylesheet" type="text/css" href="../../include/global.css" /> <!-- ORCA One for all-->
<link rel="stylesheet" type="text/css" href="../css/common.css" />
<link rel="stylesheet" type="text/css" href="3.css" />
<link rel="stylesheet" type="text/css" href="../css/dark.css" />
<script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="../js/json2.js"></script>
<script type="text/javascript" src="../../data/text.js"></script>
<script type="text/javascript" src="../js/globalapi.js"></script>
<script type="text/javascript" src="../js/common.js"></script>
<script type="text/javascript" src="./3.js"></script>
</head>
<body onLoad="OnInit()">
<div id="Title">
<div class="trans" tid="t6">We kindly request your help to improve<br/> everyone's printing</div>
</div>
<div id="Content">
<div id="PolicyTxt" class="TextS2 TextArea1 ZScrol">
<a class="trans" tid="t54">In the 3D Printing community, we learn from each other’s successes and failures to adjust our own slicing parameters and settings. Orca Slicer follows the same principle and uses machine learning to improve its performance from the successes and failures of the vast number of prints by our users. We are training Orca Slicer to be smarter by feeding them the real-world data. If you are willing, this service will access information from your error logs and usage logs, which may include information described in </a><a class="HyperLink trans" tid="t55" href="https://bambulab.com/policies/privacy" target="_blank">Privacy Policy</a><a class="trans" tid="t56">
. We will not collect any Personal Data by which an individual can be identified directly or indirectly, including without limitation names, addresses, payment information, or phone numbers. By enabling this service, you agree to these terms and the statement about Privacy Policy.
</a>
</div>
<br/>
<label> <!-- ORCA use label tag to allow checkbox to toggle when user clicked to text -->
<input id="ChoosePrivacy" type="checkbox" onClick="SendPrivacySelect()" onChange="SendPrivacySelect()" />
<span class="trans TextS1" tid="t7">Allow sending anonymous data</span>
</label>
</div>
<div id="AcceptArea">
<div class="ButtonStyleRegular ButtonTypeChoice trans" tid="t8" id="PreBtn" onclick="window.open('../11/index.html','_self')">Back</div>
<div class="ButtonStyleConfirm ButtonTypeChoice trans" tid="t9" id="AcceptBtn" onclick="GotoNextPage()">Next</div>
</div>
</body>
</html>
+40
View File
@@ -0,0 +1,40 @@
#PolicyTxt
{
background-color: #EBEBEB;
padding: 12px;
word-wrap:break-word;
overflow-y: scroll;
min-height: 200px;
text-indent: 2em;
}
#PolicyTxt::-webkit-scrollbar {/*滚动条整体样式*/
width: 5px; /*高宽分别对应横竖滚动条的尺寸*/
height: 1px;
}
#PolicyTxt::-webkit-scrollbar-thumb {/*滚动条里面小方块*/
border-radius: 10px;
-webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
background-color: #AAAAAA;
}
#PolicyTxt::-webkit-scrollbar-track {/*滚动条里面轨道*/
-webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
border-radius: 10px;
background: #EDEDED;
}
#C_List li
{
margin-left: 4em;
}
p
{
text-indent:2em;
margin-bottom: 2px;
}
+80
View File
@@ -0,0 +1,80 @@
function OnInit()
{
TranslatePage();
SendPrivacySelect();
}
function SendPrivacySelect()
{
let nVal="refuse";
if( $('#ChoosePrivacy').is(':checked') )
nVal="agree";
var tSend={};
tSend['sequence_id']=Math.round(new Date() / 1000);
tSend['command']="user_private_choice";
tSend['data']={};
tSend['data']['action']=nVal;
SendWXMessage( JSON.stringify(tSend) );
}
function GotoNextPage()
{
RequestProfile();
}
function RequestProfile()
{
var tSend={};
tSend['sequence_id']=Math.round(new Date() / 1000);
tSend['command']="request_userguide_profile";
SendWXMessage( JSON.stringify(tSend) );
}
function HandleStudio( pVal )
{
let strCmd=pVal['command'];
//alert(strCmd);
if(strCmd=='response_userguide_profile')
{
HandleModelInfo(pVal['response']);
}
}
function HandleModelInfo( pVal )
{
let Modellist=pVal["model"];
let nModel=Modellist.length;
if(nModel==1)
{
// let pModel=Modellist[0];
//
// var tSend={};
// tSend['sequence_id']=Math.round(new Date() / 1000);
// tSend['command']="save_userguide_models";
// tSend['data']={};
//
// let ModelName=pModel['model'];
//
// tSend['data'][ModelName]={};
// tSend['data'][ModelName]['model']=pModel['model'];
// tSend['data'][ModelName]['nozzle_diameter']=pModel['nozzle_diameter'];
// tSend['data'][ModelName]['vendor']=pModel['vendor'];
//
// SendWXMessage( JSON.stringify(tSend) );
window.location.href="../22/index.html";
return;
}
window.location.href="../21/index.html";
}
+39
View File
@@ -0,0 +1,39 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="Cache-Control" content="max-age=7200" />
<title>引导_P1</title>
<link rel="stylesheet" type="text/css" href="../../include/global.css" /> <!-- ORCA One for all-->
<link rel="stylesheet" type="text/css" href="../css/common.css" />
<link rel="stylesheet" type="text/css" href="31.css" />
<script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="../js/json2.js"></script>
<script type="text/javascript" src="../../data/text.js"></script>
<script type="text/javascript" src="../js/globalapi.js"></script>
<script type="text/javascript" src="../js/common.js"></script>
<script type="text/javascript" src="./31.js"></script>
</head>
<body onLoad="OnInit()">
<div id="Title">
<div class="trans" tid="t6">We kindly request your help to improve<br/> everyone's printing</div>
</div>
<div id="Content">
<div id="PolicyTxt">
<a class="trans" tid="t54">In the 3D Printing community, we learn from each other’s successes and failures to adjust our own slicing parameters and settings. Orca Slicer follows the same principle and uses machine learning to improve its performance from the successes and failures of the vast number of prints by our users. We are training Orca Slicer to be smarter by feeding them the real-world data. If you are willing, this service will access information from your error logs and usage logs, which may include information described in </a><a class="HyperLink trans" tid="t55" href="https://bambulab.com/policies/privacy" target="_blank">Privacy Policy</a><a class="trans" tid="t56">
. We will not collect any Personal Data by which an individual can be identified directly or indirectly, including without limitation names, addresses, payment information, or phone numbers. By enabling this service, you agree to these terms and the statement about Privacy Policy.
</a>
</div>
<br/>
<label><!-- ORCA use label tag to allow checkbox to toggle when user clicked to text -->
<input id="ChoosePrivacy" type="checkbox" onClick="SendPrivacySelect()" onChange="SendPrivacySelect()" />
<span class="trans" tid="t7">Allow sending anonymous data</span>
</label>
</div>
<div id="AcceptArea">
<div class="ButtonStyleRegular ButtonTypeChoice trans" tid="t8" id="PreBtn" onclick="window.open('../11/index.html','_self')">Back</div>
<div class="ButtonStyleConfirm ButtonTypeChoice trans" tid="t9" id="AcceptBtn" onclick="GotoNextPage()">Next</div>
</div>
</body>
</html>
+8 -8
View File
@@ -10,32 +10,32 @@
<link rel="stylesheet" type="text/css" href="4orca.css" />
<script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="../js/json2.js"></script>
<script type="text/javascript" src="../../include/i18n.js"></script>
<script type="text/javascript" src="../../data/text.js"></script>
<script type="text/javascript" src="../js/globalapi.js"></script>
<script type="text/javascript" src="../js/common.js"></script>
<script type="text/javascript" src="4orca.js"></script>
</head>
<body onLoad="OnInit()">
<div id="Title">
<div data-i18n="stealth_mode">Stealth Mode</div>
<div class="trans" tid="orca3">Stealth Mode</div>
</div>
<div id="Content">
<div id="FeatureText">
<div><a class="TextS1" data-i18n="stealth_mode_desc">This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option.</a></div>
<div><a tid="orca4" class="trans TextS1">This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option.</a></div>
<br/>
<div><a class="TextS2" data-i18n="stealth_mode_note">Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud.</a></div>
<div><a tid="orca12" class="trans TextS2">Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud.</a></div>
</div>
<!-- ORCA use label tag to allow checkbox to toggle when user clicked to text -->
<label id="CheckArea"><input id="StealthMode" onClick="SendStealthModeCheck()" type="checkbox"><a class="TextS1" data-i18n="enable_stealth_mode">Enable Stealth Mode.</a></label>
<div id="RestartText"></div>
<label id="CheckArea"><input id="StealthMode" onClick="SendStealthModeCheck()" type="checkbox"><a tid="orca5" class="trans TextS1">Enable Stealth Mode.</a></label>
<div id="RestartText" tid="t70" class="trans" ></div>
</div>
<div id="AcceptArea">
<div class="ButtonStyleRegular ButtonTypeChoice" id="PreBtn" onclick="window.history.back()" data-i18n="back">Back</div>
<div class="ButtonStyleConfirm ButtonTypeChoice" id="GotoNetPluginBtn" onclick="GotoNetPluginPage()" data-i18n="next">Next</div>
<div class="ButtonStyleRegular ButtonTypeChoice trans" tid="t8" id="PreBtn" onclick="window.history.back()">Back</div>
<div class="ButtonStyleConfirm ButtonTypeChoice trans" tid="t9" id="GotoNetPluginBtn" onclick="GotoNetPluginPage()">Next</div>
</div>
</body>
</html>
+8 -8
View File
@@ -10,20 +10,20 @@
<link rel="stylesheet" type="text/css" href="5.css" />
<script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="../js/json2.js"></script>
<script type="text/javascript" src="../../include/i18n.js"></script>
<script type="text/javascript" src="../../data/text.js"></script>
<script type="text/javascript" src="../js/globalapi.js"></script>
<script type="text/javascript" src="../js/common.js"></script>
<script type="text/javascript" src="5.js"></script>
</head>
<body onLoad="OnInit()">
<div id="Title">
<div data-i18n="proprietary_plugins">Proprietary Plugins</div>
<div class="trans" tid="t64">Proprietary Plugins</div>
</div>
<div id="Content">
<div id="FeatureText">
<div><a class="TextS1" data-i18n="proprietary_plugins_desc">Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers.</a></div>
<div><a class="TextS1" data-i18n="proprietary_plugins_risk">Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk.</a></div>
<div><a tid="t75" class="trans TextS1">Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers.</a></div>
<div><a tid="t65" class="trans TextS1">Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk.</a></div>
<!-- <div><span class="TextPoint">●</span>&nbsp;&nbsp;<a tid="t65" class="trans" ></a></div>
<div><span class="TextPoint">●</span>&nbsp;&nbsp;<a tid="t66" class="trans" ></a></div>
@@ -33,13 +33,13 @@
<!-- ORCA use label tag to allow checkbox to toggle when user clicked to text -->
<label id="CheckArea"><input id="InstallCheck" onClick="SendInstallPluginCheck()" type="checkbox"><a class="TextS1" data-i18n="install_bambu_plugin">Install Bambu Network plug-in</a></label>
<div id="RestartText"></div>
<label id="CheckArea"><input id="InstallCheck" onClick="SendInstallPluginCheck()" type="checkbox"><a tid="t69" class="trans TextS1">Install Bambu Network Plug-in. </a></label>
<div id="RestartText" tid="t70" class="trans" ></div>
</div>
<div id="AcceptArea">
<div class="ButtonStyleRegular ButtonTypeChoice" id="PreBtn" onclick="window.history.back()" data-i18n="back">Back</div>
<div class="ButtonStyleConfirm ButtonTypeChoice" id="AcceptBtn" onclick="FinishGuide()" data-i18n="finish">Finish</div>
<div class="ButtonStyleRegular ButtonTypeChoice trans" tid="t8" id="PreBtn" onclick="window.history.back()">Back</div>
<div class="ButtonStyleConfirm ButtonTypeChoice trans" tid="t25" id="AcceptBtn" onclick="FinishGuide()">Finish</div>
</div>
</body>
</html>
+138
View File
@@ -0,0 +1,138 @@
*
{
padding: 0;
border: 0;
margin: 0;
font-family: "system-ui", "Segoe UI", Roboto, Oxygen, Ubuntu, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-sans;
}
html,body
{
font-size: 14px;
height:100%;
}
.LinkBtn
{
color: #1200FF;
cursor: pointer;
}
.LinkBtn:hover
{
text-decoration:underline;
}
.Btn_Green
{
padding: 1.5mm 6mm;
font-size: 14px;
text-align: center;
background-color: #009688;
border-radius: 6px;
color: #fff;
cursor: pointer;
display: inline-block;
border: 1px solid #02c7b3;
}
.Btn_Green:hover
{
background-color:#4db6ac;
}
#DownBlock
{
height: 60%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
#DownArea
{
width:80%;
height: 50%;
line-height: 50px;
display: inline;
}
#DownText
{
display: flex;
align-items: center;
}
#RetryBtn
{
background-image:url("restart.png");
background-size: 100% 100%;
width: 20px;
height: 20px;
margin-left: 20px;
display: none;
}
#DownPercent
{
height:20px;
}
#PercentBkg
{
height:20px;
background-color:#CFCFCF;
border-radius: 20px;
}
#PercentTip
{
float: left;
height:20px;
width: 0%;
background-color:#009688;
border-radius: 20px;
}
#DownSuccessTip
{
width:80%;
display: none;
text-align: center;
}
#InstallFailedTip
{
display:none;
height: auto;
}
/*------Btn Area------*/
#BtnBlock
{
height:40%;
display: flex;
justify-content: center;
align-items: center;
}
#CancelBtn
{
display: inline;
}
#RestartBtn
{
display: none;
}
#CloseBtn
{
display: none;
}
+167
View File
@@ -0,0 +1,167 @@
function OnInit()
{
//let strInput=JSON.stringify(cData);
//HandleStudio(strInput);
// let tVal={};
// tVal['status']=3;
// tVal['percent']=30;
//
// HandStatusPercent(tVal);
TranslatePage();
SendDownloadCmd();
}
function SendDownloadCmd()
{
var tSend={};
tSend['sequence_id']=Math.round(new Date() / 1000);
tSend['command']="Begin_Download_network_plugin";
SendWXMessage( JSON.stringify(tSend) );
}
function HandleStudio( pVal )
{
let strCmd=pVal['command'];
//alert(strCmd);
if(strCmd=='ShowStatusPercent')
{
HandStatusPercent(pVal['data']);
}
}
function HandStatusPercent( pVal )
{
let nStatus=pVal['status']*1;
let nPercent=pVal['percent'];
if(nStatus==0)
{
//正常下载
$('#DownStepText').attr("tid","t71");
$('#RetryBtn').hide();
$('#PercentTip').css("width",nPercent+'%');
}
else if(nStatus==1)
{
//下载失败 或 解压缩补丁包失败
$('#DownStepText').attr("tid","t72");
$('#PercentTip').css("width",0+'%');
$('#RetryBtn').show();
}
else if(nStatus==2)
{
//下载完成
$('#PercentTip').css("width",100+'%');
setTimeout("SendInstallPluginCmd()",100);
}
else if(nStatus==3)
{
//解压缩补丁包失败
$('#DownArea').hide();
$("#InstallFailedTip").show();
$('#CancelBtn').hide();
$('#RestartBtn').hide();
$('#CloseBtn').show();
}
else if(nStatus==4)
{
//安装补丁包完成
$('#DownArea').hide();
$('#DownSuccessTip').show();
$('#CancelBtn').hide();
$('#CloseBtn').hide();
$('#RestartBtn').show();
//pTimer=setInterval("RunInverse()",1000);
}
TranslatePage();
}
var nCount=3;
var pTimer=null;
function RunInverse()
{
$('#CountNumber').text(nCount+'');
nCount--;
if(nCount==-1)
{
RestartBambuStudio();
}
}
function RetryDownload()
{
$('#DownStepText').attr("tid","t71");
$('#PercentTip').css("width",0+'%');
SendDownloadCmd();
}
function CancelDownload()
{
var tSend={};
tSend['sequence_id']=Math.round(new Date() / 1000);
tSend['command']="netplugin_download_cancel";
SendWXMessage( JSON.stringify(tSend) );
}
function SendInstallPluginCmd()
{
var tSend={};
tSend['sequence_id']=Math.round(new Date() / 1000);
tSend['command']="begin_install_plugin";
SendWXMessage( JSON.stringify(tSend) );
}
function RestartBambuStudio()
{
if( pTimer!=null )
{
clearInterval(pTimer);
pTimer=null;
}
var tSend={};
tSend['sequence_id']=Math.round(new Date() / 1000);
tSend['command']="restart_studio";
SendWXMessage( JSON.stringify(tSend) );
}
function CloseDownDialog()
{
var tSend={};
tSend['sequence_id']=Math.round(new Date() / 1000);
tSend['command']="close_download_dialog";
SendWXMessage( JSON.stringify(tSend) );
}
function OpenPluginFolder()
{
var tSend={};
tSend['sequence_id']=Math.round(new Date() / 1000);
tSend['command']="open_plugin_folder";
SendWXMessage( JSON.stringify(tSend) );
}
+49
View File
@@ -0,0 +1,49 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="Cache-Control" content="max-age=7200" />
<title>引导_P1</title>
<link rel="stylesheet" type="text/css" href="../../include/global.css" /> <!-- ORCA One for all-->
<link rel="stylesheet" type="text/css" href="6.css" />
<script type="text/javascript" src="../../include/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="../js/json2.js"></script>
<script type="text/javascript" src="../../data/text.js"></script>
<script type="text/javascript" src="../js/globalapi.js"></script>
<script type="text/javascript" src="../js/common.js"></script>
<script type="text/javascript" src="6.js"></script>
</head>
<body onLoad="OnInit()">
<div id="DownBlock">
<div id="DownArea">
<div id="DownText">
<div id="DownStepText" class="trans" tid="t71">Downloading</div>
<div id="RetryBtn" onClick="RetryDownload()"></div>
</div>
<div>
<div id="PercentTip"></div>
<div id="PercentBkg"></div>
</div>
</div>
<div id="DownSuccessTip" class="trans" tid="t73">Installation successful.</div>
<div id="InstallFailedTip">
<div><a class="trans" tid="t79">Failed to install plug-in. </a><a class="trans" tid="t80">Try the following steps:</a></div>
<div><a class="trans" tid="t81">1, Click </a><a class="trans LinkBtn" tid="t77" onClick="OpenPluginFolder()">here</a><a class="trans" tid="t82"> to open the plug-in directory</a> </div>
<div class="trans" tid="t83">2, Close all open Orca Slicer</div>
<div class="trans" tid="t84">3, Delete all files under the plug-in directory</div>
<div class="trans" tid="t85">4, Reopen Orca Slicer and install the plug-in again</div>
</div>
</div>
<div id="BtnBlock">
<div id="CancelBtn" class="ButtonStyleRegular ButtonTypeChoice trans" tid="t38" onClick="CancelDownload()" >Cancel</div>
<div id="RestartBtn" class="ButtonStyleRegular ButtonTypeChoice trans" tid="t25" onClick="RestartBambuStudio()">Finish</div>
<div id="CloseBtn" class="ButtonStyleRegular ButtonTypeChoice trans" tid="t86" onClick="CloseDownDialog()" >Close </div>
</div>
</body>
</html>
Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

+15 -15
View File
@@ -15,7 +15,7 @@
<link rel="stylesheet" type="text/css" href="../include/swiper/swiper-bundle.min.css" />
<script type="text/javascript" src="../include/swiper/swiper-bundle.min.js"></script>
<script type="text/javascript" src="../include/i18n.js"></script>
<script type="text/javascript" src="../data/text.js"></script>
<script type="text/javascript" src="js/home.js"></script>
</head>
@@ -33,7 +33,7 @@
<span id="UserName" class="AccountName"></span>
<span class="AccountSecondary">Orca Cloud</span>
</span>
<span class="AccountSignIn" data-i18n="login">Login</span>
<span class="AccountSignIn trans" tid="t26">Login</span>
<svg class="AccountChevron" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
<path d="M3 4.75L6 7.75L9 4.75" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
@@ -46,7 +46,7 @@
<svg class="SectionChevron" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
<path d="M4.5 2.5L8 6L4.5 9.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span class="SectionLabel">Bambu Cloud</span>
<span class="SectionLabel trans" tid="orca6">Bambu Cloud</span>
<span id="BambuStatusDot"></span>
</div>
@@ -58,16 +58,16 @@
</span>
<span class="AccountText">
<span id="BambuUserName" class="AccountName"></span>
<span class="AccountSecondary" data-i18n="not_signed_in">Not signed in</span>
<span class="AccountSecondary trans" tid="orca8">Not signed in</span>
</span>
<span class="AccountSignIn" data-i18n="login">Login</span>
<span class="AccountSignIn trans" tid="t26">Login</span>
<svg class="AccountChevron" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
<path d="M3 4.75L6 7.75L9 4.75" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</div>
<div id="NoPluginTip">
<div id="NoPluginText" class="RedFont"><a class="LinkBtn" onClick="BeginDownloadNetworkPlugin()"></a></div>
<div id="NoPluginText"><a class="RedFont trans" tid="t76">Network plugin not detected. Click </a><a Class="LinkBtn trans" onClick="BeginDownloadNetworkPlugin()" tid="t77">here</a><a class="RedFont trans" tid="t78"> to install it.</a></div>
</div>
</div>
</div>
@@ -79,7 +79,7 @@
<div id="AccountMenuHandle" role="presentation"></div>
<div id="AccountMenuLogout" role="menuitem" tabindex="0" onClick="OnAccountMenuLogout()">
<span id="AccountMenuLogoutIcon"></span>
<span data-i18n="log_out">Log Out</span>
<span class="trans" tid="t50">Log out</span>
</div>
</div>
@@ -88,7 +88,7 @@
<div id="BtnArea">
<div menu="recent" class="BtnItem BtnItemSelected" onClick="GotoMenu('recent')">
<div class="BtnIcon "><img class="LeftIcon" src="img/i2.png" /></div>
<div data-i18n="recent">Recent</div>
<div class="trans" tid="t28">recent</div>
</div>
<div class="BtnItem BtnShortcut" onClick="OpenUrlInLocalBrowser('https://cloud.orcaslicer.com')">
<div class="BtnIcon "><img class="ShortcutBrandIcon" src="../image/logo.png" /></div>
@@ -119,14 +119,14 @@
<div class="MenuItem" onClick="OnClickNewProject()">
<div class="MenuIcon"><img src="img/i4.png"></div>
<div>
<div class="TextS1" data-i18n="new_project">New Project</div>
<div class="MenuDesc" data-i18n="create_new_project">Create new project</div>
<div class="trans TextS1" tid="t31">new project</div>
<div class="MenuDesc trans" tid="t32">create new project</div>
</div>
</div>
<div class="MenuItem" onClick="OnClickOpenProject()">
<div class="MenuIcon"><img src="img/i5.png"></div>
<div>
<div class="TextS1" data-i18n="open_project">Open Project</div>
<div class="trans TextS1" tid="t33">open project</div>
<div class="MenuDesc">3mf</div>
</div>
</div>
@@ -135,8 +135,8 @@
<div id="DebugText"></div>
<div id="RecentFileArea">
<div id="RecentTitleBlock">
<div id="RecentTitle" class="Content-Title TextS1" data-i18n="recently_opened">Recently opened</div>
<div id="RecentClearAllBtn" class="ButtonStyleRegular ButtonTypeWindow" onClick="OnDeleteAllRecentFiles()" data-i18n="clear_all">Clear all</div>
<div id="RecentTitle" class="Content-Title trans TextS1" tid="t35">recent open</div>
<div id="RecentClearAllBtn" class="ButtonStyleRegular ButtonTypeWindow trans" tid="t12" onClick="OnDeleteAllRecentFiles()">Clear all</div>
</div>
<div id="FileList">
<!-- <div class="FileItem" onClick="OnOpenRecentFile('aaaa')" fpath='d:\model\11.3mf'>
@@ -219,11 +219,11 @@
<div id="recnet_context_menu">
<div id="CT_Delete_Bar" class="CT_Item" onClick="OnDeleteRecentFile()">
<div class="CT_Icon CT_Delete"></div>
<div class="CT_Text" data-i18n="remove">Remove</div>
<div class="CT_Text trans" tid="t88">clear</div>
</div>
<div id="CT_Folder_Bar" class="CT_Item " onClick="OnExploreRecentFile()" >
<div class="CT_Icon CT_Explore"></div>
<div class="CT_Text" data-i18n="open_containing_folder">Open Containing Folder</div>
<div class="CT_Text trans" tid="t89">open in explorer </div>
</div>
</div>
-4
View File
@@ -6,10 +6,6 @@ function OnInit()
{
//-----Official-----
TranslatePage();
let pluginTip = document.getElementById("NoPluginText");
if (pluginTip)
AppendTemplate(pluginTip, T("plugin_not_detected", "Bambu Network plug-in not detected. Click <a>here</a> to install it."),
pluginTip.querySelector("a"));
SendMsg_GetLoginInfo();
SendMsg_GetBambuLoginInfo();
-55
View File
@@ -1,55 +0,0 @@
// Localized text for the bundled web pages. The hosting window injects the page's strings, translated
// through the .po catalogs, as window.ORCA_UI_STRINGS before any page script runs
// (WebViewHostDialog::localized_strings_script). The English in the markup and in the T() calls is the
// fallback for a page opened outside the app.
// The string for `key`, else `fallback`. Each further argument fills the next %s.
function T(key, fallback, ...args) {
const strings = (typeof ORCA_UI_STRINGS !== "undefined" && ORCA_UI_STRINGS) || {};
let text = strings[key] !== undefined ? String(strings[key]) : fallback;
// A replacer function, so a "$" in a value (a plugin name, say) is not read as a pattern.
args.forEach((arg) => { text = text.replace("%s", () => String(arg)); });
return text;
}
// Appends `template` to `node`, putting the nodes that follow in place of its markers, in order, so a
// translation can move them within the sentence. %s inserts the node as it is (a search term, say);
// <a>label</a> inserts it with the label as its text, so the translation words the link together with
// the sentence around it.
function AppendTemplate(node, template, ...nodes) {
let end = 0;
let next = 0;
for (const marker of template.matchAll(/%s|<a>(.*?)<\/a>/g)) {
if (marker.index > end)
node.appendChild(document.createTextNode(template.slice(end, marker.index)));
const inserted = nodes[next++];
if (inserted) {
if (marker[1] !== undefined)
inserted.textContent = marker[1];
node.appendChild(inserted);
}
end = marker.index + marker[0].length;
}
if (end < template.length)
node.appendChild(document.createTextNode(template.slice(end)));
}
// Translates the static markup: data-i18n names the key for an element's own text (child elements
// such as icons and sort arrows are kept), data-i18n-title, data-i18n-placeholder and
// data-i18n-aria-label the key for that attribute. Translating again is harmless, so a page can call
// this after adding markup.
function TranslatePage() {
document.querySelectorAll("[data-i18n]").forEach((el) => {
const textNode = Array.from(el.childNodes).find((n) => n.nodeType === Node.TEXT_NODE && n.nodeValue.trim());
const text = T(el.dataset.i18n, textNode ? textNode.nodeValue.trim() : "");
if (textNode)
textNode.nodeValue = text;
else
el.insertBefore(document.createTextNode(text), el.firstChild);
});
["title", "placeholder", "aria-label"].forEach((attr) => {
document.querySelectorAll(`[data-i18n-${attr}]`).forEach((el) => {
el.setAttribute(attr, T(el.getAttribute(`data-i18n-${attr}`), el.getAttribute(attr) || ""));
});
});
}
File diff suppressed because one or more lines are too long
+3 -3
View File
@@ -221,15 +221,15 @@ function ShowModelInfo( pModel )
switch(UploadType)
{
case 'remix':
$('#ModelAuthorType').text(T('remixed_by', 'Remixed by'));
$('#ModelAuthorType').attr('tid','t93');
break;
case 'shared':
$('#ModelAuthorType').text(T('shared_by', 'Shared by'));
$('#ModelAuthorType').attr('tid','t94');
break;
case 'origin':
case 'profile':
default:
$('#ModelAuthorType').text(T('created_by', 'Created by'));
$('#ModelAuthorType').attr('tid','t92');
break;
}
+3 -3
View File
@@ -6,7 +6,7 @@
<title>Printer Connection Required</title>
<link rel="stylesheet" type="text/css" href="css/home.css" />
<link rel="stylesheet" type="text/css" href="css/dark.css" />
<script type="text/javascript" src="../include/i18n.js"></script>
<script type="text/javascript" src="../data/text.js"></script>
<script type="text/javascript" src="../include/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="../homepage/js/json2.js"></script>
<script type="text/javascript" src="../homepage/js/globalapi.js"></script>
@@ -14,8 +14,8 @@
</head>
<body onLoad="OnInit()">
<div class="container">
<h1 data-i18n="printer_connection">Printer Connection</h1>
<p data-i18n="printer_connection_setup">Please set up your printer connection to view the device.</p>
<h1 class="trans">Printer Connection</h1>
<p class="trans">Please set up your printer connection to view the device.</p>
<img src="setup_connection.gif" alt="Printer connection setup demonstration" style="max-width: 100%; height: auto; display: block;"/>
</div>
</body>
-1
View File
@@ -405,7 +405,6 @@ set(lisbslic3r_sources
Polyline.hpp
PresetBundle.cpp
PresetBundle.hpp
PrinterBedAssets.hpp
PresetCacheFormat.cpp
PresetCacheFormat.hpp
Preset.cpp
+35 -6
View File
@@ -2164,6 +2164,16 @@ int PresetCollection::get_differed_values_to_update(Preset& preset, std::map<std
DynamicPrintConfig temp_config;
std::vector<std::string> dirty_options = preset.config.diff(parent_preset->config);
// Send the variant layout even when it matches the parent's, as the local save does: the loader
// sizes the per-variant values by it and would otherwise keep only the first one.
std::string extruder_id_name, extruder_variant_name;
std::set<std::string> *key_set1 = nullptr, *key_set2 = nullptr;
Preset::get_extruder_names_and_keysets(m_type, extruder_id_name, extruder_variant_name, &key_set1, &key_set2);
if (!extruder_id_name.empty())
dirty_options.emplace_back(extruder_id_name);
if (!extruder_variant_name.empty())
dirty_options.emplace_back(extruder_variant_name);
for (auto option: dirty_options)
{
ConfigOption *opt_src = preset.config.option(option);
@@ -2628,15 +2638,34 @@ bool PresetCollection::load_user_preset(std::string name, std::map<std::string,
new_config = default_preset.config;
}
std::string extruder_id_name, extruder_variant_name;
std::set<std::string> *key_set1 = nullptr, *key_set2 = nullptr;
Preset::get_extruder_names_and_keysets(m_type, extruder_id_name, extruder_variant_name, &key_set1, &key_set2);
// Older uploads left out a variant layout equal to the parent's but still sent one value per
// parent variant. Read those values against the parent's layout instead of cutting them to one.
if (inherit_preset && !cloud_config.has(extruder_variant_name)) {
const auto *parent_variants = inherit_preset->config.option<ConfigOptionStrings>(extruder_variant_name);
const size_t variant_count = parent_variants ? parent_variants->size() : 0;
bool values_per_variant = false;
for (const std::string &key : cloud_config.keys()) {
const size_t stride = key_set2->count(key) ? 2 : key_set1->count(key) ? 1 : 0;
const auto *values = dynamic_cast<const ConfigOptionVectorBase *>(cloud_config.option(key));
if (stride > 0 && key != extruder_id_name && values && variant_count > 1 && values->size() == variant_count * stride) {
values_per_variant = true;
break;
}
}
if (values_per_variant)
for (const std::string &key : {extruder_id_name, extruder_variant_name})
if (!key.empty() && !cloud_config.has(key) && inherit_preset->config.has(key))
cloud_config.set_key_value(key, inherit_preset->config.option(key)->clone());
}
extend_default_config_length(cloud_config, false, {});
if (inherit_preset) {
std::string extruder_id_name, extruder_variant_name;
std::set<std::string> *key_set1 = nullptr, *key_set2 = nullptr;
Preset::get_extruder_names_and_keysets(m_type, extruder_id_name, extruder_variant_name, &key_set1, &key_set2);
if (inherit_preset)
new_config.update_diff_values_to_child_config(cloud_config, extruder_id_name, extruder_variant_name, *key_set1, *key_set2);
}
else{
new_config.apply(std::move(cloud_config));
extend_default_config_length(new_config, true, default_preset.config);
+2 -308
View File
@@ -18,7 +18,6 @@
#include <cstdint>
#include <cmath>
#include <ctime>
#include <ios>
#include <optional>
#include <exception>
#include <memory>
@@ -30,7 +29,6 @@
#include <sstream>
#include "PresetBundle.hpp"
#include "PrinterBedAssets.hpp"
#include "Config.hpp"
#include "Exception.hpp"
@@ -66,7 +64,6 @@
#include <boost/algorithm/clamp.hpp>
#include <boost/algorithm/string/predicate.hpp>
#include <boost/range/adaptor/transformed.hpp>
#include <boost/nowide/convert.hpp>
#include <boost/nowide/cstdio.hpp>
#include <boost/nowide/fstream.hpp>
#include <boost/property_tree/ini_parser.hpp>
@@ -1681,258 +1678,6 @@ bool PresetBundle::apply_vendor_config(
return true;
}
namespace {
// The two bed files a printer bundle can carry. Zip names are bed/<n>/<stem><ext>, never the source basename.
struct BedAssetSlot {
const char *option;
const char *stem;
};
constexpr BedAssetSlot k_bed_asset_slots[] = {
{"bed_custom_texture", "texture"},
{"bed_custom_model", "model"},
};
std::string zip_slashes(std::string name)
{
for (char &c : name)
if (c == '\\')
c = '/';
return name;
}
// The bed dialog loads only png/svg textures and stl models. Anything else is not a bed asset.
bool bed_extension_allowed(const char *option, const std::string &ext)
{
if (std::string(option) == "bed_custom_texture")
return boost::iequals(ext, ".png") || boost::iequals(ext, ".svg");
if (std::string(option) == "bed_custom_model")
return boost::iequals(ext, ".stl");
return false;
}
// Extension including the dot, or empty when this option may not use it.
std::string bed_asset_extension(const std::string &path, const char *option)
{
const auto slash = path.find_last_of("/\\");
const auto base = slash == std::string::npos ? 0 : slash + 1;
const auto dot = path.find_last_of('.');
if (dot == std::string::npos || dot < base || dot + 1 >= path.size())
return {};
const std::string ext = path.substr(dot);
if (!bed_extension_allowed(option, ext))
return {};
return ext;
}
bool utf8_is_file(const std::string &path)
{
if (path.empty())
return false;
boost::system::error_code ec;
#ifdef _WIN32
// A narrow path is the ANSI code page unless nowide_filesystem() has run.
const std::wstring wide = boost::nowide::widen(path);
if (wide.empty())
return false;
return boost::filesystem::is_regular_file(boost::filesystem::path(wide), ec) && !ec;
#else
return boost::filesystem::is_regular_file(path, ec) && !ec;
#endif
}
std::string bed_asset_dest_utf8(const fs::path &dest)
{
#ifdef _WIN32
return boost::nowide::narrow(dest.wstring());
#else
return dest.string();
#endif
}
// True only for bed/<digits>/<stem><ext> with an extension the bed dialog accepts for this field.
bool accepted_bed_zip_name(const std::string &raw, const BedAssetSlot &slot, const fs::path &bundle_dir,
std::string &zip_name, std::string &folder)
{
const std::string name = zip_slashes(raw);
if (name.find("..") != std::string::npos)
return false;
if (name.size() < 8 || name.compare(0, 4, "bed/") != 0)
return false;
const auto slash = name.find('/', 4);
if (slash == std::string::npos || slash == 4 || name.find('/', slash + 1) != std::string::npos)
return false;
const std::string digits = name.substr(4, slash - 4);
for (unsigned char c : digits) {
if (!std::isdigit(c))
return false;
}
const std::string filename = name.substr(slash + 1);
const std::string ext = bed_asset_extension(filename, slot.option);
if (ext.empty() || filename != std::string(slot.stem) + ext)
return false;
if (!is_path_within_root(name, bundle_dir))
return false;
zip_name = name;
folder = digits;
return true;
}
struct PendingBedAsset {
std::string option;
std::string zip_name;
std::string dest;
std::string printer_key;
fs::path final_path;
fs::path staged;
};
// Validated asset names only. A raw manifest value that fails the check is not skipped later,
// so a value like printer/Name.json cannot hide that preset.
// printer_asset is keyed by printer_config zip entry. A flat (unkeyed) object is not read.
std::vector<PendingBedAsset> pending_bed_assets(const json &bundle_json, const fs::path &bundle_dir,
std::unordered_set<std::string> &skip_names,
const std::unordered_set<std::string> &zip_entries)
{
std::vector<PendingBedAsset> pending;
if (!bundle_json.contains("printer_asset") || !bundle_json["printer_asset"].is_object())
return pending;
const json &assets = bundle_json["printer_asset"];
for (auto it = assets.begin(); it != assets.end(); ++it) {
const std::string printer_key = it.key();
if (zip_entries.count(printer_key) == 0) {
BOOST_LOG_TRIVIAL(warning) << "Printer bundle asset entry is ignored, no matching printer in the zip: " << printer_key;
continue;
}
if (!it.value().is_object())
continue;
const json &per_printer = it.value();
for (const BedAssetSlot &slot : k_bed_asset_slots) {
if (!per_printer.contains(slot.option) || !per_printer[slot.option].is_string())
continue;
const std::string raw = per_printer[slot.option].get<std::string>();
std::string zip_name;
std::string folder;
if (!accepted_bed_zip_name(raw, slot, bundle_dir, zip_name, folder)) {
BOOST_LOG_TRIVIAL(warning) << "Printer bundle asset path is rejected: " << raw;
continue;
}
const std::string filename = zip_name.substr(zip_name.rfind('/') + 1);
const fs::path final_path = fs::absolute(bundle_dir / "bed" / folder / filename);
pending.push_back({slot.option, zip_name, bed_asset_dest_utf8(final_path), printer_key, final_path, {}});
skip_names.insert(zip_name);
}
}
return pending;
}
// Stage under temp_folder. The bundle bed/ directory is not touched until a printer preset keeps the path.
bool stage_bed_asset(mz_zip_archive &zip, PendingBedAsset &asset, const fs::path &temp_folder)
{
size_t size = 0;
void *buf = mz_zip_reader_extract_file_to_heap(&zip, asset.zip_name.c_str(), &size, MZ_ZIP_FLAG_CASE_SENSITIVE);
if (buf == nullptr) {
BOOST_LOG_TRIVIAL(warning) << "Printer bundle asset is missing, skipping " << asset.option << ": " << asset.zip_name;
return false;
}
const std::string filename = asset.zip_name.substr(asset.zip_name.rfind('/') + 1);
asset.staged = temp_folder / "bed" / asset.final_path.parent_path().filename() / filename;
boost::system::error_code ec;
fs::create_directories(asset.staged.parent_path(), ec);
const std::string staged_utf8 = bed_asset_dest_utf8(asset.staged);
bool wrote = false;
if (!ec) {
boost::nowide::ofstream out(staged_utf8, std::ios::binary | std::ios::trunc);
wrote = static_cast<bool>(out);
if (wrote && size > 0)
wrote = static_cast<bool>(out.write(static_cast<const char *>(buf), static_cast<std::streamsize>(size)));
}
mz_free(buf);
if (!wrote) {
BOOST_LOG_TRIVIAL(warning) << "Printer bundle asset could not be written, skipping " << asset.option << ": " << staged_utf8;
fs::remove(asset.staged, ec);
return false;
}
return true;
}
bool install_bed_asset(const PendingBedAsset &asset)
{
boost::system::error_code ec;
fs::create_directories(asset.final_path.parent_path(), ec);
if (!ec)
fs::copy_file(asset.staged, asset.final_path, fs::copy_options::overwrite_existing, ec);
if (ec) {
BOOST_LOG_TRIVIAL(warning) << "Printer bundle asset could not be installed: " << asset.dest;
return false;
}
return true;
}
bool is_pending_bed_asset_entry(const std::string &entry, const std::unordered_set<std::string> &names)
{
return names.count(entry) != 0 || names.count(zip_slashes(entry)) != 0;
}
bool printer_kept_bed_paths(const PresetCollection &printers, const std::map<std::string, std::string> &paths)
{
if (paths.empty())
return false;
for (const Preset &preset : printers.get_presets()) {
for (const auto &entry : paths)
if (preset.config.opt_string(entry.first) == entry.second)
return true;
}
return false;
}
} // namespace
bool append_printer_bed_assets(mz_zip_archive &zip, const DynamicPrintConfig &config, json &bundle_structure,
const std::string &printer_config_entry, int printer_index)
{
if (printer_config_entry.empty() || printer_index < 0)
return true;
json assets = json::object();
for (const BedAssetSlot &slot : k_bed_asset_slots) {
if (!config.has(slot.option))
continue;
const std::string stored = config.opt_string(slot.option);
if (stored.empty())
continue;
if (!utf8_is_file(stored)) {
BOOST_LOG_TRIVIAL(warning) << "Bed asset file is missing, skipping " << slot.option << ": " << stored;
continue;
}
const std::string ext = bed_asset_extension(stored, slot.option);
if (ext.empty()) {
BOOST_LOG_TRIVIAL(warning) << "Bed asset extension is not packable, skipping " << slot.option << ": " << stored;
continue;
}
boost::nowide::ifstream in(stored, std::ios::binary);
if (!in) {
BOOST_LOG_TRIVIAL(warning) << "Bed asset file cannot be read, skipping " << slot.option << ": " << stored;
continue;
}
const std::string bytes((std::istreambuf_iterator<char>(in)), std::istreambuf_iterator<char>());
if (in.bad()) {
BOOST_LOG_TRIVIAL(warning) << "Bed asset file cannot be read, skipping " << slot.option << ": " << stored;
continue;
}
const std::string zip_name = std::string("bed/") + std::to_string(printer_index) + "/" + slot.stem + ext;
const void *data = bytes.empty() ? static_cast<const void *>("") : static_cast<const void *>(bytes.data());
if (mz_zip_writer_add_mem(&zip, zip_name.c_str(), data, bytes.size(), MZ_DEFAULT_COMPRESSION) == MZ_FALSE) {
BOOST_LOG_TRIVIAL(error) << "Failed to add bed asset to printer bundle: " << zip_name;
return false;
}
assets[slot.option] = zip_name;
}
if (!assets.empty())
bundle_structure["printer_asset"][printer_config_entry] = std::move(assets);
return true;
}
// Import presets from UI control
PresetsConfigSubstitutions PresetBundle::import_presets(std::vector<std::string> & files,
std::function<int(std::string const &)> override_confirm,
@@ -2028,44 +1773,14 @@ PresetsConfigSubstitutions PresetBundle::import_presets(std::vector<std::string>
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " No bundle_structure.json found, importing presets into the user preset directory";
}
json bundle_json = json::object();
std::unordered_set<std::string> bed_asset_entries;
std::vector<PendingBedAsset> bed_assets;
std::map<std::string, std::map<std::string, std::string>> bed_paths_by_printer;
bool bed_paths_loaded = false;
if (has_bundle_structure && !bundle_base_dir.empty()) {
try {
boost::nowide::ifstream manifest_in(metadata_path.string());
manifest_in >> bundle_json;
} catch (const std::exception &err) {
BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << " failed to read bundle manifest: " << err.what();
bundle_json = json::object();
}
std::unordered_set<std::string> zip_entries;
const int zip_file_count = mz_zip_reader_get_num_files(&zip_archive);
for (int zi = 0; zi < zip_file_count; ++zi) {
mz_zip_archive_file_stat st;
if (mz_zip_reader_file_stat(&zip_archive, zi, &st))
zip_entries.insert(zip_slashes(st.m_filename));
}
bed_assets = pending_bed_assets(bundle_json, bundle_base_dir, bed_asset_entries, zip_entries);
for (PendingBedAsset &asset : bed_assets)
if (stage_bed_asset(zip_archive, asset, temp_folder))
bed_paths_by_printer[asset.printer_key].emplace(asset.option, asset.dest);
}
// Extract Files
int num_files = mz_zip_reader_get_num_files(&zip_archive);
const std::map<std::string, std::string> no_bed_paths;
for (int i = 0; i < num_files; i++) {
mz_zip_archive_file_stat file_stat;
status = mz_zip_reader_file_stat(&zip_archive, i, &file_stat);
if (status) {
std::string file_name = file_stat.m_filename;
const std::string zip_entry = zip_slashes(file_name);
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " From zip file: " << file << ". Read file name: " << file_stat.m_filename;
if (is_pending_bed_asset_entry(file_name, bed_asset_entries))
continue;
size_t index = file_name.find_last_of("/\\");
if (std::string::npos != index) {
file_name = file_name.substr(index + 1);
@@ -2083,26 +1798,13 @@ PresetsConfigSubstitutions PresetBundle::import_presets(std::vector<std::string>
if (MZ_FALSE == status) {
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " Failed to open target file: " << target_file_path;
} else {
const auto paths_it = bed_paths_by_printer.find(zip_entry);
const std::map<std::string, std::string> &this_bed_paths =
paths_it != bed_paths_by_printer.end() ? paths_it->second : no_bed_paths;
bool is_success = import_json_presets(substitutions, target_file_path, override_confirm, rule, overwrite, result,
has_bundle_structure ? bundle_base_dir.string() : std::string(),
this_bed_paths, &bed_paths_loaded);
has_bundle_structure ? bundle_base_dir.string() : std::string());
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " import target file: " << target_file_path << " import result" << is_success;
}
}
}
// Copy into bed/ only after this import loads a printer that still holds the staged path.
// A preset left from an earlier import must not count: declining this import leaves its files alone.
if (bed_paths_loaded) {
for (const PendingBedAsset &asset : bed_assets) {
if (printer_kept_bed_paths(printers, {{asset.option, asset.dest}}))
install_bed_asset(asset);
}
}
// Set imported_time to current time if not already set
if (metadata.imported_time == 0) {
metadata.imported_time = std::time(nullptr);
@@ -2144,9 +1846,7 @@ bool PresetBundle::import_json_presets(PresetsConfigSubstitutions & s
ForwardCompatibilitySubstitutionRule rule,
int & overwrite,
std::vector<std::string> & result,
const std::string & bundle_dir,
const std::map<std::string, std::string> & bed_asset_paths,
bool * bed_paths_loaded)
const std::string & bundle_dir)
{
try {
DynamicPrintConfig config;
@@ -2210,10 +1910,6 @@ bool PresetBundle::import_json_presets(PresetsConfigSubstitutions & s
if (inherit_preset)
inherits_value = inherit_preset->name; // keep the base_id redo below in sync
}
if (collection == &printers) {
for (const auto &entry : bed_asset_paths)
config.option<ConfigOptionString>(entry.first, true)->value = entry.second;
}
if (inherit_preset) {
new_config = inherit_preset->config;
new_config.apply(std::move(config));
@@ -2231,8 +1927,6 @@ bool PresetBundle::import_json_presets(PresetsConfigSubstitutions & s
new_config.apply(std::move(config));
extend_default_config_length(new_config, true, default_preset.config);
}
if (bed_paths_loaded != nullptr && collection == &printers && !bed_asset_paths.empty())
*bed_paths_loaded = true;
Preset &preset = collection->load_preset(collection->path_from_name(name, inherit_preset == nullptr), preset_name, std::move(new_config), false);
preset.bundle_id = load_origin.bundle_id;
+1 -3
View File
@@ -319,9 +319,7 @@ public:
ForwardCompatibilitySubstitutionRule rule,
int& overwrite,
std::vector<std::string>& result,
const std::string& bundle_dir = "",
const std::map<std::string, std::string> &bed_asset_paths = {},
bool *bed_paths_loaded = nullptr);
const std::string& bundle_dir = "");
void save_user_presets(AppConfig& config, std::map<std::string, std::string>& need_to_delete_list);
void check_and_fix_user_presets_syncinfo(const std::string& user_id);
-2
View File
@@ -1148,8 +1148,6 @@ void PrintConfigDef::init_common_params()
def = this->add("print_host", coString);
def->label = L("Hostname, IP or URL");
// The URL is an example of the format to type, not a link, so it stays in the text.
// xgettext:no-url-check
def->tooltip = L("Orca Slicer can upload G-code files to a printer host. This field should contain "
"the hostname, IP address or URL of the printer host instance. "
"Print host behind HAProxy with basic auth enabled can be accessed by putting the user name and password into the URL "
-20
View File
@@ -1,20 +0,0 @@
#pragma once
#include "miniz_extension.hpp"
#include <miniz.h>
#include <nlohmann/json_fwd.hpp>
#include <string>
namespace Slic3r {
class DynamicPrintConfig;
// Not on PresetBundle.hpp: miniz.h's zlib-compat macros rename GUI methods (GLTexture::Compressor::compress).
// printer_config_entry is the zip name also pushed onto bundle_structure["printer_config"].
// printer_index is that entry's 0-based index in the exported printer_config list.
bool append_printer_bed_assets(mz_zip_archive &zip, const DynamicPrintConfig &config, nlohmann::json &bundle_structure,
const std::string &printer_config_entry, int printer_index);
} // namespace Slic3r
+2
View File
@@ -571,6 +571,8 @@ set(SLIC3R_GUI_SOURCES
GUI/UserNotification.hpp
GUI/UVEditorCanvas.cpp
GUI/UVEditorCanvas.hpp
GUI/WebDownPluginDlg.cpp
GUI/WebDownPluginDlg.hpp
GUI/WebGuideDialog.cpp
GUI/WebGuideDialog.hpp
GUI/WebUserLoginDialog.cpp

Some files were not shown because too many files have changed in this diff Show More