Merge remote-tracking branch 'remote/master' into SoftFever
# Conflicts: # src/libslic3r/Preset.cpp
|
@ -8,7 +8,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2022-09-01 09:20+0800\n"
|
"POT-Creation-Date: 2022-09-09 11:50+0800\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
@ -810,7 +810,7 @@ msgstr ""
|
||||||
msgid "Reduce Triangles"
|
msgid "Reduce Triangles"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Per object edit"
|
msgid "Edit in Parameter Table"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Edit print parameters for a single object"
|
msgid "Edit print parameters for a single object"
|
||||||
|
@ -1009,7 +1009,7 @@ msgstr ""
|
||||||
msgid "Auto Brim"
|
msgid "Auto Brim"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Inner wall speed"
|
msgid "Outer wall speed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Plate"
|
msgid "Plate"
|
||||||
|
@ -1213,9 +1213,6 @@ msgstr ""
|
||||||
msgid "Unkown Error."
|
msgid "Unkown Error."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Please Fill Task Report."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Sending print configuration"
|
msgid "Sending print configuration"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -1298,7 +1295,7 @@ msgid ""
|
||||||
"the corresponding code comments."
|
"the corresponding code comments."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "AMSMaterialsSetting"
|
msgid "AMS Materials Setting"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Colour"
|
msgid "Colour"
|
||||||
|
@ -1383,6 +1380,17 @@ msgstr ""
|
||||||
msgid "File"
|
msgid "File"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Please home all axes (click "
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
") to locate the toolhead's position. This prevents device moving beyond the "
|
||||||
|
"printable boundary and causing equipment wear."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Go Home"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"A error occurred. Maybe memory of system is not enough or it's a bug of the "
|
"A error occurred. Maybe memory of system is not enough or it's a bug of the "
|
||||||
"program"
|
"program"
|
||||||
|
@ -2055,13 +2063,10 @@ msgstr ""
|
||||||
msgid "Invalid input."
|
msgid "Invalid input."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Enter a search term"
|
msgid "New Window"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Online"
|
msgid "Open a new window"
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Offline"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Application is closing"
|
msgid "Application is closing"
|
||||||
|
@ -2085,9 +2090,6 @@ msgstr ""
|
||||||
msgid "Project"
|
msgid "Project"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Debug"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Slice"
|
msgid "Slice"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -2125,9 +2127,6 @@ msgstr ""
|
||||||
msgid "&About %s"
|
msgid "&About %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Show Log"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Open Network Test"
|
msgid "Open Network Test"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -2172,6 +2171,9 @@ msgstr ""
|
||||||
msgid "Right View"
|
msgid "Right View"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Start a new window"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "New Project"
|
msgid "New Project"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -2298,6 +2300,12 @@ msgstr ""
|
||||||
msgid "Use Orthogonal View"
|
msgid "Use Orthogonal View"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Show &Labels"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Show object labels in 3D scene"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Preferences"
|
msgid "Preferences"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -2461,19 +2469,20 @@ msgstr ""
|
||||||
msgid "Choose save directory"
|
msgid "Choose save directory"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Waiting"
|
msgid "Download waiting..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Retry"
|
msgid "Retry"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Failed"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Open"
|
msgid "Open"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Finished"
|
msgid "Download finished"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#, possible-c-format, possible-boost-format
|
||||||
|
msgid "Downloading %d%%..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Speed:"
|
msgid "Speed:"
|
||||||
|
@ -2548,6 +2557,9 @@ msgstr ""
|
||||||
msgid "Downloading..."
|
msgid "Downloading..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "This only takes effect during printing"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Silent"
|
msgid "Silent"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -3375,6 +3387,12 @@ msgstr ""
|
||||||
msgid "Simply switch to \"%1%\""
|
msgid "Simply switch to \"%1%\""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Online"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Offline"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "My Device"
|
msgid "My Device"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -4005,6 +4023,18 @@ msgstr ""
|
||||||
msgid "Global shortcuts"
|
msgid "Global shortcuts"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Rotate View"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Pan View"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Mouse wheel"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Zoom View"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Auto orientates selected objects or all objects.If there are selected "
|
"Auto orientates selected objects or all objects.If there are selected "
|
||||||
"objects, it just orientates the selected ones.Otherwise, it will orientates "
|
"objects, it just orientates the selected ones.Otherwise, it will orientates "
|
||||||
|
@ -4204,6 +4234,9 @@ msgstr ""
|
||||||
msgid "New version of Bambu Studio"
|
msgid "New version of Bambu Studio"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Don't remind me of this version again"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Saving objects into the 3mf failed."
|
msgid "Saving objects into the 3mf failed."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -5661,12 +5694,20 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"If enabled, a timelapse video will be generated for each print. After each "
|
"If smooth or traditional mode is selected, a timelapse video will be "
|
||||||
"layer is printed, the toolhead will move to the excess chute, and then a "
|
"generated for each print. After each layer is printed, a snapshot is taken "
|
||||||
"snapshot is taken with the chamber camera. All of these snapshots are "
|
"with the chamber camera. All of these snapshots are composed into a "
|
||||||
"composed into a timelapse video when printing completes. Since the melt "
|
"timelapse video when printing completes. If smooth mode is selected, the "
|
||||||
"filament may leak from the nozzle during the process of taking a snapshot, "
|
"toolhead will move to the excess chute after each layer is printed and then "
|
||||||
"prime tower is required for nozzle priming."
|
"take a snapshot. Since the melt filament may leak from the nozzle during the "
|
||||||
|
"process of taking a snapshot, prime tower is required for smooth mode to "
|
||||||
|
"wipe nozzle."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Smooth"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Traditional"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Temperature variation"
|
msgid "Temperature variation"
|
||||||
|
@ -5681,6 +5722,15 @@ msgstr ""
|
||||||
msgid "Start G-code when start the printing of this filament"
|
msgid "Start G-code when start the printing of this filament"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Slice gap closing radius"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Cracks smaller than 2x gap closing radius are being filled during the "
|
||||||
|
"triangle mesh slicing. The gap closing operation may reduce the final print "
|
||||||
|
"resolution, therefore it is advisable to keep the value reasonably low."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Enable support"
|
msgid "Enable support"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: Bambu Studio\n"
|
"Project-Id-Version: Bambu Studio\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2022-09-01 09:20+0800\n"
|
"POT-Creation-Date: 2022-09-09 11:50+0800\n"
|
||||||
"Language: en\n"
|
"Language: en\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
@ -820,8 +820,8 @@ msgstr "Clone"
|
||||||
msgid "Reduce Triangles"
|
msgid "Reduce Triangles"
|
||||||
msgstr "Reduce Triangles"
|
msgstr "Reduce Triangles"
|
||||||
|
|
||||||
msgid "Per object edit"
|
msgid "Edit in Parameter Table"
|
||||||
msgstr "Per Object Edit"
|
msgstr ""
|
||||||
|
|
||||||
msgid "Edit print parameters for a single object"
|
msgid "Edit print parameters for a single object"
|
||||||
msgstr "Edit print parameters for a single object"
|
msgstr "Edit print parameters for a single object"
|
||||||
|
@ -1024,8 +1024,8 @@ msgstr "Infill density(%)"
|
||||||
msgid "Auto Brim"
|
msgid "Auto Brim"
|
||||||
msgstr "Auto Brim"
|
msgstr "Auto Brim"
|
||||||
|
|
||||||
msgid "Inner wall speed"
|
msgid "Outer wall speed"
|
||||||
msgstr "Inner wall speed"
|
msgstr ""
|
||||||
|
|
||||||
msgid "Plate"
|
msgid "Plate"
|
||||||
msgstr "Plate"
|
msgstr "Plate"
|
||||||
|
@ -1246,9 +1246,6 @@ msgstr ""
|
||||||
msgid "Unkown Error."
|
msgid "Unkown Error."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Please Fill Task Report."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Sending print configuration"
|
msgid "Sending print configuration"
|
||||||
msgstr "Sending print configuration"
|
msgstr "Sending print configuration"
|
||||||
|
|
||||||
|
@ -1335,7 +1332,7 @@ msgid ""
|
||||||
"the corresponding code comments."
|
"the corresponding code comments."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "AMSMaterialsSetting"
|
msgid "AMS Materials Setting"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Colour"
|
msgid "Colour"
|
||||||
|
@ -1434,6 +1431,17 @@ msgstr ""
|
||||||
msgid "File"
|
msgid "File"
|
||||||
msgstr "File"
|
msgstr "File"
|
||||||
|
|
||||||
|
msgid "Please home all axes (click "
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
") to locate the toolhead's position. This prevents device moving beyond the "
|
||||||
|
"printable boundary and causing equipment wear."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Go Home"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"A error occurred. Maybe memory of system is not enough or it's a bug of the "
|
"A error occurred. Maybe memory of system is not enough or it's a bug of the "
|
||||||
"program"
|
"program"
|
||||||
|
@ -2176,14 +2184,11 @@ msgstr ""
|
||||||
msgid "Invalid input."
|
msgid "Invalid input."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Enter a search term"
|
msgid "New Window"
|
||||||
msgstr "Enter a search term"
|
msgstr ""
|
||||||
|
|
||||||
msgid "Online"
|
msgid "Open a new window"
|
||||||
msgstr "Online"
|
msgstr ""
|
||||||
|
|
||||||
msgid "Offline"
|
|
||||||
msgstr "Offline"
|
|
||||||
|
|
||||||
msgid "Application is closing"
|
msgid "Application is closing"
|
||||||
msgstr "Closing application"
|
msgstr "Closing application"
|
||||||
|
@ -2206,9 +2211,6 @@ msgstr "Device"
|
||||||
msgid "Project"
|
msgid "Project"
|
||||||
msgstr "Project"
|
msgstr "Project"
|
||||||
|
|
||||||
msgid "Debug"
|
|
||||||
msgstr "Debug"
|
|
||||||
|
|
||||||
msgid "Slice"
|
msgid "Slice"
|
||||||
msgstr "Slice"
|
msgstr "Slice"
|
||||||
|
|
||||||
|
@ -2246,9 +2248,6 @@ msgstr "Check for Updates"
|
||||||
msgid "&About %s"
|
msgid "&About %s"
|
||||||
msgstr "&About %s"
|
msgstr "&About %s"
|
||||||
|
|
||||||
msgid "Show Log"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Open Network Test"
|
msgid "Open Network Test"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -2293,6 +2292,9 @@ msgstr "Right"
|
||||||
msgid "Right View"
|
msgid "Right View"
|
||||||
msgstr "Right View"
|
msgstr "Right View"
|
||||||
|
|
||||||
|
msgid "Start a new window"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "New Project"
|
msgid "New Project"
|
||||||
msgstr "New Project"
|
msgstr "New Project"
|
||||||
|
|
||||||
|
@ -2419,6 +2421,12 @@ msgstr "Use Perspective View"
|
||||||
msgid "Use Orthogonal View"
|
msgid "Use Orthogonal View"
|
||||||
msgstr "Use Orthogonal View"
|
msgstr "Use Orthogonal View"
|
||||||
|
|
||||||
|
msgid "Show &Labels"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Show object labels in 3D scene"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Preferences"
|
msgid "Preferences"
|
||||||
msgstr "Preferences"
|
msgstr "Preferences"
|
||||||
|
|
||||||
|
@ -2483,8 +2491,10 @@ msgstr ""
|
||||||
#, c-format, boost-format
|
#, c-format, boost-format
|
||||||
msgid "There is %d config exported. (Only non-system configs)"
|
msgid "There is %d config exported. (Only non-system configs)"
|
||||||
msgid_plural "There are %d configs exported. (Only non-system configs)"
|
msgid_plural "There are %d configs exported. (Only non-system configs)"
|
||||||
msgstr[0] "There is %d preset exported. (Only non-system and currently used presets)"
|
msgstr[0] ""
|
||||||
msgstr[1] "There are %d presets exported. (Only non-system and currently used presets)"
|
"There is %d preset exported. (Only non-system and currently used presets)"
|
||||||
|
msgstr[1] ""
|
||||||
|
"There are %d presets exported. (Only non-system and currently used presets)"
|
||||||
|
|
||||||
msgid "Export result"
|
msgid "Export result"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -2496,8 +2506,10 @@ msgstr ""
|
||||||
msgid "There is %d config imported. (Only non-system and compatible configs)"
|
msgid "There is %d config imported. (Only non-system and compatible configs)"
|
||||||
msgid_plural ""
|
msgid_plural ""
|
||||||
"There are %d configs imported. (Only non-system and compatible configs)"
|
"There are %d configs imported. (Only non-system and compatible configs)"
|
||||||
msgstr[0] "There is %d preset imported. (Only non-system and compatible presets)"
|
msgstr[0] ""
|
||||||
msgstr[1] "There are %d presets imported. (Only non-system and compatible presets)"
|
"There is %d preset imported. (Only non-system and compatible presets)"
|
||||||
|
msgstr[1] ""
|
||||||
|
"There are %d presets imported. (Only non-system and compatible presets)"
|
||||||
|
|
||||||
msgid "Import result"
|
msgid "Import result"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -2582,20 +2594,21 @@ msgstr ""
|
||||||
msgid "Choose save directory"
|
msgid "Choose save directory"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Waiting"
|
msgid "Download waiting..."
|
||||||
msgstr "Waiting"
|
|
||||||
|
|
||||||
msgid "Retry"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Failed"
|
msgid "Retry"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Open"
|
msgid "Open"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Finished"
|
msgid "Download finished"
|
||||||
msgstr "Finished"
|
msgstr ""
|
||||||
|
|
||||||
|
#, c-format, boost-format
|
||||||
|
msgid "Downloading %d%%..."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Speed:"
|
msgid "Speed:"
|
||||||
msgstr "Speed:"
|
msgstr "Speed:"
|
||||||
|
@ -2669,6 +2682,9 @@ msgstr "Printing list"
|
||||||
msgid "Downloading..."
|
msgid "Downloading..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "This only takes effect during printing"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Silent"
|
msgid "Silent"
|
||||||
msgstr "Silent"
|
msgstr "Silent"
|
||||||
|
|
||||||
|
@ -3516,6 +3532,12 @@ msgstr "For \"%1%\", add \"%2%\" as a new preset"
|
||||||
msgid "Simply switch to \"%1%\""
|
msgid "Simply switch to \"%1%\""
|
||||||
msgstr "Simply switch to \"%1%\""
|
msgstr "Simply switch to \"%1%\""
|
||||||
|
|
||||||
|
msgid "Online"
|
||||||
|
msgstr "Online"
|
||||||
|
|
||||||
|
msgid "Offline"
|
||||||
|
msgstr "Offline"
|
||||||
|
|
||||||
msgid "My Device"
|
msgid "My Device"
|
||||||
msgstr "My Device"
|
msgstr "My Device"
|
||||||
|
|
||||||
|
@ -4188,6 +4210,18 @@ msgstr "Show keyboard shortcuts list"
|
||||||
msgid "Global shortcuts"
|
msgid "Global shortcuts"
|
||||||
msgstr "Global shortcuts"
|
msgstr "Global shortcuts"
|
||||||
|
|
||||||
|
msgid "Rotate View"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Pan View"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Mouse wheel"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Zoom View"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Auto orientates selected objects or all objects.If there are selected "
|
"Auto orientates selected objects or all objects.If there are selected "
|
||||||
"objects, it just orientates the selected ones.Otherwise, it will orientates "
|
"objects, it just orientates the selected ones.Otherwise, it will orientates "
|
||||||
|
@ -4390,6 +4424,9 @@ msgstr ""
|
||||||
msgid "New version of Bambu Studio"
|
msgid "New version of Bambu Studio"
|
||||||
msgstr "New version of Bambu Studio"
|
msgstr "New version of Bambu Studio"
|
||||||
|
|
||||||
|
msgid "Don't remind me of this version again"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Saving objects into the 3mf failed."
|
msgid "Saving objects into the 3mf failed."
|
||||||
msgstr "Saving objects into the 3mf failed."
|
msgstr "Saving objects into the 3mf failed."
|
||||||
|
|
||||||
|
@ -6057,12 +6094,20 @@ msgstr ""
|
||||||
"The final generated model has no seam."
|
"The final generated model has no seam."
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"If enabled, a timelapse video will be generated for each print. After each "
|
"If smooth or traditional mode is selected, a timelapse video will be "
|
||||||
"layer is printed, the toolhead will move to the excess chute, and then a "
|
"generated for each print. After each layer is printed, a snapshot is taken "
|
||||||
"snapshot is taken with the chamber camera. All of these snapshots are "
|
"with the chamber camera. All of these snapshots are composed into a "
|
||||||
"composed into a timelapse video when printing completes. Since the melt "
|
"timelapse video when printing completes. If smooth mode is selected, the "
|
||||||
"filament may leak from the nozzle during the process of taking a snapshot, "
|
"toolhead will move to the excess chute after each layer is printed and then "
|
||||||
"prime tower is required for nozzle priming."
|
"take a snapshot. Since the melt filament may leak from the nozzle during the "
|
||||||
|
"process of taking a snapshot, prime tower is required for smooth mode to "
|
||||||
|
"wipe nozzle."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Smooth"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Traditional"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Temperature variation"
|
msgid "Temperature variation"
|
||||||
|
@ -6077,6 +6122,15 @@ msgstr "G-code added when starting a print"
|
||||||
msgid "Start G-code when start the printing of this filament"
|
msgid "Start G-code when start the printing of this filament"
|
||||||
msgstr "G-code added when the printer starts using this filament"
|
msgstr "G-code added when the printer starts using this filament"
|
||||||
|
|
||||||
|
msgid "Slice gap closing radius"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Cracks smaller than 2x gap closing radius are being filled during the "
|
||||||
|
"triangle mesh slicing. The gap closing operation may reduce the final print "
|
||||||
|
"resolution, therefore it is advisable to keep the value reasonably low."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Enable support"
|
msgid "Enable support"
|
||||||
msgstr "Enable support"
|
msgstr "Enable support"
|
||||||
|
|
||||||
|
@ -6627,6 +6681,24 @@ msgstr "Support: fix holes at layer %d"
|
||||||
msgid "Support: propagate branches at layer %d"
|
msgid "Support: propagate branches at layer %d"
|
||||||
msgstr "Support: propagate branches at layer %d"
|
msgstr "Support: propagate branches at layer %d"
|
||||||
|
|
||||||
|
#~ msgid "Enter a search term"
|
||||||
|
#~ msgstr "Enter a search term"
|
||||||
|
|
||||||
|
#~ msgid "Debug"
|
||||||
|
#~ msgstr "Debug"
|
||||||
|
|
||||||
|
#~ msgid "Waiting"
|
||||||
|
#~ msgstr "Waiting"
|
||||||
|
|
||||||
|
#~ msgid "Finished"
|
||||||
|
#~ msgstr "Finished"
|
||||||
|
|
||||||
|
#~ msgid "Per object edit"
|
||||||
|
#~ msgstr "Per Object Edit"
|
||||||
|
|
||||||
|
#~ msgid "Inner wall speed"
|
||||||
|
#~ msgstr "Inner wall speed"
|
||||||
|
|
||||||
#~ msgid "the 3mf is not compatible, load geometry data only!"
|
#~ msgid "the 3mf is not compatible, load geometry data only!"
|
||||||
#~ msgstr "The 3mf is not compatible, loading geometry data only!"
|
#~ msgstr "The 3mf is not compatible, loading geometry data only!"
|
||||||
|
|
||||||
|
|
|
@ -43,6 +43,7 @@ src/slic3r/GUI/AMSMappingPopup.cpp
|
||||||
src/slic3r/GUI/AMSSetting.cpp
|
src/slic3r/GUI/AMSSetting.cpp
|
||||||
src/slic3r/GUI/BBLTopbar.cpp
|
src/slic3r/GUI/BBLTopbar.cpp
|
||||||
src/slic3r/GUI/DownloadProgressDialog.cpp
|
src/slic3r/GUI/DownloadProgressDialog.cpp
|
||||||
|
src/slic3r/GUI/RecenterDialog.cpp
|
||||||
src/slic3r/GUI/BackgroundSlicingProcess.cpp
|
src/slic3r/GUI/BackgroundSlicingProcess.cpp
|
||||||
src/slic3r/GUI/BedShapeDialog.cpp
|
src/slic3r/GUI/BedShapeDialog.cpp
|
||||||
src/slic3r/GUI/BedShapeDialog.hpp
|
src/slic3r/GUI/BedShapeDialog.hpp
|
||||||
|
|
|
@ -6,8 +6,8 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: Slic3rPE\n"
|
"Project-Id-Version: Slic3rPE\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2022-09-01 09:20+0800\n"
|
"POT-Creation-Date: 2022-09-09 11:50+0800\n"
|
||||||
"PO-Revision-Date: 2022-08-05 11:49+0800\n"
|
"PO-Revision-Date: 2022-09-05 14:22+0800\n"
|
||||||
"Last-Translator: Jiang Yue <maze1024@gmail.com>\n"
|
"Last-Translator: Jiang Yue <maze1024@gmail.com>\n"
|
||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
"Language: zh_CN\n"
|
"Language: zh_CN\n"
|
||||||
|
@ -815,8 +815,8 @@ msgstr "克隆"
|
||||||
msgid "Reduce Triangles"
|
msgid "Reduce Triangles"
|
||||||
msgstr "简化三角形"
|
msgstr "简化三角形"
|
||||||
|
|
||||||
msgid "Per object edit"
|
msgid "Edit in Parameter Table"
|
||||||
msgstr "编辑单个对象"
|
msgstr "在参数表格中编辑"
|
||||||
|
|
||||||
msgid "Edit print parameters for a single object"
|
msgid "Edit print parameters for a single object"
|
||||||
msgstr "编辑单个对象的打印参数"
|
msgstr "编辑单个对象的打印参数"
|
||||||
|
@ -1009,8 +1009,8 @@ msgstr "填充密度(%)"
|
||||||
msgid "Auto Brim"
|
msgid "Auto Brim"
|
||||||
msgstr "自动Brim"
|
msgstr "自动Brim"
|
||||||
|
|
||||||
msgid "Inner wall speed"
|
msgid "Outer wall speed"
|
||||||
msgstr "内墙速度"
|
msgstr ""
|
||||||
|
|
||||||
msgid "Plate"
|
msgid "Plate"
|
||||||
msgstr "盘"
|
msgstr "盘"
|
||||||
|
@ -1221,9 +1221,6 @@ msgstr "服务不可用"
|
||||||
msgid "Unkown Error."
|
msgid "Unkown Error."
|
||||||
msgstr "未知错误"
|
msgstr "未知错误"
|
||||||
|
|
||||||
msgid "Please Fill Task Report."
|
|
||||||
msgstr "请填写打印报告"
|
|
||||||
|
|
||||||
msgid "Sending print configuration"
|
msgid "Sending print configuration"
|
||||||
msgstr "正在发送打印配置"
|
msgstr "正在发送打印配置"
|
||||||
|
|
||||||
|
@ -1312,8 +1309,8 @@ msgstr ""
|
||||||
"软件中的很多部分都来自于社区贡献,因此,我们无法逐一列出他们,相反的,他们将"
|
"软件中的很多部分都来自于社区贡献,因此,我们无法逐一列出他们,相反的,他们将"
|
||||||
"被注释于相应的代码中。"
|
"被注释于相应的代码中。"
|
||||||
|
|
||||||
msgid "AMSMaterialsSetting"
|
msgid "AMS Materials Setting"
|
||||||
msgstr ""
|
msgstr "AMS 材料设置"
|
||||||
|
|
||||||
msgid "Colour"
|
msgid "Colour"
|
||||||
msgstr "颜色"
|
msgstr "颜色"
|
||||||
|
@ -1350,16 +1347,16 @@ msgid ""
|
||||||
msgstr "仅允许选择放入同种材质耗材丝的AMS槽位"
|
msgstr "仅允许选择放入同种材质耗材丝的AMS槽位"
|
||||||
|
|
||||||
msgid "Enable AMS"
|
msgid "Enable AMS"
|
||||||
msgstr ""
|
msgstr "启用AMS"
|
||||||
|
|
||||||
msgid "Print with filaments in the AMS"
|
msgid "Print with filaments in the AMS"
|
||||||
msgstr ""
|
msgstr "采用AMS里的材料打印"
|
||||||
|
|
||||||
msgid "Disable AMS"
|
msgid "Disable AMS"
|
||||||
msgstr ""
|
msgstr "不启用AMS"
|
||||||
|
|
||||||
msgid "Print with the filament mounted on the back of chassis"
|
msgid "Print with the filament mounted on the back of chassis"
|
||||||
msgstr ""
|
msgstr "使用机箱背后挂载的材料打印"
|
||||||
|
|
||||||
msgid "Insertion update"
|
msgid "Insertion update"
|
||||||
msgstr "插入料时更新"
|
msgstr "插入料时更新"
|
||||||
|
@ -1405,6 +1402,17 @@ msgstr "AMS不会在启动时自动读取耗材丝信息。它会使用上次关
|
||||||
msgid "File"
|
msgid "File"
|
||||||
msgstr "文件"
|
msgstr "文件"
|
||||||
|
|
||||||
|
msgid "Please home all axes (click "
|
||||||
|
msgstr "请先执行回原点(点击"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
") to locate the toolhead's position. This prevents device moving beyond the "
|
||||||
|
"printable boundary and causing equipment wear."
|
||||||
|
msgstr ")操作以定位当前工具头位置,以防止轴移动时超出边界造成设备磨损"
|
||||||
|
|
||||||
|
msgid "Go Home"
|
||||||
|
msgstr "回原点"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"A error occurred. Maybe memory of system is not enough or it's a bug of the "
|
"A error occurred. Maybe memory of system is not enough or it's a bug of the "
|
||||||
"program"
|
"program"
|
||||||
|
@ -2128,14 +2136,11 @@ msgstr ""
|
||||||
msgid "Invalid input."
|
msgid "Invalid input."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Enter a search term"
|
msgid "New Window"
|
||||||
msgstr "输入搜索内容"
|
msgstr ""
|
||||||
|
|
||||||
msgid "Online"
|
msgid "Open a new window"
|
||||||
msgstr "在线"
|
msgstr ""
|
||||||
|
|
||||||
msgid "Offline"
|
|
||||||
msgstr "离线"
|
|
||||||
|
|
||||||
msgid "Application is closing"
|
msgid "Application is closing"
|
||||||
msgstr "正在关闭应用程序"
|
msgstr "正在关闭应用程序"
|
||||||
|
@ -2158,9 +2163,6 @@ msgstr "设备"
|
||||||
msgid "Project"
|
msgid "Project"
|
||||||
msgstr "项目"
|
msgstr "项目"
|
||||||
|
|
||||||
msgid "Debug"
|
|
||||||
msgstr "调试"
|
|
||||||
|
|
||||||
msgid "Slice"
|
msgid "Slice"
|
||||||
msgstr "切片"
|
msgstr "切片"
|
||||||
|
|
||||||
|
@ -2198,9 +2200,6 @@ msgstr "检查新版本"
|
||||||
msgid "&About %s"
|
msgid "&About %s"
|
||||||
msgstr "关于 %s"
|
msgstr "关于 %s"
|
||||||
|
|
||||||
msgid "Show Log"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Open Network Test"
|
msgid "Open Network Test"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -2245,6 +2244,9 @@ msgstr "右面"
|
||||||
msgid "Right View"
|
msgid "Right View"
|
||||||
msgstr "右视图"
|
msgstr "右视图"
|
||||||
|
|
||||||
|
msgid "Start a new window"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "New Project"
|
msgid "New Project"
|
||||||
msgstr "新建项目"
|
msgstr "新建项目"
|
||||||
|
|
||||||
|
@ -2371,6 +2373,12 @@ msgstr "使用透视视角"
|
||||||
msgid "Use Orthogonal View"
|
msgid "Use Orthogonal View"
|
||||||
msgstr "使用正交视角"
|
msgstr "使用正交视角"
|
||||||
|
|
||||||
|
msgid "Show &Labels"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Show object labels in 3D scene"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Preferences"
|
msgid "Preferences"
|
||||||
msgstr "偏好设置"
|
msgstr "偏好设置"
|
||||||
|
|
||||||
|
@ -2537,20 +2545,21 @@ msgstr "文件列表为空"
|
||||||
msgid "Choose save directory"
|
msgid "Choose save directory"
|
||||||
msgstr "选择保存目录"
|
msgstr "选择保存目录"
|
||||||
|
|
||||||
msgid "Waiting"
|
msgid "Download waiting..."
|
||||||
msgstr "等待中"
|
msgstr "正在下载中..."
|
||||||
|
|
||||||
msgid "Retry"
|
msgid "Retry"
|
||||||
msgstr "重试"
|
msgstr "重试"
|
||||||
|
|
||||||
msgid "Failed"
|
|
||||||
msgstr "失败"
|
|
||||||
|
|
||||||
msgid "Open"
|
msgid "Open"
|
||||||
msgstr "打开"
|
msgstr "打开"
|
||||||
|
|
||||||
msgid "Finished"
|
msgid "Download finished"
|
||||||
msgstr "完成"
|
msgstr "下载完成"
|
||||||
|
|
||||||
|
#, c-format, boost-format
|
||||||
|
msgid "Downloading %d%%..."
|
||||||
|
msgstr "下载中 %d%%..."
|
||||||
|
|
||||||
msgid "Speed:"
|
msgid "Speed:"
|
||||||
msgstr "速度:"
|
msgstr "速度:"
|
||||||
|
@ -2624,6 +2633,9 @@ msgstr "项目切片"
|
||||||
msgid "Downloading..."
|
msgid "Downloading..."
|
||||||
msgstr "下载中..."
|
msgstr "下载中..."
|
||||||
|
|
||||||
|
msgid "This only takes effect during printing"
|
||||||
|
msgstr "仅在打印过程中生效"
|
||||||
|
|
||||||
msgid "Silent"
|
msgid "Silent"
|
||||||
msgstr "静音"
|
msgstr "静音"
|
||||||
|
|
||||||
|
@ -3455,6 +3467,12 @@ msgstr "为“%1%”,添加“%2%”为一个新预设"
|
||||||
msgid "Simply switch to \"%1%\""
|
msgid "Simply switch to \"%1%\""
|
||||||
msgstr "直接切换到“%1%”"
|
msgstr "直接切换到“%1%”"
|
||||||
|
|
||||||
|
msgid "Online"
|
||||||
|
msgstr "在线"
|
||||||
|
|
||||||
|
msgid "Offline"
|
||||||
|
msgstr "离线"
|
||||||
|
|
||||||
msgid "My Device"
|
msgid "My Device"
|
||||||
msgstr "我的设备"
|
msgstr "我的设备"
|
||||||
|
|
||||||
|
@ -4106,6 +4124,18 @@ msgstr "显示键盘快捷键列表"
|
||||||
msgid "Global shortcuts"
|
msgid "Global shortcuts"
|
||||||
msgstr "全局快捷键"
|
msgstr "全局快捷键"
|
||||||
|
|
||||||
|
msgid "Rotate View"
|
||||||
|
msgstr "旋转视角"
|
||||||
|
|
||||||
|
msgid "Pan View"
|
||||||
|
msgstr "移动视角"
|
||||||
|
|
||||||
|
msgid "Mouse wheel"
|
||||||
|
msgstr "鼠标滚轮"
|
||||||
|
|
||||||
|
msgid "Zoom View"
|
||||||
|
msgstr "缩放视角"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Auto orientates selected objects or all objects.If there are selected "
|
"Auto orientates selected objects or all objects.If there are selected "
|
||||||
"objects, it just orientates the selected ones.Otherwise, it will orientates "
|
"objects, it just orientates the selected ones.Otherwise, it will orientates "
|
||||||
|
@ -4298,7 +4328,7 @@ msgid "Shift+Mouse wheel"
|
||||||
msgstr "Shift+鼠标滚轮"
|
msgstr "Shift+鼠标滚轮"
|
||||||
|
|
||||||
msgid "Release Note"
|
msgid "Release Note"
|
||||||
msgstr ""
|
msgstr "更新说明"
|
||||||
|
|
||||||
#, c-format, boost-format
|
#, c-format, boost-format
|
||||||
msgid "version %s update information :"
|
msgid "version %s update information :"
|
||||||
|
@ -4307,6 +4337,9 @@ msgstr "版本 %s 更新信息"
|
||||||
msgid "New version of Bambu Studio"
|
msgid "New version of Bambu Studio"
|
||||||
msgstr "新版本的Bambu Studio"
|
msgstr "新版本的Bambu Studio"
|
||||||
|
|
||||||
|
msgid "Don't remind me of this version again"
|
||||||
|
msgstr "此版本不再提示"
|
||||||
|
|
||||||
msgid "Saving objects into the 3mf failed."
|
msgid "Saving objects into the 3mf failed."
|
||||||
msgstr "保存对象到3mf失败。"
|
msgstr "保存对象到3mf失败。"
|
||||||
|
|
||||||
|
@ -5834,17 +5867,25 @@ msgstr ""
|
||||||
"印。最后生成的打印件没有接缝。"
|
"印。最后生成的打印件没有接缝。"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"If enabled, a timelapse video will be generated for each print. After each "
|
"If smooth or traditional mode is selected, a timelapse video will be "
|
||||||
"layer is printed, the toolhead will move to the excess chute, and then a "
|
"generated for each print. After each layer is printed, a snapshot is taken "
|
||||||
"snapshot is taken with the chamber camera. All of these snapshots are "
|
"with the chamber camera. All of these snapshots are composed into a "
|
||||||
"composed into a timelapse video when printing completes. Since the melt "
|
"timelapse video when printing completes. If smooth mode is selected, the "
|
||||||
"filament may leak from the nozzle during the process of taking a snapshot, "
|
"toolhead will move to the excess chute after each layer is printed and then "
|
||||||
"prime tower is required for nozzle priming."
|
"take a snapshot. Since the melt filament may leak from the nozzle during the "
|
||||||
|
"process of taking a snapshot, prime tower is required for smooth mode to "
|
||||||
|
"wipe nozzle."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"如果启用延时摄影,将在每次打印时生成延时摄影视频。打印完每层后,工具头将移动"
|
"如果启用平滑模式或者传统模式,将在每次打印时生成延时摄影视频。打印完每层后,"
|
||||||
"到吐料槽,然后用内置相机拍摄快照。打印完成后,所有这些快照会组合成一个延时视"
|
"将用内置相机拍摄快照。打印完成后,所有这些快照会组合成一个延时视频。如果启用"
|
||||||
"频。由于在拍摄快照的过程中熔丝可能会从喷嘴中泄漏,因此需要使用擦拭塔进行喷嘴"
|
"平滑模式,打印完每层后,工具头将移动到吐料槽,然后拍摄快照。由于平滑模式在拍"
|
||||||
"擦拭。"
|
"摄快照的过程中熔丝可能会从喷嘴中泄漏,因此需要使用擦拭塔进行喷嘴擦拭。"
|
||||||
|
|
||||||
|
msgid "Smooth"
|
||||||
|
msgstr "平滑模式"
|
||||||
|
|
||||||
|
msgid "Traditional"
|
||||||
|
msgstr "传统模式"
|
||||||
|
|
||||||
msgid "Temperature variation"
|
msgid "Temperature variation"
|
||||||
msgstr "软化温度"
|
msgstr "软化温度"
|
||||||
|
@ -5858,6 +5899,17 @@ msgstr "整个打印开始前的起始G-code"
|
||||||
msgid "Start G-code when start the printing of this filament"
|
msgid "Start G-code when start the printing of this filament"
|
||||||
msgstr "开始使用这个耗材丝打印的起始G-code"
|
msgstr "开始使用这个耗材丝打印的起始G-code"
|
||||||
|
|
||||||
|
msgid "Slice gap closing radius"
|
||||||
|
msgstr "切片间隙闭合半径"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Cracks smaller than 2x gap closing radius are being filled during the "
|
||||||
|
"triangle mesh slicing. The gap closing operation may reduce the final print "
|
||||||
|
"resolution, therefore it is advisable to keep the value reasonably low."
|
||||||
|
msgstr ""
|
||||||
|
"在三角形网格切片过程中,小于2倍间隙闭合半径的裂纹将被填充。间隙闭合操作可能会"
|
||||||
|
"降低最终打印分辨率,因此建议降值保持在合理的较低水平"
|
||||||
|
|
||||||
msgid "Enable support"
|
msgid "Enable support"
|
||||||
msgstr "开启支撑"
|
msgstr "开启支撑"
|
||||||
|
|
||||||
|
@ -6376,6 +6428,24 @@ msgstr "支撑:正在修补层%d的空洞"
|
||||||
msgid "Support: propagate branches at layer %d"
|
msgid "Support: propagate branches at layer %d"
|
||||||
msgstr "支撑:正在生长层%d的树枝"
|
msgstr "支撑:正在生长层%d的树枝"
|
||||||
|
|
||||||
|
#~ msgid "Waiting"
|
||||||
|
#~ msgstr "等待中"
|
||||||
|
|
||||||
|
#~ msgid "Failed"
|
||||||
|
#~ msgstr "失败"
|
||||||
|
|
||||||
|
#~ msgid "Finished"
|
||||||
|
#~ msgstr "完成"
|
||||||
|
|
||||||
|
#~ msgid "Home"
|
||||||
|
#~ msgstr "首页"
|
||||||
|
|
||||||
|
#~ msgid "Per object edit"
|
||||||
|
#~ msgstr "编辑单个对象"
|
||||||
|
|
||||||
|
#~ msgid "Inner wall speed"
|
||||||
|
#~ msgstr "内墙速度"
|
||||||
|
|
||||||
#~ msgid "Clipping of view"
|
#~ msgid "Clipping of view"
|
||||||
#~ msgstr "剪切视图"
|
#~ msgstr "剪切视图"
|
||||||
|
|
||||||
|
@ -6609,9 +6679,6 @@ msgstr "支撑:正在生长层%d的树枝"
|
||||||
#~ msgid "sdfsadf Any arrow"
|
#~ msgid "sdfsadf Any arrow"
|
||||||
#~ msgstr "方向键"
|
#~ msgstr "方向键"
|
||||||
|
|
||||||
#~ msgid "Mouse wheel"
|
|
||||||
#~ msgstr "鼠标滚轮"
|
|
||||||
|
|
||||||
#~ msgid "Any arrow"
|
#~ msgid "Any arrow"
|
||||||
#~ msgstr "方向键"
|
#~ msgstr "方向键"
|
||||||
|
|
||||||
|
@ -8464,9 +8531,6 @@ msgstr "支撑:正在生长层%d的树枝"
|
||||||
#~ "plane."
|
#~ "plane."
|
||||||
#~ msgstr "使用这个设置将支撑模式在水平面旋转特定角度。"
|
#~ msgstr "使用这个设置将支撑模式在水平面旋转特定角度。"
|
||||||
|
|
||||||
#~ msgid "Home"
|
|
||||||
#~ msgstr "首页"
|
|
||||||
|
|
||||||
#~ msgid "Compare this preset with some another"
|
#~ msgid "Compare this preset with some another"
|
||||||
#~ msgstr "配置集对比"
|
#~ msgstr "配置集对比"
|
||||||
|
|
||||||
|
@ -8752,9 +8816,6 @@ msgstr "支撑:正在生长层%d的树枝"
|
||||||
#~ msgid "Use single nozzle to print multi filament"
|
#~ msgid "Use single nozzle to print multi filament"
|
||||||
#~ msgstr "使用单喷嘴打印多耗材"
|
#~ msgstr "使用单喷嘴打印多耗材"
|
||||||
|
|
||||||
#~ msgid "Slice gap closing radius"
|
|
||||||
#~ msgstr "切片间隙闭合半径"
|
|
||||||
|
|
||||||
#~ msgid "Slicing Mode"
|
#~ msgid "Slicing Mode"
|
||||||
#~ msgstr "切片模式"
|
#~ msgstr "切片模式"
|
||||||
|
|
||||||
|
@ -10037,9 +10098,6 @@ msgstr "支撑:正在生长层%d的树枝"
|
||||||
#~ msgid "Higher print quality versus higher print speed."
|
#~ msgid "Higher print quality versus higher print speed."
|
||||||
#~ msgstr "高精度 vs 高速度。"
|
#~ msgstr "高精度 vs 高速度。"
|
||||||
|
|
||||||
#~ msgid "Smooth"
|
|
||||||
#~ msgstr "平滑"
|
|
||||||
|
|
||||||
#~ msgid "Keep min"
|
#~ msgid "Keep min"
|
||||||
#~ msgstr "保留最小"
|
#~ msgstr "保留最小"
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
<key>CFBundleIconFile</key>
|
<key>CFBundleIconFile</key>
|
||||||
<string>${MACOSX_BUNDLE_ICON_FILE}</string>
|
<string>${MACOSX_BUNDLE_ICON_FILE}</string>
|
||||||
<key>CFBundleIdentifier</key>
|
<key>CFBundleIdentifier</key>
|
||||||
<string>${MACOSX_BUNDLE_GUI_IDENTIFIER}</string>
|
<string>com.bambulab.bambu-studio</string>
|
||||||
<key>CFBundleInfoDictionaryVersion</key>
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
<string>6.0</string>
|
<string>6.0</string>
|
||||||
<key>CFBundleLongVersionString</key>
|
<key>CFBundleLongVersionString</key>
|
||||||
|
|
8
deps/FREETYPE/FREETYPE.cmake
vendored
|
@ -4,6 +4,12 @@ else()
|
||||||
set(library_build_shared "0")
|
set(library_build_shared "0")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||||
|
set(_ft_disable_zlib "-D FT_DISABLE_ZLIB=FALSE")
|
||||||
|
else()
|
||||||
|
set(_ft_disable_zlib "-D FT_DISABLE_ZLIB=TRUE")
|
||||||
|
endif()
|
||||||
|
|
||||||
bambustudio_add_cmake_project(FREETYPE
|
bambustudio_add_cmake_project(FREETYPE
|
||||||
URL https://mirror.ossplanet.net/nongnu/freetype/freetype-2.12.1.tar.gz
|
URL https://mirror.ossplanet.net/nongnu/freetype/freetype-2.12.1.tar.gz
|
||||||
URL_HASH SHA256=efe71fd4b8246f1b0b1b9bfca13cfff1c9ad85930340c27df469733bbb620938
|
URL_HASH SHA256=efe71fd4b8246f1b0b1b9bfca13cfff1c9ad85930340c27df469733bbb620938
|
||||||
|
@ -11,7 +17,7 @@ bambustudio_add_cmake_project(FREETYPE
|
||||||
#"${_patch_step}"
|
#"${_patch_step}"
|
||||||
CMAKE_ARGS
|
CMAKE_ARGS
|
||||||
-D BUILD_SHARED_LIBS=${library_build_shared}
|
-D BUILD_SHARED_LIBS=${library_build_shared}
|
||||||
-D FT_DISABLE_ZLIB=TRUE
|
${_ft_disable_zlib}
|
||||||
-D FT_DISABLE_BZIP2=TRUE
|
-D FT_DISABLE_BZIP2=TRUE
|
||||||
-D FT_DISABLE_PNG=TRUE
|
-D FT_DISABLE_PNG=TRUE
|
||||||
-D FT_DISABLE_HARFBUZZ=TRUE
|
-D FT_DISABLE_HARFBUZZ=TRUE
|
||||||
|
|
9
deps/GLFW/GLFW.cmake
vendored
|
@ -6,6 +6,12 @@ else()
|
||||||
set(_build_static ON)
|
set(_build_static ON)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||||
|
set(_glfw_use_wayland "-DGLFW_USE_WAYLAND=ON")
|
||||||
|
else()
|
||||||
|
set(_glfw_use_wayland "-DGLFW_USE_WAYLAND=FF")
|
||||||
|
endif()
|
||||||
|
|
||||||
bambustudio_add_cmake_project(GLFW
|
bambustudio_add_cmake_project(GLFW
|
||||||
URL https://github.com/glfw/glfw/archive/refs/tags/3.3.7.zip
|
URL https://github.com/glfw/glfw/archive/refs/tags/3.3.7.zip
|
||||||
URL_HASH SHA256=e02d956935e5b9fb4abf90e2c2e07c9a0526d7eacae8ee5353484c69a2a76cd0
|
URL_HASH SHA256=e02d956935e5b9fb4abf90e2c2e07c9a0526d7eacae8ee5353484c69a2a76cd0
|
||||||
|
@ -14,7 +20,8 @@ bambustudio_add_cmake_project(GLFW
|
||||||
-DBUILD_SHARED_LIBS=${_build_shared}
|
-DBUILD_SHARED_LIBS=${_build_shared}
|
||||||
-DGLFW_BUILD_DOCS=OFF
|
-DGLFW_BUILD_DOCS=OFF
|
||||||
-DGLFW_BUILD_EXAMPLES=OFF
|
-DGLFW_BUILD_EXAMPLES=OFF
|
||||||
-DGLFW_BUILD_TESTS=OFF
|
-DGLFW_BUILD_TESTS=OFF
|
||||||
|
${_glfw_use_wayland}
|
||||||
)
|
)
|
||||||
|
|
||||||
if (MSVC)
|
if (MSVC)
|
||||||
|
|
3
resources/images/monitor_axis_home_icon.svg
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M25.313 14.8577C25.8116 14.7499 25.9047 14.3886 25.5223 14.0519L15.1727 5.00017C14.7886 4.6651 14.161 4.66346 13.7769 4.99853L3.39301 14.0519C3.0089 14.387 3.10207 14.7482 3.60059 14.8561L4.84606 15.1242C5.34458 15.232 5.75156 15.7371 5.75156 16.247V24.6744C5.75156 25.1844 6.16836 25.6012 6.67831 25.6012H11.062C11.572 25.6012 11.9887 25.1844 11.9887 24.6744V20.6307C11.9887 20.1208 12.4055 19.704 12.9155 19.704H15.8723C16.3822 19.704 16.799 20.1208 16.799 20.6307V24.6744C16.799 25.1844 17.2158 25.6012 17.7258 25.6012H22.2369C22.7469 25.6012 23.1637 25.1844 23.1637 24.6744V16.247C23.1637 15.7371 23.5707 15.232 24.0692 15.1258L25.313 14.8577Z" fill="#00AE42" fill-opacity="0.2" stroke="#00AE42" stroke-width="0.718299" stroke-miterlimit="10" stroke-linecap="round"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 884 B |
4
resources/images/monitor_bed_down_disable.svg
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M14 1.80039C14 2.13176 13.7314 2.40039 13.4 2.40039H2.6C2.26863 2.40039 2 2.13176 2 1.80039C2 1.46902 2.26863 1.20039 2.6 1.20039H13.4C13.7314 1.20039 14 1.46902 14 1.80039Z" fill="#ACACAC"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M12.2422 11.0067L8.42386 14.825C8.18954 15.0594 7.80965 15.0594 7.57534 14.825L3.75696 11.0067C3.52265 10.7724 3.52265 10.3925 3.75696 10.1581C3.99128 9.92383 4.37117 9.92383 4.60549 10.1581L7.3996 12.9523V5.40078C7.3996 5.06941 7.66823 4.80078 7.9996 4.80078C8.33097 4.80078 8.5996 5.06941 8.5996 5.40078V12.9523L11.3937 10.1581C11.628 9.92383 12.0079 9.92383 12.2422 10.1581C12.4765 10.3925 12.4765 10.7724 12.2422 11.0067Z" fill="#ACACAC"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 797 B |
4
resources/images/monitor_bed_up_disable.svg
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M2 14.1996C2 13.8682 2.26863 13.5996 2.6 13.5996H13.4C13.7314 13.5996 14 13.8682 14 14.1996C14 14.531 13.7314 14.7996 13.4 14.7996H2.6C2.26863 14.7996 2 14.531 2 14.1996Z" fill="#ACACAC"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M3.75777 4.99333L7.57614 1.17495C7.81046 0.940639 8.19036 0.940639 8.42467 1.17495L12.243 4.99333C12.4774 5.22765 12.4774 5.60754 12.243 5.84186C12.0087 6.07617 11.6288 6.07617 11.3945 5.84186L8.60041 3.04775V10.5992C8.60041 10.9306 8.33178 11.1992 8.00041 11.1992C7.66904 11.1992 7.40041 10.9306 7.40041 10.5992V3.04775L4.6063 5.84186C4.37198 6.07617 3.99208 6.07617 3.75777 5.84186C3.52345 5.60754 3.52345 5.22765 3.75777 4.99333Z" fill="#ACACAC"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 801 B |
3
resources/images/monitor_extrduer_down_disable.svg
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M13.1426 17.6231C12.7258 18.2138 11.8497 18.2138 11.4329 17.6231L4.54229 7.85815C4.05321 7.16507 4.54889 6.20863 5.39716 6.20863L19.1784 6.20864C20.0267 6.20864 20.5223 7.16507 20.0333 7.85815L13.1426 17.6231Z" fill="#ACACAC"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 340 B |
3
resources/images/monitor_extruder_up_disable.svg
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M11.4329 5.21146C11.8497 4.62074 12.7258 4.62074 13.1426 5.21146L20.0333 14.9764C20.5223 15.6695 20.0267 16.6259 19.1784 16.6259H5.39715C4.54888 16.6259 4.05321 15.6695 4.54228 14.9764L11.4329 5.21146Z" fill="#ACACAC"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 332 B |
|
@ -1,4 +1,4 @@
|
||||||
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
<svg width="25" height="25" viewBox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
<rect x="3.5" y="3.5" width="3" height="11" fill="#FF6F00"/>
|
<path d="M6.5 2.5H2.5V22.5H6.5V2.5Z" fill="#FF6F00"/>
|
||||||
<rect x="11.5" y="3.5" width="3" height="11" fill="#FF6F00"/>
|
<path d="M22.5 2.5H18.5V22.5H22.5V2.5Z" fill="#FF6F00"/>
|
||||||
</svg>
|
</svg>
|
||||||
|
|
Before Width: | Height: | Size: 226 B After Width: | Height: | Size: 214 B |
|
@ -1,4 +1,4 @@
|
||||||
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
<svg width="25" height="25" viewBox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
<rect x="2.5" y="2.5" width="3.54545" height="13" fill="#FF6F00"/>
|
<path d="M5.9 1.5H1.5V23.5H5.9V1.5Z" fill="#FF6F00"/>
|
||||||
<rect x="11.9531" y="2.5" width="3.54545" height="13" fill="#FF6F00"/>
|
<path d="M23.5 1.5H19.1V23.5H23.5V1.5Z" fill="#FF6F00"/>
|
||||||
</svg>
|
</svg>
|
||||||
|
|
Before Width: | Height: | Size: 241 B After Width: | Height: | Size: 214 B |
|
@ -1,3 +1,3 @@
|
||||||
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
<svg width="25" height="25" viewBox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
<path d="M15.25 8.56699C15.5833 8.75944 15.5833 9.24056 15.25 9.43301L4.75 15.4952C4.41667 15.6876 4 15.4471 4 15.0622L4 2.93782C4 2.55292 4.41667 2.31236 4.75 2.50481L15.25 8.56699Z" fill="#00AE42"/>
|
<path d="M21.587 11.8402C22.1377 12.1335 22.1377 12.8666 21.587 13.1598L4.23913 22.3968C3.68841 22.69 3 22.3235 3 21.7371V3.26299C3 2.67651 3.68841 2.30997 4.23913 2.60321L21.587 11.8402Z" fill="#00AE42"/>
|
||||||
</svg>
|
</svg>
|
||||||
|
|
Before Width: | Height: | Size: 304 B After Width: | Height: | Size: 309 B |
|
@ -1,10 +1,3 @@
|
||||||
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
<svg width="25" height="25" viewBox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
<g clip-path="url(#clip0_7481_29762)">
|
<path d="M22.5435 11.7742C23.1522 12.0968 23.1522 12.9032 22.5435 13.2258L3.36957 23.3865C2.76088 23.709 2 23.3059 2 22.6608V2.33929C2 1.69416 2.76088 1.29096 3.36957 1.61353L22.5435 11.7742Z" fill="#00AE42"/>
|
||||||
<path d="M15.9687 8.56699C16.3021 8.75944 16.3021 9.24056 15.9687 9.43301L3.96875 16.3612C3.63542 16.5537 3.21875 16.3131 3.21875 15.9282L3.21875 2.07179C3.21875 1.68689 3.63542 1.44633 3.96875 1.63878L15.9687 8.56699Z" fill="#00AE42"/>
|
|
||||||
</g>
|
|
||||||
<defs>
|
|
||||||
<clipPath id="clip0_7481_29762">
|
|
||||||
<rect width="18" height="18" fill="white"/>
|
|
||||||
</clipPath>
|
|
||||||
</defs>
|
|
||||||
</svg>
|
</svg>
|
||||||
|
|
Before Width: | Height: | Size: 488 B After Width: | Height: | Size: 313 B |
|
@ -1,3 +1,3 @@
|
||||||
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
<svg width="25" height="25" viewBox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
<rect x="3.19531" y="3.19531" width="11.6099" height="11.6099" fill="#D01B1B"/>
|
<path d="M22.5 2.5H2.5V22.5H22.5V2.5Z" fill="#D01B1B"/>
|
||||||
</svg>
|
</svg>
|
||||||
|
|
Before Width: | Height: | Size: 183 B After Width: | Height: | Size: 159 B |
|
@ -1,3 +1,3 @@
|
||||||
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
<svg width="25" height="25" viewBox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
<rect x="2.5" y="2.5" width="13" height="13" fill="#D01B1B"/>
|
<path d="M23.5 1.5H1.5V23.5H23.5V1.5Z" fill="#D01B1B"/>
|
||||||
</svg>
|
</svg>
|
||||||
|
|
Before Width: | Height: | Size: 165 B After Width: | Height: | Size: 159 B |
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "Bambulab",
|
"name": "Bambulab",
|
||||||
"url": "http://www.bambulab.com/Parameters/vendor/BBL.json",
|
"url": "http://www.bambulab.com/Parameters/vendor/BBL.json",
|
||||||
"version": "01.02.00.00",
|
"version": "01.02.00.03",
|
||||||
"force_update": "0",
|
"force_update": "0",
|
||||||
"description": "the initial version of BBL configurations",
|
"description": "the initial version of BBL configurations",
|
||||||
"machine_model_list": [
|
"machine_model_list": [
|
||||||
|
@ -213,10 +213,6 @@
|
||||||
"name": "Generic PETG @base",
|
"name": "Generic PETG @base",
|
||||||
"sub_path": "filament/Generic PETG @base.json"
|
"sub_path": "filament/Generic PETG @base.json"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "Generic PETG @0.2 nozzle",
|
|
||||||
"sub_path": "filament/Generic PETG @0.2 nozzle.json"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "Generic PETG",
|
"name": "Generic PETG",
|
||||||
"sub_path": "filament/Generic PETG.json"
|
"sub_path": "filament/Generic PETG.json"
|
||||||
|
@ -261,6 +257,14 @@
|
||||||
"name": "Generic PC",
|
"name": "Generic PC",
|
||||||
"sub_path": "filament/Generic PC.json"
|
"sub_path": "filament/Generic PC.json"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "Generic PVA @base",
|
||||||
|
"sub_path": "filament/Generic PVA @base.json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Generic PVA @0.2 nozzle",
|
||||||
|
"sub_path": "filament/Generic PVA @0.2 nozzle.json"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "Generic PVA",
|
"name": "Generic PVA",
|
||||||
"sub_path": "filament/Generic PVA.json"
|
"sub_path": "filament/Generic PVA.json"
|
||||||
|
@ -277,10 +281,6 @@
|
||||||
"name": "Bambu TPU 95A @BBL X1C",
|
"name": "Bambu TPU 95A @BBL X1C",
|
||||||
"sub_path": "filament/Bambu TPU 95A @BBL X1C.json"
|
"sub_path": "filament/Bambu TPU 95A @BBL X1C.json"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "Bambu TPU 95A @BBL X1C 0.2 nozzle",
|
|
||||||
"sub_path": "filament/Bambu TPU 95A @BBL X1C 0.2 nozzle.json"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "Bambu TPU 95A @BBL X1",
|
"name": "Bambu TPU 95A @BBL X1",
|
||||||
"sub_path": "filament/Bambu TPU 95A @BBL X1.json"
|
"sub_path": "filament/Bambu TPU 95A @BBL X1.json"
|
||||||
|
@ -399,6 +399,10 @@
|
||||||
"name": "Bambu Lab X1 0.4 nozzle",
|
"name": "Bambu Lab X1 0.4 nozzle",
|
||||||
"sub_path": "machine/Bambu Lab X1 0.4 nozzle.json"
|
"sub_path": "machine/Bambu Lab X1 0.4 nozzle.json"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "Bambu Lab X1 0.2 nozzle",
|
||||||
|
"sub_path": "machine/Bambu Lab X1 0.2 nozzle.json"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "Bambu Lab X1 0.8 nozzle",
|
"name": "Bambu Lab X1 0.8 nozzle",
|
||||||
"sub_path": "machine/Bambu Lab X1 0.8 nozzle.json"
|
"sub_path": "machine/Bambu Lab X1 0.8 nozzle.json"
|
||||||
|
|
|
@ -6,9 +6,10 @@
|
||||||
"instantiation": "true",
|
"instantiation": "true",
|
||||||
"inherits": "Bambu ABS @base",
|
"inherits": "Bambu ABS @base",
|
||||||
"filament_max_volumetric_speed": [
|
"filament_max_volumetric_speed": [
|
||||||
"4"
|
"2"
|
||||||
],
|
],
|
||||||
"compatible_printers": [
|
"compatible_printers": [
|
||||||
"Bambu Lab X1 Carbon 0.2 nozzle"
|
"Bambu Lab X1 Carbon 0.2 nozzle",
|
||||||
|
"Bambu Lab X1 0.2 nozzle"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
"260"
|
"260"
|
||||||
],
|
],
|
||||||
"compatible_printers": [
|
"compatible_printers": [
|
||||||
"Bambu Lab X1 Carbon 0.2 nozzle"
|
"Bambu Lab X1 Carbon 0.2 nozzle",
|
||||||
|
"Bambu Lab X1 0.2 nozzle"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,9 +6,10 @@
|
||||||
"instantiation": "true",
|
"instantiation": "true",
|
||||||
"inherits": "Bambu PLA Basic @base",
|
"inherits": "Bambu PLA Basic @base",
|
||||||
"filament_max_volumetric_speed": [
|
"filament_max_volumetric_speed": [
|
||||||
"4"
|
"2"
|
||||||
],
|
],
|
||||||
"compatible_printers": [
|
"compatible_printers": [
|
||||||
"Bambu Lab X1 Carbon 0.2 nozzle"
|
"Bambu Lab X1 Carbon 0.2 nozzle",
|
||||||
|
"Bambu Lab X1 0.2 nozzle"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,9 +6,10 @@
|
||||||
"instantiation": "true",
|
"instantiation": "true",
|
||||||
"inherits": "Bambu PLA Matte @base",
|
"inherits": "Bambu PLA Matte @base",
|
||||||
"filament_max_volumetric_speed": [
|
"filament_max_volumetric_speed": [
|
||||||
"4"
|
"2"
|
||||||
],
|
],
|
||||||
"compatible_printers": [
|
"compatible_printers": [
|
||||||
"Bambu Lab X1 Carbon 0.2 nozzle"
|
"Bambu Lab X1 Carbon 0.2 nozzle",
|
||||||
|
"Bambu Lab X1 0.2 nozzle"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,9 +6,16 @@
|
||||||
"instantiation": "true",
|
"instantiation": "true",
|
||||||
"inherits": "Bambu Support W @base",
|
"inherits": "Bambu Support W @base",
|
||||||
"filament_max_volumetric_speed": [
|
"filament_max_volumetric_speed": [
|
||||||
"2"
|
"0.5"
|
||||||
|
],
|
||||||
|
"nozzle_temperature_initial_layer": [
|
||||||
|
"240"
|
||||||
|
],
|
||||||
|
"nozzle_temperature": [
|
||||||
|
"240"
|
||||||
],
|
],
|
||||||
"compatible_printers": [
|
"compatible_printers": [
|
||||||
"Bambu Lab X1 Carbon 0.2 nozzle"
|
"Bambu Lab X1 Carbon 0.2 nozzle",
|
||||||
|
"Bambu Lab X1 0.2 nozzle"
|
||||||
]
|
]
|
||||||
}
|
}
|
|
@ -1,14 +0,0 @@
|
||||||
{
|
|
||||||
"type": "filament",
|
|
||||||
"setting_id": "GFSU00_00",
|
|
||||||
"name": "Bambu TPU 95A @BBL X1C 0.2 nozzle",
|
|
||||||
"from": "system",
|
|
||||||
"instantiation": "true",
|
|
||||||
"inherits": "Bambu TPU 95A @base",
|
|
||||||
"filament_max_volumetric_speed": [
|
|
||||||
"0.5"
|
|
||||||
],
|
|
||||||
"compatible_printers": [
|
|
||||||
"Bambu Lab X1 Carbon 0.2 nozzle"
|
|
||||||
]
|
|
||||||
}
|
|
|
@ -1,14 +0,0 @@
|
||||||
{
|
|
||||||
"type": "filament",
|
|
||||||
"setting_id": "GFSG99_00",
|
|
||||||
"name": "Generic PETG @0.2 nozzle",
|
|
||||||
"from": "system",
|
|
||||||
"instantiation": "true",
|
|
||||||
"inherits": "Generic PETG @base",
|
|
||||||
"filament_max_volumetric_speed": [
|
|
||||||
"1"
|
|
||||||
],
|
|
||||||
"compatible_printers": [
|
|
||||||
"Bambu Lab X1 Carbon 0.2 nozzle"
|
|
||||||
]
|
|
||||||
}
|
|
15
resources/profiles/BBL/filament/Generic PVA @0.2 nozzle.json
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
{
|
||||||
|
"type": "filament",
|
||||||
|
"setting_id": "GFSS99_00",
|
||||||
|
"name": "Generic PVA @0.2 nozzle",
|
||||||
|
"from": "system",
|
||||||
|
"instantiation": "true",
|
||||||
|
"inherits": "Generic PVA @base",
|
||||||
|
"filament_max_volumetric_speed": [
|
||||||
|
"0.5"
|
||||||
|
],
|
||||||
|
"compatible_printers": [
|
||||||
|
"Bambu Lab X1 Carbon 0.2 nozzle",
|
||||||
|
"Bambu Lab X1 0.2 nozzle"
|
||||||
|
]
|
||||||
|
}
|
20
resources/profiles/BBL/filament/Generic PVA @base.json
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
{
|
||||||
|
"type": "filament",
|
||||||
|
"filament_id": "GFS99",
|
||||||
|
"name": "Generic PVA @base",
|
||||||
|
"from": "system",
|
||||||
|
"instantiation": "false",
|
||||||
|
"inherits": "fdm_filament_pva",
|
||||||
|
"filament_flow_ratio": [
|
||||||
|
"0.95"
|
||||||
|
],
|
||||||
|
"filament_max_volumetric_speed": [
|
||||||
|
"16"
|
||||||
|
],
|
||||||
|
"slow_down_layer_time": [
|
||||||
|
"7"
|
||||||
|
],
|
||||||
|
"slow_down_min_speed": [
|
||||||
|
"20"
|
||||||
|
]
|
||||||
|
}
|
|
@ -1,23 +1,10 @@
|
||||||
{
|
{
|
||||||
"type": "filament",
|
"type": "filament",
|
||||||
"filament_id": "GFS99",
|
|
||||||
"setting_id": "GFSS99",
|
"setting_id": "GFSS99",
|
||||||
"name": "Generic PVA",
|
"name": "Generic PVA",
|
||||||
"from": "system",
|
"from": "system",
|
||||||
"instantiation": "true",
|
"instantiation": "true",
|
||||||
"inherits": "fdm_filament_pva",
|
"inherits": "Generic PVA @base",
|
||||||
"filament_flow_ratio": [
|
|
||||||
"0.95"
|
|
||||||
],
|
|
||||||
"filament_max_volumetric_speed": [
|
|
||||||
"16"
|
|
||||||
],
|
|
||||||
"slow_down_layer_time": [
|
|
||||||
"7"
|
|
||||||
],
|
|
||||||
"slow_down_min_speed": [
|
|
||||||
"20"
|
|
||||||
],
|
|
||||||
"compatible_printers": [
|
"compatible_printers": [
|
||||||
"Bambu Lab X1 Carbon 0.4 nozzle",
|
"Bambu Lab X1 Carbon 0.4 nozzle",
|
||||||
"Bambu Lab X1 0.4 nozzle",
|
"Bambu Lab X1 0.4 nozzle",
|
||||||
|
|
32
resources/profiles/BBL/machine/Bambu Lab X1 0.2 nozzle.json
Normal file
|
@ -3,7 +3,7 @@
|
||||||
"name": "Bambu Lab X1",
|
"name": "Bambu Lab X1",
|
||||||
"model_id": "BL-P002",
|
"model_id": "BL-P002",
|
||||||
"url": "http://www.bambulab.com/Parameters/printer_model/Bambu Lab X1.json",
|
"url": "http://www.bambulab.com/Parameters/printer_model/Bambu Lab X1.json",
|
||||||
"nozzle_diameter": "0.4;0.6;0.8",
|
"nozzle_diameter": "0.4;0.2;0.6;0.8",
|
||||||
"machine_tech": "FFF",
|
"machine_tech": "FFF",
|
||||||
"family": "BBL-3DP",
|
"family": "BBL-3DP",
|
||||||
"bed_model": "bbl-3dp-X1.stl",
|
"bed_model": "bbl-3dp-X1.stl",
|
||||||
|
|
|
@ -152,7 +152,7 @@
|
||||||
"silent_mode": "0",
|
"silent_mode": "0",
|
||||||
"single_extruder_multi_material": "1",
|
"single_extruder_multi_material": "1",
|
||||||
"change_filament_gcode": "M620 S[next_extruder]A\nM204 S9000\n{if toolchange_count > 1}\nG17\nG2 Z{max_layer_z + 0.4} I0.86 J0.86 P1 F10000 ; spiral lift a little from second lift\n{endif}\nG1 Z{max_layer_z + 3.0} F1200\n\nG1 X70 F12000\nG1 Y245\nG1 Y265 F3000\nM400\nM106 P1 S0\n{if old_filament_temp > 0 && next_extruder < 255}M109 S[old_filament_temp]{endif}\nG1 X90 F3000\nG1 Y250 F4000\nG1 X100 F5000\nG1 X120 F12000\n\nG1 X20 Y50 F12000\nG1 Y-3\n\nT[next_extruder]\n\n; always use highest temperature to flush\nM400\nM109 S[nozzle_temperature_range_high]\n\n{if next_extruder < 255}\nG1 X54 F12000\nG1 Y265\n\nM400\n\nG92 E0\n{if flush_length_1 > 1}\n; FLUSH_START\n{if flush_length_1 > 23.7}\nG1 E23.7 F{old_filament_e_feedrate} ; do not need pulsatile flushing for start part\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{old_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\n{else}\nG1 E{flush_length_1} F{old_filament_e_feedrate}\n{endif}\n; FLUSH_END\nG1 E-[old_retract_length_toolchange] F1800\nG1 E[old_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_2 > 1}\n; FLUSH_START\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_3 > 1}\n; FLUSH_START\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_4 > 1}\n; FLUSH_START\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\n; FLUSH_END\n{endif}\n\nM400\nM109 S[new_filament_temp]\n\nM400\nM106 P1 S255\nM400 S3\nG1 X80 F15000\nG1 X60 F15000\nG1 X80 F15000\nG1 X60 F15000; shake to put down garbage\n\nG92 E0\nG1 E-[new_retract_length_toolchange] F1800\n\nG1 X70 F5000\nG1 X90 F3000\nG1 Y255 F4000\nG1 X100 F5000\nG1 Y265 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X165 F15000; wipe and shake\nG1 Y256 ; move Y to aside, prevent collision\nM400\nG1 Z[z_after_toolchange] F3000\n{if layer_z <= (initial_layer_print_height + 0.001)}\nM204 S[initial_layer_acceleration]\n{else}\nM204 S[default_acceleration]\n{endif}\n{else}\nG1 X[x_after_toolchange] Y[y_after_toolchange] Z[z_after_toolchange] F12000\n{endif}\nM621 S[next_extruder]A",
|
"change_filament_gcode": "M620 S[next_extruder]A\nM204 S9000\n{if toolchange_count > 1}\nG17\nG2 Z{max_layer_z + 0.4} I0.86 J0.86 P1 F10000 ; spiral lift a little from second lift\n{endif}\nG1 Z{max_layer_z + 3.0} F1200\n\nG1 X70 F12000\nG1 Y245\nG1 Y265 F3000\nM400\nM106 P1 S0\n{if old_filament_temp > 0 && next_extruder < 255}M109 S[old_filament_temp]{endif}\nG1 X90 F3000\nG1 Y250 F4000\nG1 X100 F5000\nG1 X120 F12000\n\nG1 X20 Y50 F12000\nG1 Y-3\n\nT[next_extruder]\n\n; always use highest temperature to flush\nM400\nM109 S[nozzle_temperature_range_high]\n\n{if next_extruder < 255}\nG1 X54 F12000\nG1 Y265\n\nM400\n\nG92 E0\n{if flush_length_1 > 1}\n; FLUSH_START\n{if flush_length_1 > 23.7}\nG1 E23.7 F{old_filament_e_feedrate} ; do not need pulsatile flushing for start part\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{old_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\n{else}\nG1 E{flush_length_1} F{old_filament_e_feedrate}\n{endif}\n; FLUSH_END\nG1 E-[old_retract_length_toolchange] F1800\nG1 E[old_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_2 > 1}\n; FLUSH_START\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_3 > 1}\n; FLUSH_START\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_4 > 1}\n; FLUSH_START\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\n; FLUSH_END\n{endif}\n\nM400\nM109 S[new_filament_temp]\n\nM400\nM106 P1 S255\nM400 S3\nG1 X80 F15000\nG1 X60 F15000\nG1 X80 F15000\nG1 X60 F15000; shake to put down garbage\n\nG92 E0\nG1 E-[new_retract_length_toolchange] F1800\n\nG1 X70 F5000\nG1 X90 F3000\nG1 Y255 F4000\nG1 X100 F5000\nG1 Y265 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X165 F15000; wipe and shake\nG1 Y256 ; move Y to aside, prevent collision\nM400\nG1 Z[z_after_toolchange] F3000\n{if layer_z <= (initial_layer_print_height + 0.001)}\nM204 S[initial_layer_acceleration]\n{else}\nM204 S[default_acceleration]\n{endif}\n{else}\nG1 X[x_after_toolchange] Y[y_after_toolchange] Z[z_after_toolchange] F12000\n{endif}\nM621 S[next_extruder]A",
|
||||||
"layer_change_gcode": "{if timelapse_no_toolhead}\nG92 E0\nG1 E-[retraction_length] F1800\nG1 X65 Y245 F12000 ; move to safe pos\nG1 Y265 F3000\nM400 P100\nM971 S11 C10 O0\nG92 E0\nG1 E[retraction_length] F300\nG1 X100 F5000\nG1 Y255\n{endif}",
|
"layer_change_gcode": "{if timelapse_type == 1} ; timelapse with wipe tower\nG92 E0\nG1 E-[retraction_length] F1800\nG1 X65 Y245 F12000 ; move to safe pos\nG1 Y265 F3000\nM400 P100\nM971 S11 C10 O0\nG92 E0\nG1 E[retraction_length] F300\nG1 X100 F5000\nG1 Y255\n{elsif timelapse_type == 2} ; timelapse without wipe tower\nM971 S11 C10 O0\n{endif}",
|
||||||
"machine_pause_gcode": "M400 U1\n",
|
"machine_pause_gcode": "M400 U1\n",
|
||||||
"wipe": [
|
"wipe": [
|
||||||
"1"
|
"1"
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
"instantiation": "true",
|
"instantiation": "true",
|
||||||
"inherits": "fdm_process_bbl_0.10_nozzle_0.2",
|
"inherits": "fdm_process_bbl_0.10_nozzle_0.2",
|
||||||
"compatible_printers": [
|
"compatible_printers": [
|
||||||
"Bambu Lab X1 Carbon 0.2 nozzle"
|
"Bambu Lab X1 Carbon 0.2 nozzle",
|
||||||
|
"Bambu Lab X1 0.2 nozzle"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,6 @@
|
||||||
"instantiation": "true",
|
"instantiation": "true",
|
||||||
"inherits": "fdm_process_bbl_0.40_nozzle_0.8",
|
"inherits": "fdm_process_bbl_0.40_nozzle_0.8",
|
||||||
"compatible_printers": [
|
"compatible_printers": [
|
||||||
"Bambu Lab X1 0.6 nozzle"
|
"Bambu Lab X1 0.8 nozzle"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,8 +80,8 @@ var LangText={
|
||||||
"t85":"4, Reopen Bambu studio and install the plug-in again",
|
"t85":"4, Reopen Bambu studio and install the plug-in again",
|
||||||
"t86":"Close",
|
"t86":"Close",
|
||||||
"t87":"User Manual",
|
"t87":"User Manual",
|
||||||
"t88":"clear",
|
"t88":"Remove",
|
||||||
"t89":"show in explorer"
|
"t89":"Open Containing Folder"
|
||||||
},
|
},
|
||||||
"zh_CN":{
|
"zh_CN":{
|
||||||
"t1":"欢迎使用Bambu Studio",
|
"t1":"欢迎使用Bambu Studio",
|
||||||
|
@ -164,8 +164,24 @@ var LangText={
|
||||||
"t85":"4, 重新启动Bambu Studio并尝试安装插件",
|
"t85":"4, 重新启动Bambu Studio并尝试安装插件",
|
||||||
"t86":"关闭",
|
"t86":"关闭",
|
||||||
"t87":"使用引导",
|
"t87":"使用引导",
|
||||||
"t88":"清除",
|
"t88":"移除",
|
||||||
"t89":"打开文件所在路径"
|
"t89":"打开所在的文件夹",
|
||||||
|
"wk1":"快速入门指南",
|
||||||
|
"wk2":"本文介绍了Bambu Studio的最基本用法。它指导用户配置软件,创建项目,并逐步完成第一个打印任务。",
|
||||||
|
"wk3":"基于项目的工作流",
|
||||||
|
"wk4":"Bambu Studio提出了领先的工作流程,真正实现了“一体化”项目。基于主流的3MF项目格式,它提供了一系列革命性的新功能,如支持多盘、项目资源管理器和装配/零件视图。它可以大幅提高模型创作者及普通用户的使用效率。",
|
||||||
|
"wk5":"质量卓越的高速打印",
|
||||||
|
"wk6":"在保持高质量的前提下进行高速打印是非常具有挑战性的。Bambu Studio让这一切发生。支持“圆弧移动”特性使工具头移动更加顺滑,有效减少机器振动。基于不同材料类型的精细标定过的冷却控制参数,使得冷却过程可以自动开展。在悬垂区域进行“自动减速”,可防止高速打印时在此区域的外观瑕疵。",
|
||||||
|
"wk7":"多色打印",
|
||||||
|
"wk8":"Bambu Studio提供了多种着色工具来制作彩色模型。您可以在项目中自由添加/移除打印材料,并使用不同的笔刷为模型着色。开始打印时,打印任务中的各个材料将自动映射到匹配的AMS槽位,无需手动调整AMS中的料卷位置。",
|
||||||
|
"wk9":"切片参数设置指南",
|
||||||
|
"wk10":"Bambu Studio中的参数管理功能为切片过程提供了非常灵活和强大的控制。本文介绍了切片参数的组织分类和设置方法,并提供了一些使用技巧。",
|
||||||
|
"wk11":"远程控制和监控",
|
||||||
|
"wk12":"Bambu Studio支持通过WAN/LAN网络向打印机发送打印任务,控制和查看3D打印机和打印任务的各个方面。如果您有多台打印机,还可以在设备列表中轻松切换。",
|
||||||
|
"wk13":"STEP格式",
|
||||||
|
"wk14":"与STL相比,STEP带来了更多有效的信息。由于STEP的高精度,切片时可以生成更多的圆弧路径。STEP还包括模型每个零件的装配关系,可分割模型后恢复装配视图。",
|
||||||
|
"wk15":"3D文本",
|
||||||
|
"wk16":"使用3D文本工具,用户可以轻松地在项目中创建各种3D文本形状,使模型更加个性化。Bambu Studio提供了数十种字体,并支持粗体和斜体样式,使文本具有更大的灵活性。",
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -116,6 +116,7 @@ function SortUI()
|
||||||
{
|
{
|
||||||
let OneFila=m_ProfileItem['filament'][key];
|
let OneFila=m_ProfileItem['filament'][key];
|
||||||
|
|
||||||
|
let fWholeName=OneFila['name'].trim();
|
||||||
let fShortName=GetFilamentShortname( OneFila['name'] );
|
let fShortName=GetFilamentShortname( OneFila['name'] );
|
||||||
let fVendor=OneFila['vendor'];
|
let fVendor=OneFila['vendor'];
|
||||||
let fType=OneFila['type'];
|
let fType=OneFila['type'];
|
||||||
|
@ -173,7 +174,7 @@ function SortUI()
|
||||||
let pFila=$("#ItemBlockArea input[vendor='"+fVendor+"'][filatype='"+fType+"'][name='"+fShortName+"']");
|
let pFila=$("#ItemBlockArea input[vendor='"+fVendor+"'][filatype='"+fType+"'][name='"+fShortName+"']");
|
||||||
if(pFila.length==0)
|
if(pFila.length==0)
|
||||||
{
|
{
|
||||||
let HtmlFila='<div class="MItem"><input type="checkbox" vendor="'+fVendor+'" filatype="'+fType+'" model="'+fModel+'" name="'+fShortName+'" />'+fShortName+'</div>';
|
let HtmlFila='<div class="MItem"><input type="checkbox" vendor="'+fVendor+'" filatype="'+fType+'" filalist="'+fWholeName+';'+'" model="'+fModel+'" name="'+fShortName+'" />'+fShortName+'</div>';
|
||||||
|
|
||||||
$("#ItemBlockArea").append(HtmlFila);
|
$("#ItemBlockArea").append(HtmlFila);
|
||||||
|
|
||||||
|
@ -189,8 +190,10 @@ function SortUI()
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
let strModel=pFila.attr("model");
|
let strModel=pFila.attr("model");
|
||||||
|
let strFilalist=pFila.attr("filalist");
|
||||||
|
|
||||||
pFila.attr("model", strModel+fModel);
|
pFila.attr("model", strModel+fModel);
|
||||||
|
pFila.attr("filalist", strFilalist+fWholeName+';');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -397,7 +400,7 @@ function SortFilament()
|
||||||
function ChooseDefaultFilament()
|
function ChooseDefaultFilament()
|
||||||
{
|
{
|
||||||
//ModelList
|
//ModelList
|
||||||
let pModel=$("#MachineList input:gt(0):checked");
|
let pModel=$("#MachineList input:gt(0)");
|
||||||
let nModel=pModel.length;
|
let nModel=pModel.length;
|
||||||
let ModelList=new Array();
|
let ModelList=new Array();
|
||||||
for(let n=0;n<nModel;n++)
|
for(let n=0;n<nModel;n++)
|
||||||
|
@ -406,6 +409,24 @@ function ChooseDefaultFilament()
|
||||||
ModelList.push( OneModel.getAttribute("mode") );
|
ModelList.push( OneModel.getAttribute("mode") );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//DefaultMaterialList
|
||||||
|
let DefaultMaterialString=new Array();
|
||||||
|
let nMode=m_ProfileItem["model"].length;
|
||||||
|
for(let n=0;n<nMode;n++)
|
||||||
|
{
|
||||||
|
let OneMode=m_ProfileItem["model"][n];
|
||||||
|
let ModeName=OneMode['model'];
|
||||||
|
let DefaultM=OneMode['materials'];
|
||||||
|
|
||||||
|
if( ModelList.indexOf(ModeName)>-1 )
|
||||||
|
{
|
||||||
|
DefaultMaterialString+=OneMode['materials']+';';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let DefaultMaterialArray=DefaultMaterialString.split(';');
|
||||||
|
//alert(DefaultMaterialString);
|
||||||
|
|
||||||
//Filament
|
//Filament
|
||||||
let FilaNodes=$("#ItemBlockArea .MItem");
|
let FilaNodes=$("#ItemBlockArea .MItem");
|
||||||
let nFilament=FilaNodes.length;
|
let nFilament=FilaNodes.length;
|
||||||
|
@ -415,14 +436,17 @@ function ChooseDefaultFilament()
|
||||||
let OneFF=OneNode.getElementsByTagName("input")[0];
|
let OneFF=OneNode.getElementsByTagName("input")[0];
|
||||||
$(OneFF).prop("checked",false);
|
$(OneFF).prop("checked",false);
|
||||||
|
|
||||||
let fModel=OneFF.getAttribute("model");
|
let filamentList=OneFF.getAttribute("filalist");
|
||||||
|
//alert(filamentList);
|
||||||
|
let filamentArray=filamentList.split(';')
|
||||||
|
|
||||||
let HasModel=false;
|
let HasModel=false;
|
||||||
for(let m=0;m<nModel;m++)
|
let NowFilaLength=filamentArray.length;
|
||||||
|
for(let p=0;p<NowFilaLength;p++)
|
||||||
{
|
{
|
||||||
let ModelSrc=ModelList[m];
|
let NowFila=filamentArray[p];
|
||||||
|
|
||||||
if( fModel.indexOf(ModelSrc)>=0)
|
if( NowFila!='' && DefaultMaterialArray.indexOf(NowFila)>-1)
|
||||||
{
|
{
|
||||||
HasModel=true;
|
HasModel=true;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -62,6 +62,7 @@ body
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
flex-wrap: nowrap;
|
flex-wrap: nowrap;
|
||||||
position: relative;
|
position: relative;
|
||||||
|
width:262px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -205,6 +206,7 @@ body
|
||||||
{
|
{
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
min-width: 835px;
|
||||||
overflow-y:auto;
|
overflow-y:auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -291,16 +293,20 @@ body
|
||||||
|
|
||||||
#RecentClearAllBtn
|
#RecentClearAllBtn
|
||||||
{
|
{
|
||||||
border: 1px solid #C4C4C4;
|
border: 1px solid #000;
|
||||||
padding: 0px 10px;
|
padding: 0px 10px;
|
||||||
border-radius: 6px;
|
border-radius: 6px;
|
||||||
line-height: 26px;
|
line-height: 26px;
|
||||||
height: 26px;
|
height: 26px;
|
||||||
margin-left: 20px;
|
margin-left: 20px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
background-color: #00AE42;
|
color: #000;
|
||||||
color: #fff;
|
display: none;
|
||||||
display: inline;
|
}
|
||||||
|
|
||||||
|
#RecentClearAllBtn:hover
|
||||||
|
{
|
||||||
|
background-color:#CDCECE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#RecentTitle
|
#RecentTitle
|
||||||
|
@ -368,25 +374,26 @@ body
|
||||||
border: 0px;
|
border: 0px;
|
||||||
min-width: 100px;
|
min-width: 100px;
|
||||||
top: 800px;
|
top: 800px;
|
||||||
border: 1px solid #C5C5C5;
|
border: 1px solid #C3C3C3;
|
||||||
border-radius: 6px;
|
color: #323A3D;
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.CT_Item
|
.CT_Item
|
||||||
{
|
{
|
||||||
line-height:30px;
|
padding: 2px 10px;
|
||||||
padding: 0px 10px;
|
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
align-content: center;
|
align-content: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
border: 2px solid #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.CT_Item:hover
|
.CT_Item:hover
|
||||||
{
|
{
|
||||||
background-color: #E9E9E9;
|
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
border: 2px solid #00AE42;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -470,42 +477,99 @@ body
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
align-content: flex-start;
|
align-content: flex-start;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
padding: 50px;
|
margin: 30px 40px;
|
||||||
|
position: relative;
|
||||||
|
top: 0px;
|
||||||
|
bottom: 0px;
|
||||||
|
right: 0px;
|
||||||
|
left: 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@media screen and (max-width: 1100px) {
|
||||||
.GuideBlock
|
.GuideBlock
|
||||||
{
|
{
|
||||||
width: 320px;
|
width: calc(50% - 20px);
|
||||||
margin: 0px;
|
margin: 0px 10px 40px 10px;
|
||||||
margin: 0px 12px 30px 12px;
|
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and ( min-width:1101px) and ( max-width:1680px )
|
||||||
|
{
|
||||||
|
.GuideBlock
|
||||||
|
{
|
||||||
|
width: calc(33% - 20px);
|
||||||
|
margin: 0px 10px 40px 10px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and ( min-width:1681px) and (max-width:2120px ) {
|
||||||
|
.GuideBlock
|
||||||
|
{
|
||||||
|
width: calc(25% - 20px);
|
||||||
|
margin: 0px 10px 40px 10px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and ( min-width:2121px) and (max-width:2620px ) {
|
||||||
|
.GuideBlock
|
||||||
|
{
|
||||||
|
width: calc(20% - 20px);
|
||||||
|
margin: 0px 10px 40px 10px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (min-width:2621px ) and (max-width:3120px ) {
|
||||||
|
.GuideBlock
|
||||||
|
{
|
||||||
|
width: calc(16.6% - 20px);
|
||||||
|
margin: 0px 10px 40px 10px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (min-width:3121px ) {
|
||||||
|
.GuideBlock
|
||||||
|
{
|
||||||
|
width: calc(14.2% - 20px);
|
||||||
|
margin: 0px 10px 40px 10px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.UG_IMG
|
.UG_IMG
|
||||||
{
|
{
|
||||||
width: 320px;
|
width: 100%;
|
||||||
height: 200px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.UG_IMG img
|
.UG_IMG img
|
||||||
{
|
{
|
||||||
width: 320px;
|
width: 100%;
|
||||||
height: 200px;
|
border-radius: 5px 5px 0px 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.UG_TITLE
|
.UG_TITLE
|
||||||
{
|
{
|
||||||
font-size: 16px;
|
font-size: 18px;
|
||||||
|
font-weight: 700;
|
||||||
line-height: 20px;
|
line-height: 20px;
|
||||||
width: 320px;
|
width: 100%;
|
||||||
margin-top: 6px;
|
margin-top: 20px;
|
||||||
|
margin-bottom: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.UG_DESC
|
.UG_DESC
|
||||||
{
|
{
|
||||||
width: 320px;
|
width: 100%;
|
||||||
line-height: 18px;
|
line-height: 18px;
|
||||||
color: #C4C4C4;
|
color: #4E5454;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
BIN
resources/web/homepage/img/3d_text.png
Normal file
After Width: | Height: | Size: 135 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 5.3 KiB |
Before Width: | Height: | Size: 3.9 KiB |
Before Width: | Height: | Size: 2.7 KiB |
BIN
resources/web/homepage/img/high_speed_print_at_quality.png
Normal file
After Width: | Height: | Size: 149 KiB |
BIN
resources/web/homepage/img/multi_color_printing.png
Normal file
After Width: | Height: | Size: 321 KiB |
4
resources/web/homepage/img/open_folder.svg
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M8.34801 3.82127C8.71179 4.19206 9.20969 4.40069 9.7295 4.40069H11.3196C11.4502 4.40069 11.5773 4.41559 11.7 4.44276V3.14981C11.7 2.62475 11.274 2.19873 10.749 2.19873H7.00335C6.92533 2.19873 6.8517 2.211 6.77895 2.22853C6.79385 2.24256 6.80875 2.25483 6.82277 2.26886L8.34801 3.82127Z" stroke="#6B6B6B" stroke-miterlimit="10" stroke-linecap="round"/>
|
||||||
|
<path d="M11.7 4.44284C11.5773 4.41566 11.4502 4.40076 11.3196 4.40076H9.72951C9.2097 4.40076 8.71268 4.19214 8.34803 3.82135L6.82279 2.26893C6.80876 2.25491 6.79298 2.24176 6.77896 2.22861C6.45726 1.92269 6.03036 1.75 5.58419 1.75H2.34787C1.374 1.75 0.583328 2.53979 0.583328 3.51455V10.6402C0.583328 11.615 1.37312 12.4048 2.34787 12.4048H11.3196C12.2944 12.4048 13.0842 11.615 13.0842 10.6402V6.16531C13.0842 5.32117 12.4916 4.61728 11.7 4.44284Z" stroke="#6B6B6B" stroke-miterlimit="10" stroke-linecap="round"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 980 B |
BIN
resources/web/homepage/img/project_based_workflow.png
Normal file
After Width: | Height: | Size: 25 KiB |
BIN
resources/web/homepage/img/quick_start.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
resources/web/homepage/img/remote_control_and_monitoring.png
Normal file
After Width: | Height: | Size: 107 KiB |
14
resources/web/homepage/img/remove.svg
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
<svg width="14" height="15" viewBox="0 0 14 15" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g clip-path="url(#clip0_7828_34220)">
|
||||||
|
<path d="M11.8245 5.10425V13.1577C11.8245 13.431 11.5708 13.6544 11.2604 13.6544H2.73973C2.42934 13.6544 2.17566 13.431 2.17566 13.1577V5.10425" stroke="#D01B1B" stroke-width="0.8" stroke-miterlimit="10" stroke-linecap="round"/>
|
||||||
|
<path d="M0.965012 3.55176H13.0353" stroke="#D01B1B" stroke-width="0.8" stroke-miterlimit="10" stroke-linecap="round"/>
|
||||||
|
<path d="M4.31033 1.55829C4.31033 1.55829 4.31033 1.38921 4.31033 1.18246C4.31033 0.975717 4.56401 0.806641 4.8744 0.806641H9.1263C9.43668 0.806641 9.69036 0.975717 9.69036 1.18246C9.69036 1.38921 9.69036 1.55829 9.69036 1.55829" stroke="#D01B1B" stroke-width="0.8" stroke-miterlimit="10" stroke-linecap="round"/>
|
||||||
|
<path d="M5.23859 5.29443V12.0461" stroke="#D01B1B" stroke-width="0.8" stroke-miterlimit="10" stroke-linecap="round"/>
|
||||||
|
<path d="M8.76242 5.29443V12.0461" stroke="#D01B1B" stroke-width="0.8" stroke-miterlimit="10" stroke-linecap="round"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<clipPath id="clip0_7828_34220">
|
||||||
|
<rect width="14" height="15" fill="white"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 68 KiB |
BIN
resources/web/homepage/img/step.png
Normal file
After Width: | Height: | Size: 26 KiB |
|
@ -76,7 +76,7 @@
|
||||||
<div id="FileList">
|
<div id="FileList">
|
||||||
<!-- <div class="FileItem" onClick="OnOpenRecentFile('aaaa')" fpath='d:\model\11.3mf'>
|
<!-- <div class="FileItem" onClick="OnOpenRecentFile('aaaa')" fpath='d:\model\11.3mf'>
|
||||||
<a class="FileTip" title="d:\model\11.3mf"></a>
|
<a class="FileTip" title="d:\model\11.3mf"></a>
|
||||||
<div class="FileImg"><img src="img/b.jpg"/></div>
|
<div class="FileImg"><img src="img/d.png"/></div>
|
||||||
<a>abcd12334.3mf</a>
|
<a>abcd12334.3mf</a>
|
||||||
<div class="FileDate">2021/12/27 09:22</div>
|
<div class="FileDate">2021/12/27 09:22</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -139,7 +139,7 @@
|
||||||
<div class="FileImg"><img src="img/b.jpg"/></div>
|
<div class="FileImg"><img src="img/b.jpg"/></div>
|
||||||
<a>abcd12334.3mf</a>
|
<a>abcd12334.3mf</a>
|
||||||
<div class="FileDate">2021/12/27 09:22</div>
|
<div class="FileDate">2021/12/27 09:22</div>
|
||||||
</div> -->
|
</div> -->
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -162,46 +162,46 @@
|
||||||
<div id="WikiGuideBigBoard" board="wikiguide">
|
<div id="WikiGuideBigBoard" board="wikiguide">
|
||||||
<div id="WikiGuideBoard" >
|
<div id="WikiGuideBoard" >
|
||||||
<div class="GuideBlock" onClick="OpenWikiUrl('https://wiki.bambulab.com/en/software/bambu-studio/studio-quick-start')">
|
<div class="GuideBlock" onClick="OpenWikiUrl('https://wiki.bambulab.com/en/software/bambu-studio/studio-quick-start')">
|
||||||
<div class="UG_IMG"><img src="img/wiki3.png" /></div>
|
<div class="UG_IMG"><img src="img/quick_start.png" /></div>
|
||||||
<div class="UG_TITLE trans" tid="wk1">Quick Start</div>
|
<div class="UG_TITLE trans" tid="wk1">Quick Start</div>
|
||||||
<div class="UG_DESC trans" tid="wk2">This article instroduces the most basic usage of Bambu Studio. It guides users to configure software, create projects, and complete the first printing task step by step. </div>
|
<div class="UG_DESC trans" tid="wk2">This article introduces the most basic usage of Bambu Studio. It guides users to configure software, create projects, and complete the first printing task step by step. </div>
|
||||||
</div>
|
</div>
|
||||||
<div class="GuideBlock" onClick="OpenWikiUrl('https://wiki.bambulab.com/en/software/bambu-studio/project-based-workflow')">
|
<div class="GuideBlock" onClick="OpenWikiUrl('https://wiki.bambulab.com/en/software/bambu-studio/project-based-workflow')">
|
||||||
<div class="UG_IMG"><img src="img/wiki.png" /></div>
|
<div class="UG_IMG"><img src="img/project_based_workflow.png" /></div>
|
||||||
<div class="UG_TITLE trans" tid="wk1">Project Based Workflow</div>
|
<div class="UG_TITLE trans" tid="wk3">Project Based Workflow</div>
|
||||||
<div class="UG_DESC trans" tid="wk2">Bambu Studio has put forward a leading workflow to truly achieve an “all in one” project. Based on the mainstream 3MF project format, it provides a series of revolutionary new features, such as Multi-Plate Support, a Project Resource Manager, and Assembly/Part View. It greatly improves the efficiency of both creators and regular users.</div>
|
<div class="UG_DESC trans" tid="wk4">Bambu Studio has put forward a leading workflow to truly achieve an “all in one” project. Based on the mainstream 3MF project format, it provides a series of revolutionary new features, such as Multi-Plate Support, a Project Resource Manager, and Assembly/Part View. It greatly improves the efficiency of both creators and regular users.</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="GuideBlock" onClick="OpenWikiUrl('https://wiki.bambulab.com/en/software/bambu-studio/high-speed-print-at-quality')">
|
<div class="GuideBlock" onClick="OpenWikiUrl('https://wiki.bambulab.com/en/software/bambu-studio/high-speed-print-at-quality')">
|
||||||
<div class="UG_IMG"><img src="img/wiki3.png" /></div>
|
<div class="UG_IMG"><img src="img/high_speed_print_at_quality.png" /></div>
|
||||||
<div class="UG_TITLE trans" tid="wk1">High Speed Print at Quality</div>
|
<div class="UG_TITLE trans" tid="wk5">High Speed Print at Quality</div>
|
||||||
<div class="UG_DESC trans" tid="wk2">It is challenging to print at high speed while maintaining high quality. Bambu Studio makes this happen.
|
<div class="UG_DESC trans" tid="wk6">It is challenging to print at high speed while maintaining high quality. Bambu Studio makes this happen.
|
||||||
"Arch Move" makes the toolhead move smoothly and reduces the machine's vibration. The smart cooling is based on fine-tunned cooling parameters for each filament type.
|
"Arch Move" makes the toolhead move smoothly and reduces the machine's vibration. The smart cooling is based on fine-tuned cooling parameters for each filament type.
|
||||||
Auto slow down for overhang walls works to prevent deformation at high speeds.</div>
|
"Auto slow down" for overhang walls works to prevent deformation at high speeds.</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="GuideBlock" onClick="OpenWikiUrl('https://wiki.bambulab.com/en/software/bambu-studio/multi-color-printing')">
|
<div class="GuideBlock" onClick="OpenWikiUrl('https://wiki.bambulab.com/en/software/bambu-studio/multi-color-printing')">
|
||||||
<div class="UG_IMG"><img src="img/wiki2.png" /></div>
|
<div class="UG_IMG"><img src="img/multi_color_printing.png" /></div>
|
||||||
<div class="UG_TITLE trans" tid="wk1">Multi-Color Printing</div>
|
<div class="UG_TITLE trans" tid="wk7">Multi-Color Printing</div>
|
||||||
<div class="UG_DESC trans" tid="wk2">Bambu Studio provides versatile colorizing tools to make a colorful model. You can freely add/remove filaments in a project and colorize your model with different brushes. Before printing, each filament will be auto-mapped to an AMS slot, not needing to manually change the spool placement in the AMS.</div>
|
<div class="UG_DESC trans" tid="wk8">Bambu Studio provides versatile colorizing tools to make a colorful model. You can freely add/remove filaments in a project and colorize your model with different brushes. Before printing, each filament will be auto-mapped to an AMS slot, not needing to manually change the spool placement in the AMS.</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="GuideBlock" onClick="OpenWikiUrl('https://wiki.bambulab.com/en/software/bambu-studio/how-to-set-slicing-parameters')">
|
<div class="GuideBlock" onClick="OpenWikiUrl('https://wiki.bambulab.com/en/software/bambu-studio/how-to-set-slicing-parameters')">
|
||||||
<div class="UG_IMG"><img src="img/wiki.png" /></div>
|
<div class="UG_IMG"><img src="img/setting_guide_of_slicing_parameters.png" /></div>
|
||||||
<div class="UG_TITLE trans" tid="wk1">Setting Guide of Slicing Parameters</div>
|
<div class="UG_TITLE trans" tid="wk9">Setting Guide of Slicing Parameters</div>
|
||||||
<div class="UG_DESC trans" tid="wk2">The parameter management features in Bambu Studio provide very flexible and powerful control over the slicing process. This article introduces the organization of parameters and provides some skills on taking full advantage of these capabilities.</div>
|
<div class="UG_DESC trans" tid="wk10">The parameter management features in Bambu Studio provide very flexible and powerful control over the slicing process. This article introduces the organization of parameters and provides some skills on taking full advantage of these capabilities.</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="GuideBlock" onClick="OpenWikiUrl('https://wiki.bambulab.com/en/software/bambu-studio/remote-control')">
|
<div class="GuideBlock" onClick="OpenWikiUrl('https://wiki.bambulab.com/en/software/bambu-studio/remote-control')">
|
||||||
<div class="UG_IMG"><img src="img/wiki2.png" /></div>
|
<div class="UG_IMG"><img src="img/remote_control_and_monitoring.png" /></div>
|
||||||
<div class="UG_TITLE trans" tid="wk1">Remote Control & Monitoring</div>
|
<div class="UG_TITLE trans" tid="wk11">Remote Control & Monitoring</div>
|
||||||
<div class="UG_DESC trans" tid="wk2">We support sending G-code to your printer over WAN/LAN network, controlling & monitoring every aspect of your 3D printer and printing jobs, and updating firmware over the air. If you have more than one printer, you can easily switch between them in the device list.</div>
|
<div class="UG_DESC trans" tid="wk12">Bambu Studio support sending print job to your printer over WAN/LAN network, controlling & monitoring every aspect of your 3D printer and printing jobs. If you have more than one printer, you can easily switch between them in the device list.</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="GuideBlock" onClick="OpenWikiUrl('https://wiki.bambulab.com/en/software/bambu-studio/step')">
|
<div class="GuideBlock" onClick="OpenWikiUrl('https://wiki.bambulab.com/en/software/bambu-studio/step')">
|
||||||
<div class="UG_IMG"><img src="img/wiki.png" /></div>
|
<div class="UG_IMG"><img src="img/step.png" /></div>
|
||||||
<div class="UG_TITLE trans" tid="wk1">STEP Format</div>
|
<div class="UG_TITLE trans" tid="wk13">STEP Format</div>
|
||||||
<div class="UG_DESC trans" tid="wk2">Compared with STL, STEP brings more effective information. Thanks to the high accuracy of STEP, a lot of extrusion paths can be generated as arcs. STEP also includes the assembly relationship of each parts of a model, which can be used to identify the exterior surface and restore the assembly view after a model is split.</div>
|
<div class="UG_DESC trans" tid="wk14">Compared with STL, STEP brings more effective information. Thanks to the high accuracy of STEP, a lot of extrusion paths can be generated as arcs. STEP also includes the assembly relationship of each part of a model, which can be used to restore the assembly view after a model is split.</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="GuideBlock" onClick="OpenWikiUrl('https://wiki.bambulab.com/en/software/bambu-studio/3d-text')">
|
<div class="GuideBlock" onClick="OpenWikiUrl('https://wiki.bambulab.com/en/software/bambu-studio/3d-text')">
|
||||||
<div class="UG_IMG"><img src="img/wiki.png" /></div>
|
<div class="UG_IMG"><img src="img/3d_text.png" /></div>
|
||||||
<div class="UG_TITLE trans" tid="wk1">3D Text</div>
|
<div class="UG_TITLE trans" tid="wk15">3D Text</div>
|
||||||
<div class="UG_DESC trans" tid="wk2">With 3D Text tool, users can easily create any 3D text shape in a project. Users can freely create 3D text content to make modles more personalized. Bambu Studio provides dozens of fonts and supports bold and italic styles to give text greater flexibility.</div>
|
<div class="UG_DESC trans" tid="wk16">With 3D Text tool, users can easily create various 3D text shapes in the project, making the model more personalized. Bambu Studio provides dozens of fonts and supports bold and italic styles to give text greater flexibility.</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -130,13 +130,7 @@ void AppConfig::set_defaults()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (get("single_instance").empty())
|
if (get("single_instance").empty())
|
||||||
set_bool("single_instance",
|
set_bool("single_instance", false);
|
||||||
#ifdef __APPLE__
|
|
||||||
true
|
|
||||||
#else // __APPLE__
|
|
||||||
false
|
|
||||||
#endif // __APPLE__
|
|
||||||
);
|
|
||||||
|
|
||||||
#ifdef SUPPORT_REMEMBER_OUTPUT_PATH
|
#ifdef SUPPORT_REMEMBER_OUTPUT_PATH
|
||||||
if (get("remember_output_path").empty())
|
if (get("remember_output_path").empty())
|
||||||
|
|
|
@ -454,10 +454,6 @@ set(OCCT_LIBS
|
||||||
TKernel
|
TKernel
|
||||||
)
|
)
|
||||||
|
|
||||||
if(APPLE)
|
|
||||||
target_link_libraries(libslic3r freetype)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
|
|
||||||
target_link_libraries(libslic3r
|
target_link_libraries(libslic3r
|
||||||
libnest2d
|
libnest2d
|
||||||
|
@ -480,6 +476,13 @@ target_link_libraries(libslic3r
|
||||||
${OCCT_LIBS}
|
${OCCT_LIBS}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if(NOT WIN32)
|
||||||
|
target_link_libraries(libslic3r freetype)
|
||||||
|
if (NOT APPLE)
|
||||||
|
target_link_libraries(libslic3r fontconfig)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
if (TARGET OpenVDB::openvdb)
|
if (TARGET OpenVDB::openvdb)
|
||||||
target_link_libraries(libslic3r OpenVDB::openvdb)
|
target_link_libraries(libslic3r OpenVDB::openvdb)
|
||||||
endif()
|
endif()
|
||||||
|
|
|
@ -534,8 +534,10 @@ bool ConfigBase::set_deserialize_nothrow(const t_config_option_key &opt_key_src,
|
||||||
this->handle_legacy(opt_key, value);
|
this->handle_legacy(opt_key, value);
|
||||||
if (opt_key.empty()) {
|
if (opt_key.empty()) {
|
||||||
// Ignore the option.
|
// Ignore the option.
|
||||||
//BBS: record these options
|
//BBS: record these options, keep only one repeated opt_key
|
||||||
substitutions_ctxt.unrecogized_keys.push_back(opt_key_src);
|
auto iter = std::find(substitutions_ctxt.unrecogized_keys.begin(), substitutions_ctxt.unrecogized_keys.end(), opt_key_src);
|
||||||
|
if (iter == substitutions_ctxt.unrecogized_keys.end())
|
||||||
|
substitutions_ctxt.unrecogized_keys.push_back(opt_key_src);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return this->set_deserialize_raw(opt_key, value, substitutions_ctxt, append);
|
return this->set_deserialize_raw(opt_key, value, substitutions_ctxt, append);
|
||||||
|
|
|
@ -2507,6 +2507,14 @@ GCode::LayerResult GCode::process_layer(
|
||||||
gcode += "; open powerlost recovery\n";
|
gcode += "; open powerlost recovery\n";
|
||||||
gcode += "M1003 S1\n";
|
gcode += "M1003 S1\n";
|
||||||
}
|
}
|
||||||
|
// BBS: open first layer inspection at second layer
|
||||||
|
if (print.config().scan_first_layer.value) {
|
||||||
|
// BBS: retract first to avoid droping when scan model
|
||||||
|
gcode += this->retract();
|
||||||
|
gcode += "M976 S1 P1 ; scan model before printing 2nd layer\n";
|
||||||
|
gcode += "M400 P100\n";
|
||||||
|
gcode += this->unretract();
|
||||||
|
}
|
||||||
|
|
||||||
//BBS: reset acceleration at sencond layer
|
//BBS: reset acceleration at sencond layer
|
||||||
if (m_config.default_acceleration.value > 0 && m_config.initial_layer_acceleration.value > 0) {
|
if (m_config.default_acceleration.value > 0 && m_config.initial_layer_acceleration.value > 0) {
|
||||||
|
@ -2661,7 +2669,29 @@ GCode::LayerResult GCode::process_layer(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (support_dontcare || interface_dontcare) {
|
if (interface_dontcare) {
|
||||||
|
int extruder_override = wiping_extrusions.get_support_interface_extruder_overrides(&object);
|
||||||
|
if (extruder_override >= 0) {
|
||||||
|
interface_extruder = extruder_override;
|
||||||
|
interface_dontcare = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// BBS: try to print support base with a filament other than interface filament
|
||||||
|
if (support_dontcare && !interface_dontcare) {
|
||||||
|
unsigned int dontcare_extruder = first_extruder_id;
|
||||||
|
for (unsigned int extruder_id : layer_tools.extruders) {
|
||||||
|
if (print.config().filament_soluble.get_at(extruder_id)) continue;
|
||||||
|
|
||||||
|
if (extruder_id == interface_extruder) continue;
|
||||||
|
|
||||||
|
dontcare_extruder = extruder_id;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (support_dontcare) support_extruder = dontcare_extruder;
|
||||||
|
}
|
||||||
|
else if (support_dontcare || interface_dontcare) {
|
||||||
// Some support will be printed with "don't care" material, preferably non-soluble.
|
// Some support will be printed with "don't care" material, preferably non-soluble.
|
||||||
// Is the current extruder assigned a soluble filament?
|
// Is the current extruder assigned a soluble filament?
|
||||||
unsigned int dontcare_extruder = first_extruder_id;
|
unsigned int dontcare_extruder = first_extruder_id;
|
||||||
|
@ -3028,18 +3058,6 @@ GCode::LayerResult GCode::process_layer(
|
||||||
file.write(gcode);
|
file.write(gcode);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// BBS: scan model after print first layer
|
|
||||||
// Note: for sequential printing, every object will have this
|
|
||||||
if (print.config().scan_first_layer.value) {
|
|
||||||
if (first_layer) {
|
|
||||||
//BBS: retract first to avoid droping when scan model
|
|
||||||
gcode += this->retract();
|
|
||||||
gcode += "M976 S1 P1 ; scan model after print first layer\n";
|
|
||||||
gcode += "M400 P100\n";
|
|
||||||
gcode += this->unretract();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOST_LOG_TRIVIAL(trace) << "Exported layer " << layer.id() << " print_z " << print_z <<
|
BOOST_LOG_TRIVIAL(trace) << "Exported layer " << layer.id() << " print_z " << print_z <<
|
||||||
log_memory_info();
|
log_memory_info();
|
||||||
|
|
||||||
|
@ -3839,8 +3857,8 @@ std::string GCode::retract(bool toolchange, bool is_last_retraction)
|
||||||
if (m_writer.extruder() == nullptr)
|
if (m_writer.extruder() == nullptr)
|
||||||
return gcode;
|
return gcode;
|
||||||
|
|
||||||
// wipe (if it's enabled for this extruder and we have a stored wipe path)
|
// wipe (if it's enabled for this extruder and we have a stored wipe path and no-zero wipe distance)
|
||||||
if (EXTRUDER_CONFIG(wipe) && m_wipe.has_path()) {
|
if (EXTRUDER_CONFIG(wipe) && m_wipe.has_path() && scale_(EXTRUDER_CONFIG(wipe_distance)) > SCALED_EPSILON) {
|
||||||
gcode += toolchange ? m_writer.retract_for_toolchange(true) : m_writer.retract(true);
|
gcode += toolchange ? m_writer.retract_for_toolchange(true) : m_writer.retract(true);
|
||||||
gcode += m_wipe.wipe(*this, toolchange, is_last_retraction);
|
gcode += m_wipe.wipe(*this, toolchange, is_last_retraction);
|
||||||
}
|
}
|
||||||
|
|
|
@ -83,7 +83,7 @@ public:
|
||||||
m_tool_change_idx(0),
|
m_tool_change_idx(0),
|
||||||
m_plate_origin(plate_origin),
|
m_plate_origin(plate_origin),
|
||||||
m_single_extruder_multi_material(print_config.single_extruder_multi_material),
|
m_single_extruder_multi_material(print_config.single_extruder_multi_material),
|
||||||
m_enable_timelapse_print(print_config.timelapse_no_toolhead.value),
|
m_enable_timelapse_print(print_config.timelapse_type.value == TimelapseType::tlSmooth),
|
||||||
m_is_first_print(true)
|
m_is_first_print(true)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
|
@ -990,11 +990,22 @@ void GCodeProcessor::apply_config(const DynamicPrintConfig& config)
|
||||||
}
|
}
|
||||||
|
|
||||||
const ConfigOptionPoints* extruder_offset = config.option<ConfigOptionPoints>("extruder_offset");
|
const ConfigOptionPoints* extruder_offset = config.option<ConfigOptionPoints>("extruder_offset");
|
||||||
|
const ConfigOptionBool* single_extruder_multi_material = config.option<ConfigOptionBool>("single_extruder_multi_material");
|
||||||
if (extruder_offset != nullptr) {
|
if (extruder_offset != nullptr) {
|
||||||
m_extruder_offsets.resize(extruder_offset->values.size());
|
//BBS: for single extruder multi material, only use the offset of first extruder
|
||||||
for (size_t i = 0; i < extruder_offset->values.size(); ++i) {
|
if (single_extruder_multi_material != nullptr && single_extruder_multi_material->getBool()) {
|
||||||
Vec2f offset = extruder_offset->values[i].cast<float>();
|
Vec2f offset = extruder_offset->values[0].cast<float>();
|
||||||
m_extruder_offsets[i] = { offset(0), offset(1), 0.0f };
|
m_extruder_offsets.resize(m_result.extruders_count);
|
||||||
|
for (size_t i = 0; i < m_result.extruders_count; ++i) {
|
||||||
|
m_extruder_offsets[i] = { offset(0), offset(1), 0.0f };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
m_extruder_offsets.resize(extruder_offset->values.size());
|
||||||
|
for (size_t i = 0; i < extruder_offset->values.size(); ++i) {
|
||||||
|
Vec2f offset = extruder_offset->values[i].cast<float>();
|
||||||
|
m_extruder_offsets[i] = { offset(0), offset(1), 0.0f };
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1192,6 +1203,7 @@ void GCodeProcessor::reset()
|
||||||
}
|
}
|
||||||
|
|
||||||
m_extruded_last_z = 0.0f;
|
m_extruded_last_z = 0.0f;
|
||||||
|
m_zero_layer_height = 0.0f;
|
||||||
m_first_layer_height = 0.0f;
|
m_first_layer_height = 0.0f;
|
||||||
m_processing_start_custom_gcode = false;
|
m_processing_start_custom_gcode = false;
|
||||||
m_g1_line_id = 0;
|
m_g1_line_id = 0;
|
||||||
|
@ -2469,7 +2481,7 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line)
|
||||||
AxisCoords delta_pos;
|
AxisCoords delta_pos;
|
||||||
for (unsigned char a = X; a <= E; ++a) {
|
for (unsigned char a = X; a <= E; ++a) {
|
||||||
delta_pos[a] = m_end_position[a] - m_start_position[a];
|
delta_pos[a] = m_end_position[a] - m_start_position[a];
|
||||||
max_abs_delta = std::max(max_abs_delta, std::abs(delta_pos[a]));
|
max_abs_delta = std::max<float>(max_abs_delta, std::abs(delta_pos[a]));
|
||||||
}
|
}
|
||||||
|
|
||||||
// no displacement, return
|
// no displacement, return
|
||||||
|
@ -2575,7 +2587,7 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line)
|
||||||
minimum_feedrate(static_cast<PrintEstimatedStatistics::ETimeMode>(i), m_feedrate);
|
minimum_feedrate(static_cast<PrintEstimatedStatistics::ETimeMode>(i), m_feedrate);
|
||||||
|
|
||||||
//BBS: calculeta enter and exit direction
|
//BBS: calculeta enter and exit direction
|
||||||
curr.enter_direction = { delta_pos[X], delta_pos[Y], delta_pos[Z] };
|
curr.enter_direction = { static_cast<float>(delta_pos[X]), static_cast<float>(delta_pos[Y]), static_cast<float>(delta_pos[Z]) };
|
||||||
float norm = curr.enter_direction.norm();
|
float norm = curr.enter_direction.norm();
|
||||||
if (!is_extrusion_only_move(delta_pos))
|
if (!is_extrusion_only_move(delta_pos))
|
||||||
curr.enter_direction = curr.enter_direction / norm;
|
curr.enter_direction = curr.enter_direction / norm;
|
||||||
|
@ -2624,8 +2636,7 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line)
|
||||||
curr.abs_axis_feedrate[a] = std::abs(curr.axis_feedrate[a]);
|
curr.abs_axis_feedrate[a] = std::abs(curr.axis_feedrate[a]);
|
||||||
if (curr.abs_axis_feedrate[a] != 0.0f) {
|
if (curr.abs_axis_feedrate[a] != 0.0f) {
|
||||||
float axis_max_feedrate = get_axis_max_feedrate(static_cast<PrintEstimatedStatistics::ETimeMode>(i), static_cast<Axis>(a));
|
float axis_max_feedrate = get_axis_max_feedrate(static_cast<PrintEstimatedStatistics::ETimeMode>(i), static_cast<Axis>(a));
|
||||||
if (axis_max_feedrate != 0.0f)
|
if (axis_max_feedrate != 0.0f) min_feedrate_factor = std::min<float>(min_feedrate_factor, axis_max_feedrate / curr.abs_axis_feedrate[a]);
|
||||||
min_feedrate_factor = std::min(min_feedrate_factor, axis_max_feedrate / curr.abs_axis_feedrate[a]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//BBS: update curr.feedrate
|
//BBS: update curr.feedrate
|
||||||
|
@ -2914,6 +2925,7 @@ void GCodeProcessor::process_G2_G3(const GCodeReader::GCodeLine& line)
|
||||||
|
|
||||||
EMoveType type = move_type(delta_pos[E]);
|
EMoveType type = move_type(delta_pos[E]);
|
||||||
|
|
||||||
|
|
||||||
float delta_xyz = std::sqrt(sqr(arc_length) + sqr(delta_pos[Z]));
|
float delta_xyz = std::sqrt(sqr(arc_length) + sqr(delta_pos[Z]));
|
||||||
if (type == EMoveType::Extrude) {
|
if (type == EMoveType::Extrude) {
|
||||||
float volume_extruded_filament = area_filament_cross_section * delta_pos[E];
|
float volume_extruded_filament = area_filament_cross_section * delta_pos[E];
|
||||||
|
@ -3020,8 +3032,7 @@ void GCodeProcessor::process_G2_G3(const GCodeReader::GCodeLine& line)
|
||||||
curr.abs_axis_feedrate[a] = std::abs(curr.axis_feedrate[a]);
|
curr.abs_axis_feedrate[a] = std::abs(curr.axis_feedrate[a]);
|
||||||
if (curr.abs_axis_feedrate[a] != 0.0f) {
|
if (curr.abs_axis_feedrate[a] != 0.0f) {
|
||||||
float axis_max_feedrate = get_axis_max_feedrate(static_cast<PrintEstimatedStatistics::ETimeMode>(i), static_cast<Axis>(a));
|
float axis_max_feedrate = get_axis_max_feedrate(static_cast<PrintEstimatedStatistics::ETimeMode>(i), static_cast<Axis>(a));
|
||||||
if (axis_max_feedrate != 0.0f)
|
if (axis_max_feedrate != 0.0f) min_feedrate_factor = std::min<float>(min_feedrate_factor, axis_max_feedrate / curr.abs_axis_feedrate[a]);
|
||||||
min_feedrate_factor = std::min(min_feedrate_factor, axis_max_feedrate / curr.abs_axis_feedrate[a]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
curr.feedrate *= min_feedrate_factor;
|
curr.feedrate *= min_feedrate_factor;
|
||||||
|
@ -3048,8 +3059,7 @@ void GCodeProcessor::process_G2_G3(const GCodeReader::GCodeLine& line)
|
||||||
|
|
||||||
if (axis_acc[a] != 0.0f) {
|
if (axis_acc[a] != 0.0f) {
|
||||||
float axis_max_acceleration = get_axis_max_acceleration(static_cast<PrintEstimatedStatistics::ETimeMode>(i), static_cast<Axis>(a));
|
float axis_max_acceleration = get_axis_max_acceleration(static_cast<PrintEstimatedStatistics::ETimeMode>(i), static_cast<Axis>(a));
|
||||||
if (axis_max_acceleration != 0.0f && axis_acc[a] > axis_max_acceleration)
|
if (axis_max_acceleration != 0.0f && axis_acc[a] > axis_max_acceleration) min_acc_factor = std::min<float>(min_acc_factor, axis_max_acceleration / axis_acc[a]);
|
||||||
min_acc_factor = std::min(min_acc_factor, axis_max_acceleration / axis_acc[a]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
block.acceleration = acceleration * min_acc_factor;
|
block.acceleration = acceleration * min_acc_factor;
|
||||||
|
@ -3685,7 +3695,7 @@ void GCodeProcessor::store_move_vertex(EMoveType type, EMovePathType path_type)
|
||||||
m_interpolation_points[i] =
|
m_interpolation_points[i] =
|
||||||
Vec3f(m_interpolation_points[i].x() + m_x_offset,
|
Vec3f(m_interpolation_points[i].x() + m_x_offset,
|
||||||
m_interpolation_points[i].y() + m_y_offset,
|
m_interpolation_points[i].y() + m_y_offset,
|
||||||
m_processing_start_custom_gcode ? m_first_layer_height : m_interpolation_points[i].z()) +
|
m_processing_start_custom_gcode ? m_zero_layer_height : m_interpolation_points[i].z()) +
|
||||||
m_extruder_offsets[m_extruder_id];
|
m_extruder_offsets[m_extruder_id];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3696,8 +3706,8 @@ void GCodeProcessor::store_move_vertex(EMoveType type, EMovePathType path_type)
|
||||||
m_extruder_id,
|
m_extruder_id,
|
||||||
m_cp_color.current,
|
m_cp_color.current,
|
||||||
//BBS: add plate's offset to the rendering vertices
|
//BBS: add plate's offset to the rendering vertices
|
||||||
Vec3f(m_end_position[X] + m_x_offset, m_end_position[Y] + m_y_offset, m_processing_start_custom_gcode ? m_first_layer_height : m_end_position[Z]) + m_extruder_offsets[m_extruder_id],
|
Vec3f(m_end_position[X] + m_x_offset, m_end_position[Y] + m_y_offset, m_processing_start_custom_gcode ? m_zero_layer_height : m_end_position[Z]) + m_extruder_offsets[m_extruder_id],
|
||||||
m_end_position[E] - m_start_position[E],
|
static_cast<float>(m_end_position[E] - m_start_position[E]),
|
||||||
m_feedrate,
|
m_feedrate,
|
||||||
m_width,
|
m_width,
|
||||||
m_height,
|
m_height,
|
||||||
|
|
|
@ -219,7 +219,7 @@ namespace Slic3r {
|
||||||
#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
|
#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
|
||||||
|
|
||||||
private:
|
private:
|
||||||
using AxisCoords = std::array<float, 4>;
|
using AxisCoords = std::array<double, 4>;
|
||||||
using ExtruderColors = std::vector<unsigned char>;
|
using ExtruderColors = std::vector<unsigned char>;
|
||||||
using ExtruderTemps = std::vector<float>;
|
using ExtruderTemps = std::vector<float>;
|
||||||
|
|
||||||
|
@ -595,6 +595,7 @@ namespace Slic3r {
|
||||||
ExtruderTemps m_extruder_temps;
|
ExtruderTemps m_extruder_temps;
|
||||||
float m_extruded_last_z;
|
float m_extruded_last_z;
|
||||||
float m_first_layer_height; // mm
|
float m_first_layer_height; // mm
|
||||||
|
float m_zero_layer_height; // mm
|
||||||
bool m_processing_start_custom_gcode;
|
bool m_processing_start_custom_gcode;
|
||||||
unsigned int m_g1_line_id;
|
unsigned int m_g1_line_id;
|
||||||
unsigned int m_layer_id;
|
unsigned int m_layer_id;
|
||||||
|
|
|
@ -175,8 +175,13 @@ ToolOrdering::ToolOrdering(const Print &print, unsigned int first_extruder, bool
|
||||||
this->collect_extruders(*object, per_layer_extruder_switches);
|
this->collect_extruders(*object, per_layer_extruder_switches);
|
||||||
|
|
||||||
// Reorder the extruders to minimize tool switches.
|
// Reorder the extruders to minimize tool switches.
|
||||||
|
std::vector<unsigned int> first_layer_tool_order;
|
||||||
if (first_extruder == (unsigned int)-1) {
|
if (first_extruder == (unsigned int)-1) {
|
||||||
this->reorder_extruders(generate_first_layer_tool_order(print));
|
first_layer_tool_order = generate_first_layer_tool_order(print);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!first_layer_tool_order.empty()) {
|
||||||
|
this->reorder_extruders(first_layer_tool_order);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
this->reorder_extruders(first_extruder);
|
this->reorder_extruders(first_extruder);
|
||||||
|
|
|
@ -545,7 +545,7 @@ WipeTower::WipeTower(const PrintConfig& config, int plate_idx, Vec3d plate_origi
|
||||||
m_current_tool(initial_tool),
|
m_current_tool(initial_tool),
|
||||||
//wipe_volumes(flush_matrix)
|
//wipe_volumes(flush_matrix)
|
||||||
m_wipe_volume(prime_volume),
|
m_wipe_volume(prime_volume),
|
||||||
m_enable_timelapse_print(config.timelapse_no_toolhead.value)
|
m_enable_timelapse_print(config.timelapse_type.value == TimelapseType::tlSmooth)
|
||||||
{
|
{
|
||||||
// Read absolute value of first layer speed, if given as percentage,
|
// Read absolute value of first layer speed, if given as percentage,
|
||||||
// it is taken over following default. Speeds from config are not
|
// it is taken over following default. Speeds from config are not
|
||||||
|
|
|
@ -574,7 +574,7 @@ enum class EnforcerBlockerType : int8_t {
|
||||||
Extruder13,
|
Extruder13,
|
||||||
Extruder14,
|
Extruder14,
|
||||||
Extruder15,
|
Extruder15,
|
||||||
ExtruderMax = Extruder15,
|
ExtruderMax
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class ConversionType : int {
|
enum class ConversionType : int {
|
||||||
|
|
|
@ -643,7 +643,7 @@ std::string Preset::get_filament_type(std::string &display_filament_type)
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::vector<std::string> s_Preset_print_options {
|
static std::vector<std::string> s_Preset_print_options {
|
||||||
"layer_height", "initial_layer_print_height", "wall_loops", "spiral_mode",
|
"layer_height", "initial_layer_print_height", "wall_loops", "slice_closing_radius", "spiral_mode",
|
||||||
"top_shell_layers", "top_shell_thickness", "bottom_shell_layers", "bottom_shell_thickness",
|
"top_shell_layers", "top_shell_thickness", "bottom_shell_layers", "bottom_shell_thickness",
|
||||||
"reduce_crossing_wall", "detect_thin_wall", "detect_overhang_wall",
|
"reduce_crossing_wall", "detect_thin_wall", "detect_overhang_wall",
|
||||||
"seam_position", "wall_infill_order", "sparse_infill_density", "sparse_infill_pattern", "top_surface_pattern", "bottom_surface_pattern",
|
"seam_position", "wall_infill_order", "sparse_infill_density", "sparse_infill_pattern", "top_surface_pattern", "bottom_surface_pattern",
|
||||||
|
@ -683,7 +683,8 @@ static std::vector<std::string> s_Preset_print_options {
|
||||||
"gcode_add_line_number", "enable_arc_fitting", "infill_combination", "adaptive_layer_height",
|
"gcode_add_line_number", "enable_arc_fitting", "infill_combination", "adaptive_layer_height",
|
||||||
"support_bottom_interface_spacing", "enable_overhang_speed", "overhang_1_4_speed", "overhang_2_4_speed", "overhang_3_4_speed", "overhang_4_4_speed",
|
"support_bottom_interface_spacing", "enable_overhang_speed", "overhang_1_4_speed", "overhang_2_4_speed", "overhang_3_4_speed", "overhang_4_4_speed",
|
||||||
"initial_layer_infill_speed", "only_one_wall_top", "only_one_wall_first_layer",
|
"initial_layer_infill_speed", "only_one_wall_top", "only_one_wall_first_layer",
|
||||||
"timelapse_no_toolhead"
|
"timelapse_type"
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static std::vector<std::string> s_Preset_filament_options {
|
static std::vector<std::string> s_Preset_filament_options {
|
||||||
|
@ -755,6 +756,7 @@ static std::vector<std::string> s_Preset_sla_print_options {
|
||||||
"support_object_elevation",
|
"support_object_elevation",
|
||||||
"support_points_density_relative",
|
"support_points_density_relative",
|
||||||
"support_points_minimal_distance",
|
"support_points_minimal_distance",
|
||||||
|
"slice_closing_radius",
|
||||||
"pad_enable",
|
"pad_enable",
|
||||||
"pad_wall_thickness",
|
"pad_wall_thickness",
|
||||||
"pad_wall_height",
|
"pad_wall_height",
|
||||||
|
|
|
@ -1758,7 +1758,7 @@ const WipeTowerData& Print::wipe_tower_data(size_t filaments_cnt) const
|
||||||
|
|
||||||
bool Print::enable_timelapse_print() const
|
bool Print::enable_timelapse_print() const
|
||||||
{
|
{
|
||||||
return m_config.timelapse_no_toolhead.value;
|
return m_config.timelapse_type.value == TimelapseType::tlSmooth;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Print::_make_wipe_tower()
|
void Print::_make_wipe_tower()
|
||||||
|
@ -1779,11 +1779,10 @@ void Print::_make_wipe_tower()
|
||||||
// BBS: priming logic is removed, so don't consider it in tool ordering
|
// BBS: priming logic is removed, so don't consider it in tool ordering
|
||||||
m_wipe_tower_data.tool_ordering = ToolOrdering(*this, (unsigned int)-1, false);
|
m_wipe_tower_data.tool_ordering = ToolOrdering(*this, (unsigned int)-1, false);
|
||||||
|
|
||||||
// if enable_timelapse_print(), update all layer_tools parameters(has_wipe_tower, wipe_tower_partitions)
|
// if enable_timelapse_print(), update all layer_tools parameters: wipe_tower_partitions
|
||||||
if (enable_timelapse_print()) {
|
if (enable_timelapse_print()) {
|
||||||
std::vector<LayerTools>& layer_tools_array = m_wipe_tower_data.tool_ordering.layer_tools();
|
std::vector<LayerTools>& layer_tools_array = m_wipe_tower_data.tool_ordering.layer_tools();
|
||||||
for (LayerTools& layer_tools : layer_tools_array) {
|
for (LayerTools& layer_tools : layer_tools_array) {
|
||||||
layer_tools.has_wipe_tower = true;
|
|
||||||
if (layer_tools.wipe_tower_partitions == 0) {
|
if (layer_tools.wipe_tower_partitions == 0) {
|
||||||
layer_tools.wipe_tower_partitions = 1;
|
layer_tools.wipe_tower_partitions = 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,35 @@
|
||||||
|
|
||||||
#include <float.h>
|
#include <float.h>
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
std::set<std::string> SplitStringAndRemoveDuplicateElement(const std::string &str, const std::string &separator)
|
||||||
|
{
|
||||||
|
std::set<std::string> result;
|
||||||
|
if (str.empty()) return result;
|
||||||
|
|
||||||
|
std::string strs = str + separator;
|
||||||
|
size_t pos;
|
||||||
|
size_t size = strs.size();
|
||||||
|
|
||||||
|
for (int i = 0; i < size; ++i) {
|
||||||
|
pos = strs.find(separator, i);
|
||||||
|
if (pos < size) {
|
||||||
|
std::string sub_str = strs.substr(i, pos - i);
|
||||||
|
result.insert(sub_str);
|
||||||
|
i = pos + separator.size() - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ReplaceString(std::string &resource_str, const std::string &old_str, const std::string &new_str)
|
||||||
|
{
|
||||||
|
std::string::size_type pos = 0;
|
||||||
|
while ((pos = resource_str.find(old_str)) != std::string::npos) { resource_str.replace(pos, old_str.length(), new_str); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
namespace Slic3r {
|
namespace Slic3r {
|
||||||
|
|
||||||
//! macro used to mark string used at localization,
|
//! macro used to mark string used at localization,
|
||||||
|
@ -204,6 +233,14 @@ static const t_config_enum_values s_keys_map_BrimType = {
|
||||||
};
|
};
|
||||||
CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(BrimType)
|
CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(BrimType)
|
||||||
|
|
||||||
|
// using 0,1,2 to compatible with old files
|
||||||
|
static const t_config_enum_values s_keys_map_TimelapseType = {
|
||||||
|
{"0", tlNone},
|
||||||
|
{"1", tlSmooth},
|
||||||
|
{"2", tlTraditional}
|
||||||
|
};
|
||||||
|
CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(TimelapseType)
|
||||||
|
|
||||||
static const t_config_enum_values s_keys_map_DraftShield = {
|
static const t_config_enum_values s_keys_map_DraftShield = {
|
||||||
{ "disabled", dsDisabled },
|
{ "disabled", dsDisabled },
|
||||||
{ "limited", dsLimited },
|
{ "limited", dsLimited },
|
||||||
|
@ -571,7 +608,7 @@ void PrintConfigDef::init_fff_params()
|
||||||
def->sidetext = L("%");
|
def->sidetext = L("%");
|
||||||
def->min = 0;
|
def->min = 0;
|
||||||
def->max = 100;
|
def->max = 100;
|
||||||
def->mode = comDevelop;
|
def->mode = comAdvanced;
|
||||||
def->set_default_value(new ConfigOptionInts { 100 });
|
def->set_default_value(new ConfigOptionInts { 100 });
|
||||||
|
|
||||||
def = this->add("overhang_fan_threshold", coEnums);
|
def = this->add("overhang_fan_threshold", coEnums);
|
||||||
|
@ -580,7 +617,7 @@ void PrintConfigDef::init_fff_params()
|
||||||
"Expressed as percentage which indicides how much width of the line without support from lower layer");
|
"Expressed as percentage which indicides how much width of the line without support from lower layer");
|
||||||
def->sidetext = L("");
|
def->sidetext = L("");
|
||||||
def->enum_keys_map = &s_keys_map_OverhangFanThreshold;
|
def->enum_keys_map = &s_keys_map_OverhangFanThreshold;
|
||||||
def->mode = comDevelop;
|
def->mode = comAdvanced;
|
||||||
def->enum_values.emplace_back("5%");
|
def->enum_values.emplace_back("5%");
|
||||||
def->enum_values.emplace_back("25%");
|
def->enum_values.emplace_back("25%");
|
||||||
def->enum_values.emplace_back("50%");
|
def->enum_values.emplace_back("50%");
|
||||||
|
@ -2130,16 +2167,24 @@ void PrintConfigDef::init_fff_params()
|
||||||
def->mode = comSimple;
|
def->mode = comSimple;
|
||||||
def->set_default_value(new ConfigOptionBool(false));
|
def->set_default_value(new ConfigOptionBool(false));
|
||||||
|
|
||||||
def = this->add("timelapse_no_toolhead", coBool);
|
def = this->add("timelapse_type", coEnum);
|
||||||
def->label = L("Timelapse");
|
def->label = L("Timelapse");
|
||||||
def->tooltip = L("If enabled, a timelapse video will be generated for each print. "
|
def->tooltip = L("If smooth or traditional mode is selected, a timelapse video will be generated for each print. "
|
||||||
"After each layer is printed, the toolhead will move to the excess chute, "
|
"After each layer is printed, a snapshot is taken with the chamber camera. "
|
||||||
"and then a snapshot is taken with the chamber camera. "
|
|
||||||
"All of these snapshots are composed into a timelapse video when printing completes. "
|
"All of these snapshots are composed into a timelapse video when printing completes. "
|
||||||
|
"If smooth mode is selected, the toolhead will move to the excess chute after each layer is printed "
|
||||||
|
"and then take a snapshot. "
|
||||||
"Since the melt filament may leak from the nozzle during the process of taking a snapshot, "
|
"Since the melt filament may leak from the nozzle during the process of taking a snapshot, "
|
||||||
"prime tower is required for nozzle priming.");
|
"prime tower is required for smooth mode to wipe nozzle.");
|
||||||
|
def->enum_keys_map = &ConfigOptionEnum<TimelapseType>::get_enum_values();
|
||||||
|
def->enum_values.emplace_back("0");
|
||||||
|
def->enum_values.emplace_back("1");
|
||||||
|
def->enum_values.emplace_back("2");
|
||||||
|
def->enum_labels.emplace_back(L("None"));
|
||||||
|
def->enum_labels.emplace_back(L("Smooth"));
|
||||||
|
def->enum_labels.emplace_back(L("Traditional"));
|
||||||
def->mode = comSimple;
|
def->mode = comSimple;
|
||||||
def->set_default_value(new ConfigOptionBool(false));
|
def->set_default_value(new ConfigOptionEnum<TimelapseType>(tlNone));
|
||||||
|
|
||||||
def = this->add("standby_temperature_delta", coInt);
|
def = this->add("standby_temperature_delta", coInt);
|
||||||
def->label = L("Temperature variation");
|
def->label = L("Temperature variation");
|
||||||
|
@ -2184,6 +2229,16 @@ void PrintConfigDef::init_fff_params()
|
||||||
def->mode = comDevelop;
|
def->mode = comDevelop;
|
||||||
def->set_default_value(new ConfigOptionBool(false));
|
def->set_default_value(new ConfigOptionBool(false));
|
||||||
|
|
||||||
|
def = this->add("slice_closing_radius", coFloat);
|
||||||
|
def->label = L("Slice gap closing radius");
|
||||||
|
def->category = L("Quality");
|
||||||
|
def->tooltip = L("Cracks smaller than 2x gap closing radius are being filled during the triangle mesh slicing. "
|
||||||
|
"The gap closing operation may reduce the final print resolution, therefore it is advisable to keep the value reasonably low.");
|
||||||
|
def->sidetext = L("mm");
|
||||||
|
def->min = 0;
|
||||||
|
def->mode = comAdvanced;
|
||||||
|
def->set_default_value(new ConfigOptionFloat(0.049));
|
||||||
|
|
||||||
def = this->add("enable_support", coBool);
|
def = this->add("enable_support", coBool);
|
||||||
//BBS: remove material behind support
|
//BBS: remove material behind support
|
||||||
def->label = L("Enable support");
|
def->label = L("Enable support");
|
||||||
|
@ -2621,6 +2676,7 @@ void PrintConfigDef::init_fff_params()
|
||||||
def->label = L("Wipe Distance");
|
def->label = L("Wipe Distance");
|
||||||
def->tooltip = L("Discribe how long the nozzle will move along the last path when retracting");
|
def->tooltip = L("Discribe how long the nozzle will move along the last path when retracting");
|
||||||
def->sidetext = L("mm");
|
def->sidetext = L("mm");
|
||||||
|
def->min = 0;
|
||||||
def->mode = comAdvanced;
|
def->mode = comAdvanced;
|
||||||
def->set_default_value(new ConfigOptionFloats { 2. });
|
def->set_default_value(new ConfigOptionFloats { 2. });
|
||||||
|
|
||||||
|
@ -3530,6 +3586,19 @@ void PrintConfigDef::handle_legacy(t_config_option_key &opt_key, std::string &va
|
||||||
opt_key = "compatible_process_expression_group";
|
opt_key = "compatible_process_expression_group";
|
||||||
} else if (opt_key == "cooling") {
|
} else if (opt_key == "cooling") {
|
||||||
opt_key = "slow_down_for_layer_cooling";
|
opt_key = "slow_down_for_layer_cooling";
|
||||||
|
} else if (opt_key == "timelapse_no_toolhead") {
|
||||||
|
opt_key = "timelapse_type";
|
||||||
|
} else if (opt_key == "different_settings_to_system") {
|
||||||
|
std::string copy_value = value;
|
||||||
|
copy_value.erase(std::remove(copy_value.begin(), copy_value.end(), '\"'), copy_value.end()); // remove '"' in string
|
||||||
|
std::set<std::string> split_keys = SplitStringAndRemoveDuplicateElement(copy_value, ";");
|
||||||
|
for (std::string split_key : split_keys) {
|
||||||
|
std::string copy_key = split_key, copy_value = "";
|
||||||
|
handle_legacy(copy_key, copy_value);
|
||||||
|
if (copy_key != split_key) {
|
||||||
|
ReplaceString(value, split_key, copy_key);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ignore the following obsolete configuration keys:
|
// Ignore the following obsolete configuration keys:
|
||||||
|
@ -3544,7 +3613,7 @@ void PrintConfigDef::handle_legacy(t_config_option_key &opt_key, std::string &va
|
||||||
, "support_sharp_tails","remove_small_overhangs", "support_with_sheath",
|
, "support_sharp_tails","remove_small_overhangs", "support_with_sheath",
|
||||||
"tree_support_branch_diameter_angle", "tree_support_collision_resolution",
|
"tree_support_branch_diameter_angle", "tree_support_collision_resolution",
|
||||||
"small_perimeter_speed", "max_volumetric_speed", "max_print_speed",
|
"small_perimeter_speed", "max_volumetric_speed", "max_print_speed",
|
||||||
"support_bottom_z_distance", "support_closing_radius", "slicing_mode", "slice_closing_radius",
|
"support_bottom_z_distance", "support_closing_radius", "slicing_mode",
|
||||||
"remove_freq_sweep", "remove_bed_leveling", "remove_extrusion_calibration",
|
"remove_freq_sweep", "remove_bed_leveling", "remove_extrusion_calibration",
|
||||||
"support_transition_line_width", "support_transition_speed", "bed_temperature", "bed_temperature_initial_layer",
|
"support_transition_line_width", "support_transition_speed", "bed_temperature", "bed_temperature_initial_layer",
|
||||||
"can_switch_nozzle_type", "can_add_auxiliary_fan", "extra_flush_volume", "spaghetti_detector"
|
"can_switch_nozzle_type", "can_add_auxiliary_fan", "extra_flush_volume", "spaghetti_detector"
|
||||||
|
@ -3656,8 +3725,11 @@ void DynamicPrintConfig::normalize_fdm(int used_filaments)
|
||||||
ConfigOptionBool* alh_opt = this->option<ConfigOptionBool>("adaptive_layer_height");
|
ConfigOptionBool* alh_opt = this->option<ConfigOptionBool>("adaptive_layer_height");
|
||||||
ConfigOptionEnum<PrintSequence>* ps_opt = this->option<ConfigOptionEnum<PrintSequence>>("print_sequence");
|
ConfigOptionEnum<PrintSequence>* ps_opt = this->option<ConfigOptionEnum<PrintSequence>>("print_sequence");
|
||||||
|
|
||||||
if (used_filaments == 1 || ps_opt->value == PrintSequence::ByObject)
|
ConfigOptionEnum<TimelapseType> *timelapse_opt = this->option<ConfigOptionEnum<TimelapseType>>("timelapse_type");
|
||||||
ept_opt->value = false;
|
if (timelapse_opt && timelapse_opt->value == TimelapseType::tlSmooth) {
|
||||||
|
if (used_filaments == 1 || ps_opt->value == PrintSequence::ByObject)
|
||||||
|
ept_opt->value = false;
|
||||||
|
}
|
||||||
|
|
||||||
if (ept_opt->value) {
|
if (ept_opt->value) {
|
||||||
if (islh_opt)
|
if (islh_opt)
|
||||||
|
|
|
@ -142,6 +142,12 @@ enum BrimType {
|
||||||
btOuterAndInner,
|
btOuterAndInner,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum TimelapseType {
|
||||||
|
tlNone,
|
||||||
|
tlSmooth,
|
||||||
|
tlTraditional
|
||||||
|
};
|
||||||
|
|
||||||
enum DraftShield {
|
enum DraftShield {
|
||||||
dsDisabled, dsLimited, dsEnabled
|
dsDisabled, dsLimited, dsEnabled
|
||||||
};
|
};
|
||||||
|
@ -249,6 +255,7 @@ CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(SeamPosition)
|
||||||
CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(SLADisplayOrientation)
|
CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(SLADisplayOrientation)
|
||||||
CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(SLAPillarConnectionMode)
|
CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(SLAPillarConnectionMode)
|
||||||
CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(BrimType)
|
CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(BrimType)
|
||||||
|
CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(TimelapseType)
|
||||||
CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(BedType)
|
CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(BedType)
|
||||||
CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(DraftShield)
|
CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(DraftShield)
|
||||||
CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(ForwardCompatibilitySubstitutionRule)
|
CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(ForwardCompatibilitySubstitutionRule)
|
||||||
|
@ -591,6 +598,7 @@ PRINT_CONFIG_CLASS_DEFINE(
|
||||||
((ConfigOptionFloat, raft_first_layer_expansion))
|
((ConfigOptionFloat, raft_first_layer_expansion))
|
||||||
((ConfigOptionInt, raft_layers))
|
((ConfigOptionInt, raft_layers))
|
||||||
((ConfigOptionEnum<SeamPosition>, seam_position))
|
((ConfigOptionEnum<SeamPosition>, seam_position))
|
||||||
|
((ConfigOptionFloat, slice_closing_radius))
|
||||||
((ConfigOptionBool, enable_support))
|
((ConfigOptionBool, enable_support))
|
||||||
// Automatic supports (generated based on support_threshold_angle).
|
// Automatic supports (generated based on support_threshold_angle).
|
||||||
((ConfigOptionEnum<SupportType>, support_type))
|
((ConfigOptionEnum<SupportType>, support_type))
|
||||||
|
@ -874,7 +882,7 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE(
|
||||||
// BBS: not in any preset, calculated before slicing
|
// BBS: not in any preset, calculated before slicing
|
||||||
((ConfigOptionBool, has_prime_tower))
|
((ConfigOptionBool, has_prime_tower))
|
||||||
((ConfigOptionFloat, nozzle_volume))
|
((ConfigOptionFloat, nozzle_volume))
|
||||||
((ConfigOptionBool, timelapse_no_toolhead))
|
((ConfigOptionEnum<TimelapseType>, timelapse_type))
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -900,6 +908,8 @@ PRINT_CONFIG_CLASS_DEFINE(
|
||||||
//Number of the layers needed for the exposure time fade [3;20]
|
//Number of the layers needed for the exposure time fade [3;20]
|
||||||
((ConfigOptionInt, faded_layers))/*= 10*/
|
((ConfigOptionInt, faded_layers))/*= 10*/
|
||||||
|
|
||||||
|
((ConfigOptionFloat, slice_closing_radius))
|
||||||
|
|
||||||
// Enabling or disabling support creation
|
// Enabling or disabling support creation
|
||||||
((ConfigOptionBool, supports_enable))
|
((ConfigOptionBool, supports_enable))
|
||||||
|
|
||||||
|
|
|
@ -680,7 +680,8 @@ bool PrintObject::invalidate_state_by_config_options(
|
||||||
//BBS
|
//BBS
|
||||||
|| opt_key == "adaptive_layer_height"
|
|| opt_key == "adaptive_layer_height"
|
||||||
|| opt_key == "raft_layers"
|
|| opt_key == "raft_layers"
|
||||||
|| opt_key == "raft_contact_distance") {
|
|| opt_key == "raft_contact_distance"
|
||||||
|
|| opt_key == "slice_closing_radius") {
|
||||||
steps.emplace_back(posSlice);
|
steps.emplace_back(posSlice);
|
||||||
} else if (
|
} else if (
|
||||||
opt_key == "elefant_foot_compensation"
|
opt_key == "elefant_foot_compensation"
|
||||||
|
|
|
@ -136,7 +136,7 @@ static std::vector<VolumeSlices> slice_volumes_inner(
|
||||||
slicing_ranges.reserve(layer_ranges.size());
|
slicing_ranges.reserve(layer_ranges.size());
|
||||||
|
|
||||||
MeshSlicingParamsEx params_base;
|
MeshSlicingParamsEx params_base;
|
||||||
params_base.closing_radius = g_config_slice_closing_radius;
|
params_base.closing_radius = print_object_config.slice_closing_radius.value;
|
||||||
params_base.extra_offset = 0;
|
params_base.extra_offset = 0;
|
||||||
params_base.trafo = object_trafo;
|
params_base.trafo = object_trafo;
|
||||||
//BBS: 0.0025mm is safe enough to simplify the data to speed slicing up for high-resolution model.
|
//BBS: 0.0025mm is safe enough to simplify the data to speed slicing up for high-resolution model.
|
||||||
|
@ -1040,7 +1040,7 @@ void PrintObject::slice_volumes()
|
||||||
if (min_growth < 0.f || elfoot > 0.f) {
|
if (min_growth < 0.f || elfoot > 0.f) {
|
||||||
// Apply the negative XY compensation. (the ones that is <0)
|
// Apply the negative XY compensation. (the ones that is <0)
|
||||||
ExPolygons trimming;
|
ExPolygons trimming;
|
||||||
static const float eps = float(scale_(g_config_slice_closing_radius) * 1.5);
|
static const float eps = float(scale_(m_config.slice_closing_radius.value) * 1.5);
|
||||||
if (elfoot > 0.f) {
|
if (elfoot > 0.f) {
|
||||||
lslices_1st_layer = offset_ex(layer->merged(eps), -eps);
|
lslices_1st_layer = offset_ex(layer->merged(eps), -eps);
|
||||||
trimming = Slic3r::elephant_foot_compensation(lslices_1st_layer,
|
trimming = Slic3r::elephant_foot_compensation(lslices_1st_layer,
|
||||||
|
|
|
@ -930,7 +930,8 @@ bool SLAPrintObject::invalidate_state_by_config_options(const std::vector<t_conf
|
||||||
|| opt_key == "supports_enable"
|
|| opt_key == "supports_enable"
|
||||||
|| opt_key == "support_object_elevation"
|
|| opt_key == "support_object_elevation"
|
||||||
|| opt_key == "pad_around_object"
|
|| opt_key == "pad_around_object"
|
||||||
|| opt_key == "pad_around_object_everywhere") {
|
|| opt_key == "pad_around_object_everywhere"
|
||||||
|
|| opt_key == "slice_closing_radius") {
|
||||||
steps.emplace_back(slaposObjectSlice);
|
steps.emplace_back(slaposObjectSlice);
|
||||||
} else if (
|
} else if (
|
||||||
opt_key == "support_points_density_relative"
|
opt_key == "support_points_density_relative"
|
||||||
|
|
|
@ -518,7 +518,7 @@ void SLAPrint::Steps::slice_model(SLAPrintObject &po)
|
||||||
|
|
||||||
po.m_model_slices.clear();
|
po.m_model_slices.clear();
|
||||||
MeshSlicingParamsEx params;
|
MeshSlicingParamsEx params;
|
||||||
params.closing_radius = float(g_config_slice_closing_radius);
|
params.closing_radius = float(po.config().slice_closing_radius.value);
|
||||||
//BBS: always regular mode
|
//BBS: always regular mode
|
||||||
//switch (po.config().slicing_mode.value) {
|
//switch (po.config().slicing_mode.value) {
|
||||||
//case SlicingMode::Regular: params.mode = MeshSlicingParams::SlicingMode::Regular; break;
|
//case SlicingMode::Regular: params.mode = MeshSlicingParams::SlicingMode::Regular; break;
|
||||||
|
@ -749,7 +749,7 @@ void SLAPrint::Steps::slice_supports(SLAPrintObject &po) {
|
||||||
for(auto& rec : po.m_slice_index) heights.emplace_back(rec.slice_level());
|
for(auto& rec : po.m_slice_index) heights.emplace_back(rec.slice_level());
|
||||||
|
|
||||||
sd->support_slices = sd->support_tree_ptr->slice(
|
sd->support_slices = sd->support_tree_ptr->slice(
|
||||||
heights, float(g_config_slice_closing_radius));
|
heights, float(po.config().slice_closing_radius.value));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (size_t i = 0; i < sd->support_slices.size() && i < po.m_slice_index.size(); ++i)
|
for (size_t i = 0; i < sd->support_slices.size() && i < po.m_slice_index.size(); ++i)
|
||||||
|
|
|
@ -94,7 +94,6 @@ static constexpr bool RELATIVE_E_AXIS = 1;
|
||||||
static constexpr bool g_config_support_sharp_tails = true;
|
static constexpr bool g_config_support_sharp_tails = true;
|
||||||
static constexpr bool g_config_remove_small_overhangs = true;
|
static constexpr bool g_config_remove_small_overhangs = true;
|
||||||
static constexpr float g_config_tree_support_collision_resolution = 0.2;
|
static constexpr float g_config_tree_support_collision_resolution = 0.2;
|
||||||
static constexpr float g_config_slice_closing_radius = 0.049;
|
|
||||||
|
|
||||||
// Write slices as SVG images into out directory during the 2D processing of the slices.
|
// Write slices as SVG images into out directory during the 2D processing of the slices.
|
||||||
// #define SLIC3R_DEBUG_SLICE_PROCESSING
|
// #define SLIC3R_DEBUG_SLICE_PROCESSING
|
||||||
|
|
|
@ -344,6 +344,8 @@ set(SLIC3R_GUI_SOURCES
|
||||||
GUI/DesktopIntegrationDialog.hpp
|
GUI/DesktopIntegrationDialog.hpp
|
||||||
GUI/PublishDialog.cpp
|
GUI/PublishDialog.cpp
|
||||||
GUI/PublishDialog.hpp
|
GUI/PublishDialog.hpp
|
||||||
|
GUI/RecenterDialog.cpp
|
||||||
|
GUI/RecenterDialog.hpp
|
||||||
GUI/BindDialog.cpp
|
GUI/BindDialog.cpp
|
||||||
GUI/BindDialog.hpp
|
GUI/BindDialog.hpp
|
||||||
GUI/SelectMachine.hpp
|
GUI/SelectMachine.hpp
|
||||||
|
|
|
@ -12,7 +12,7 @@ static bool show_flag;
|
||||||
#define COMBOBOX_FILAMENT (m_comboBox_filament)
|
#define COMBOBOX_FILAMENT (m_comboBox_filament)
|
||||||
#endif
|
#endif
|
||||||
AMSMaterialsSetting::AMSMaterialsSetting(wxWindow *parent, wxWindowID id)
|
AMSMaterialsSetting::AMSMaterialsSetting(wxWindow *parent, wxWindowID id)
|
||||||
: DPIDialog(parent, id, _L("AMSMaterialsSetting"), wxDefaultPosition, wxDefaultSize, wxBORDER_NONE)
|
: DPIDialog(parent, id, _L("AMS Materials Setting"), wxDefaultPosition, wxDefaultSize, wxBORDER_NONE)
|
||||||
{
|
{
|
||||||
create();
|
create();
|
||||||
}
|
}
|
||||||
|
@ -44,6 +44,16 @@ void AMSMaterialsSetting::create()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
m_sizer_filament->Add(COMBOBOX_FILAMENT, 1, wxALIGN_CENTER, 0);
|
m_sizer_filament->Add(COMBOBOX_FILAMENT, 1, wxALIGN_CENTER, 0);
|
||||||
|
|
||||||
|
m_readonly_filament = new TextInput(this, wxEmptyString, "", "", wxDefaultPosition, AMS_MATERIALS_SETTING_COMBOX_WIDTH, wxTE_READONLY);
|
||||||
|
m_readonly_filament->SetBorderColor(StateColor(std::make_pair(0xDBDBDB, (int)StateColor::Focused), std::make_pair(0x00AE42, (int)StateColor::Hovered),
|
||||||
|
std::make_pair(0xDBDBDB, (int)StateColor::Normal)));
|
||||||
|
m_readonly_filament->GetTextCtrl()->Bind(wxEVT_SET_FOCUS, [](auto& e) {
|
||||||
|
;
|
||||||
|
});
|
||||||
|
m_sizer_filament->Add(m_readonly_filament, 1, wxALIGN_CENTER, 0);
|
||||||
|
m_readonly_filament->Hide();
|
||||||
|
|
||||||
wxBoxSizer *m_sizer_colour = new wxBoxSizer(wxHORIZONTAL);
|
wxBoxSizer *m_sizer_colour = new wxBoxSizer(wxHORIZONTAL);
|
||||||
|
|
||||||
m_title_colour = new wxStaticText(this, wxID_ANY, _L("Colour"), wxDefaultPosition, wxSize(AMS_MATERIALS_SETTING_LABEL_WIDTH, -1), 0);
|
m_title_colour = new wxStaticText(this, wxID_ANY, _L("Colour"), wxDefaultPosition, wxSize(AMS_MATERIALS_SETTING_LABEL_WIDTH, -1), 0);
|
||||||
|
@ -284,21 +294,12 @@ void AMSMaterialsSetting::update()
|
||||||
|
|
||||||
void AMSMaterialsSetting::enable_confirm_button(bool en)
|
void AMSMaterialsSetting::enable_confirm_button(bool en)
|
||||||
{
|
{
|
||||||
if (m_is_third) m_button_confirm->Show(en);
|
if (!m_is_third) return;
|
||||||
|
else {
|
||||||
//if (!en) {
|
m_button_confirm->Show(en);
|
||||||
// if (m_button_confirm->IsEnabled()) {
|
COMBOBOX_FILAMENT->Show(en);
|
||||||
// m_button_confirm->Disable();
|
m_readonly_filament->Show(!en);
|
||||||
// m_button_confirm->SetBackgroundColor(wxColour(0x90, 0x90, 0x90));
|
}
|
||||||
// m_button_confirm->SetBorderColor(wxColour(0x90, 0x90, 0x90));
|
|
||||||
// }
|
|
||||||
//} else {
|
|
||||||
// if (!m_button_confirm->IsEnabled()) {
|
|
||||||
// m_button_confirm->Enable();
|
|
||||||
// m_button_confirm->SetBackgroundColor(m_btn_bg_green);
|
|
||||||
// m_button_confirm->SetBorderColor(m_btn_bg_green);
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AMSMaterialsSetting::on_select_ok(wxCommandEvent &event)
|
void AMSMaterialsSetting::on_select_ok(wxCommandEvent &event)
|
||||||
|
@ -351,7 +352,7 @@ void AMSMaterialsSetting::set_color(wxColour color)
|
||||||
|
|
||||||
void AMSMaterialsSetting::on_clr_picker(wxCommandEvent & event)
|
void AMSMaterialsSetting::on_clr_picker(wxCommandEvent & event)
|
||||||
{
|
{
|
||||||
if(!m_is_third)
|
if(!m_is_third || obj->is_in_printing() || obj->can_resume())
|
||||||
return;
|
return;
|
||||||
auto clr_dialog = new wxColourDialog(this, m_clrData);
|
auto clr_dialog = new wxColourDialog(this, m_clrData);
|
||||||
show_flag = true;
|
show_flag = true;
|
||||||
|
@ -379,26 +380,23 @@ void AMSMaterialsSetting::Popup(wxString filament, wxString sn, wxString temp_mi
|
||||||
m_button_confirm->Hide();
|
m_button_confirm->Hide();
|
||||||
m_sn_number->SetLabel(sn);
|
m_sn_number->SetLabel(sn);
|
||||||
m_panel_SN->Show();
|
m_panel_SN->Show();
|
||||||
|
COMBOBOX_FILAMENT->Hide();
|
||||||
#ifdef __APPLE__
|
m_readonly_filament->Show();
|
||||||
wxArrayString filament_only;
|
m_readonly_filament->GetTextCtrl()->SetLabel("Bambu " + filament);
|
||||||
filament_only.push_back(filament);
|
|
||||||
COMBOBOX_FILAMENT->Set(filament_only);
|
|
||||||
#else
|
|
||||||
COMBOBOX_FILAMENT->Set(wxArrayString());
|
|
||||||
#endif
|
|
||||||
COMBOBOX_FILAMENT->SetValue(filament);
|
|
||||||
|
|
||||||
m_input_nozzle_min->GetTextCtrl()->SetValue(temp_min);
|
m_input_nozzle_min->GetTextCtrl()->SetValue(temp_min);
|
||||||
m_input_nozzle_max->GetTextCtrl()->SetValue(temp_max);
|
m_input_nozzle_max->GetTextCtrl()->SetValue(temp_max);
|
||||||
|
|
||||||
Layout();
|
Layout();
|
||||||
Fit();
|
Fit();
|
||||||
|
update();
|
||||||
ShowModal();
|
ShowModal();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_button_confirm->Show();
|
m_button_confirm->Show();
|
||||||
m_panel_SN->Hide();
|
m_panel_SN->Hide();
|
||||||
|
COMBOBOX_FILAMENT->Show();
|
||||||
|
m_readonly_filament->Hide();
|
||||||
Layout();
|
Layout();
|
||||||
Fit();
|
Fit();
|
||||||
|
|
||||||
|
@ -407,66 +405,68 @@ void AMSMaterialsSetting::Popup(wxString filament, wxString sn, wxString temp_mi
|
||||||
wxArrayString filament_items;
|
wxArrayString filament_items;
|
||||||
std::set<std::string> filament_id_set;
|
std::set<std::string> filament_id_set;
|
||||||
|
|
||||||
PresetBundle* preset_bundle = wxGetApp().preset_bundle;
|
PresetBundle* preset_bundle = wxGetApp().preset_bundle;
|
||||||
if (preset_bundle) {
|
if (preset_bundle) {
|
||||||
BOOST_LOG_TRIVIAL(trace) << "system_preset_bundle filament number=" << preset_bundle->filaments.size();
|
BOOST_LOG_TRIVIAL(trace) << "system_preset_bundle filament number=" << preset_bundle->filaments.size();
|
||||||
for (auto filament_it = preset_bundle->filaments.begin(); filament_it != preset_bundle->filaments.end(); filament_it++) {
|
for (auto filament_it = preset_bundle->filaments.begin(); filament_it != preset_bundle->filaments.end(); filament_it++) {
|
||||||
|
// filter by system preset
|
||||||
|
if (!filament_it->is_system) continue;
|
||||||
|
|
||||||
|
for (auto printer_it = preset_bundle->printers.begin(); printer_it != preset_bundle->printers.end(); printer_it++) {
|
||||||
// filter by system preset
|
// filter by system preset
|
||||||
if (!filament_it->is_system) continue;
|
if (!printer_it->is_system) continue;
|
||||||
|
// get printer_model
|
||||||
|
ConfigOption* printer_model_opt = printer_it->config.option("printer_model");
|
||||||
|
ConfigOptionString* printer_model_str = dynamic_cast<ConfigOptionString*>(printer_model_opt);
|
||||||
|
if (!printer_model_str || !obj)
|
||||||
|
continue;
|
||||||
|
|
||||||
for (auto printer_it = preset_bundle->printers.begin(); printer_it != preset_bundle->printers.end(); printer_it++) {
|
// use printer_model as printer type
|
||||||
// filter by system preset
|
if (printer_model_str->value != MachineObject::get_preset_printer_model_name(obj->printer_type))
|
||||||
if (!printer_it->is_system) continue;
|
continue;
|
||||||
// get printer_model
|
ConfigOption* printer_opt = filament_it->config.option("compatible_printers");
|
||||||
ConfigOption* printer_model_opt = printer_it->config.option("printer_model");
|
ConfigOptionStrings* printer_strs = dynamic_cast<ConfigOptionStrings*>(printer_opt);
|
||||||
ConfigOptionString* printer_model_str = dynamic_cast<ConfigOptionString*>(printer_model_opt);
|
for (auto printer_str : printer_strs->values) {
|
||||||
if (!printer_model_str || !obj)
|
if (printer_it->name == printer_str) {
|
||||||
continue;
|
if (filament_id_set.find(filament_it->filament_id) != filament_id_set.end()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
filament_id_set.insert(filament_it->filament_id);
|
||||||
|
// name matched
|
||||||
|
filament_items.push_back(filament_it->alias);
|
||||||
|
if (filament_it->filament_id == ams_filament_id) {
|
||||||
|
selection_idx = idx;
|
||||||
|
|
||||||
// use printer_model as printer type
|
// update if nozzle_temperature_range is found
|
||||||
if (printer_model_str->value != MachineObject::get_preset_printer_model_name(obj->printer_type))
|
ConfigOption* opt_min = filament_it->config.option("nozzle_temperature_range_low");
|
||||||
continue;
|
if (opt_min) {
|
||||||
ConfigOption* printer_opt = filament_it->config.option("compatible_printers");
|
ConfigOptionInts* opt_min_ints = dynamic_cast<ConfigOptionInts*>(opt_min);
|
||||||
ConfigOptionStrings* printer_strs = dynamic_cast<ConfigOptionStrings*>(printer_opt);
|
if (opt_min_ints) {
|
||||||
for (auto printer_str : printer_strs->values) {
|
wxString text_nozzle_temp_min = wxString::Format("%d", opt_min_ints->get_at(0));
|
||||||
if (printer_it->name == printer_str) {
|
m_input_nozzle_min->GetTextCtrl()->SetValue(text_nozzle_temp_min);
|
||||||
if (filament_id_set.find(filament_it->filament_id) != filament_id_set.end()) {
|
}
|
||||||
continue;
|
}
|
||||||
} else {
|
ConfigOption* opt_max = filament_it->config.option("nozzle_temperature_range_high");
|
||||||
filament_id_set.insert(filament_it->filament_id);
|
if (opt_max) {
|
||||||
// name matched
|
ConfigOptionInts* opt_max_ints = dynamic_cast<ConfigOptionInts*>(opt_max);
|
||||||
filament_items.push_back(filament_it->alias);
|
if (opt_max_ints) {
|
||||||
if (filament_it->filament_id == ams_filament_id) {
|
wxString text_nozzle_temp_max = wxString::Format("%d", opt_max_ints->get_at(0));
|
||||||
selection_idx = idx;
|
m_input_nozzle_max->GetTextCtrl()->SetValue(text_nozzle_temp_max);
|
||||||
|
|
||||||
// update if nozzle_temperature_range is found
|
|
||||||
ConfigOption* opt_min = filament_it->config.option("nozzle_temperature_range_low");
|
|
||||||
if(opt_min) {
|
|
||||||
ConfigOptionInts* opt_min_ints = dynamic_cast<ConfigOptionInts*>(opt_min);
|
|
||||||
if (opt_min_ints) {
|
|
||||||
wxString text_nozzle_temp_min = wxString::Format("%d", opt_min_ints->get_at(0));
|
|
||||||
m_input_nozzle_min->GetTextCtrl()->SetValue(text_nozzle_temp_min);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ConfigOption* opt_max = filament_it->config.option("nozzle_temperature_range_high");
|
|
||||||
if (opt_max) {
|
|
||||||
ConfigOptionInts* opt_max_ints = dynamic_cast<ConfigOptionInts*>(opt_max);
|
|
||||||
if (opt_max_ints) {
|
|
||||||
wxString text_nozzle_temp_max = wxString::Format("%d", opt_max_ints->get_at(0));
|
|
||||||
m_input_nozzle_max->GetTextCtrl()->SetValue(text_nozzle_temp_max);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
idx++;
|
|
||||||
}
|
}
|
||||||
|
idx++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
COMBOBOX_FILAMENT->Set(filament_items);
|
COMBOBOX_FILAMENT->Set(filament_items);
|
||||||
COMBOBOX_FILAMENT->SetSelection(selection_idx);
|
COMBOBOX_FILAMENT->SetSelection(selection_idx);
|
||||||
post_select_event();
|
post_select_event();
|
||||||
}
|
}
|
||||||
|
|
||||||
update();
|
update();
|
||||||
ShowModal();
|
ShowModal();
|
||||||
}
|
}
|
||||||
|
|
|
@ -84,12 +84,12 @@ protected:
|
||||||
Button * m_button_close;
|
Button * m_button_close;
|
||||||
Button * m_clr_picker;
|
Button * m_clr_picker;
|
||||||
wxColourData * m_clrData;
|
wxColourData * m_clrData;
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
wxComboBox *m_comboBox_filament_mac;
|
wxComboBox *m_comboBox_filament_mac;
|
||||||
#else
|
#else
|
||||||
ComboBox *m_comboBox_filament;
|
ComboBox *m_comboBox_filament;
|
||||||
#endif
|
#endif
|
||||||
|
TextInput* m_readonly_filament;
|
||||||
};
|
};
|
||||||
|
|
||||||
}} // namespace Slic3r::GUI
|
}} // namespace Slic3r::GUI
|
||||||
|
|
|
@ -253,6 +253,8 @@ void AMSSetting::on_insert_material_read(wxCommandEvent &event)
|
||||||
m_sizer_Insert_material_tip_inline->Layout();
|
m_sizer_Insert_material_tip_inline->Layout();
|
||||||
Layout();
|
Layout();
|
||||||
Fit();
|
Fit();
|
||||||
|
|
||||||
|
event.Skip();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AMSSetting::on_starting_read(wxCommandEvent &event)
|
void AMSSetting::on_starting_read(wxCommandEvent &event)
|
||||||
|
@ -276,6 +278,8 @@ void AMSSetting::on_starting_read(wxCommandEvent &event)
|
||||||
m_sizer_starting_tip_inline->Layout();
|
m_sizer_starting_tip_inline->Layout();
|
||||||
Layout();
|
Layout();
|
||||||
Fit();
|
Fit();
|
||||||
|
|
||||||
|
event.Skip();
|
||||||
}
|
}
|
||||||
|
|
||||||
wxString AMSSetting::append_title(wxString text)
|
wxString AMSSetting::append_title(wxString text)
|
||||||
|
|
|
@ -526,7 +526,7 @@ AmsMapingTipPopup::AmsMapingTipPopup(wxWindow *parent)
|
||||||
|
|
||||||
m_sizer_body->Add(0, 0, 0, wxEXPAND | wxLEFT, FromDIP(20));
|
m_sizer_body->Add(0, 0, 0, wxEXPAND | wxLEFT, FromDIP(20));
|
||||||
|
|
||||||
m_panel_enable_ams = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(200, -1), wxTAB_TRAVERSAL);
|
m_panel_enable_ams = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(FromDIP(220), -1), wxTAB_TRAVERSAL);
|
||||||
m_panel_enable_ams->SetBackgroundColour(*wxWHITE);
|
m_panel_enable_ams->SetBackgroundColour(*wxWHITE);
|
||||||
wxBoxSizer *sizer_enable_ams = new wxBoxSizer(wxVERTICAL);
|
wxBoxSizer *sizer_enable_ams = new wxBoxSizer(wxVERTICAL);
|
||||||
|
|
||||||
|
@ -536,8 +536,9 @@ AmsMapingTipPopup::AmsMapingTipPopup(wxWindow *parent)
|
||||||
sizer_enable_ams->Add(m_title_enable_ams, 0, 0, 0);
|
sizer_enable_ams->Add(m_title_enable_ams, 0, 0, 0);
|
||||||
|
|
||||||
m_tip_enable_ams = new wxStaticText(m_panel_enable_ams, wxID_ANY, _L("Print with filaments in the AMS"), wxDefaultPosition, wxDefaultSize, 0);
|
m_tip_enable_ams = new wxStaticText(m_panel_enable_ams, wxID_ANY, _L("Print with filaments in the AMS"), wxDefaultPosition, wxDefaultSize, 0);
|
||||||
|
m_tip_enable_ams->SetMinSize(wxSize(FromDIP(200), FromDIP(50)));
|
||||||
|
m_tip_enable_ams->Wrap(FromDIP(200));
|
||||||
m_tip_enable_ams->SetBackgroundColour(*wxWHITE);
|
m_tip_enable_ams->SetBackgroundColour(*wxWHITE);
|
||||||
m_tip_enable_ams->Wrap(-1);
|
|
||||||
sizer_enable_ams->Add(m_tip_enable_ams, 0, wxTOP, 8);
|
sizer_enable_ams->Add(m_tip_enable_ams, 0, wxTOP, 8);
|
||||||
|
|
||||||
wxBoxSizer *sizer_enable_ams_img;
|
wxBoxSizer *sizer_enable_ams_img;
|
||||||
|
@ -558,7 +559,7 @@ AmsMapingTipPopup::AmsMapingTipPopup(wxWindow *parent)
|
||||||
|
|
||||||
m_sizer_body->Add(m_split_lines, 0, wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT, FromDIP(10));
|
m_sizer_body->Add(m_split_lines, 0, wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT, FromDIP(10));
|
||||||
|
|
||||||
m_panel_disable_ams = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(200, -1), wxTAB_TRAVERSAL);
|
m_panel_disable_ams = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(FromDIP(220), -1), wxTAB_TRAVERSAL);
|
||||||
m_panel_disable_ams->SetBackgroundColour(*wxWHITE);
|
m_panel_disable_ams->SetBackgroundColour(*wxWHITE);
|
||||||
wxBoxSizer *sizer_disable_ams;
|
wxBoxSizer *sizer_disable_ams;
|
||||||
sizer_disable_ams = new wxBoxSizer(wxVERTICAL);
|
sizer_disable_ams = new wxBoxSizer(wxVERTICAL);
|
||||||
|
@ -569,8 +570,9 @@ AmsMapingTipPopup::AmsMapingTipPopup(wxWindow *parent)
|
||||||
sizer_disable_ams->Add(m_title_disable_ams, 0, 0, 0);
|
sizer_disable_ams->Add(m_title_disable_ams, 0, 0, 0);
|
||||||
|
|
||||||
m_tip_disable_ams = new wxStaticText(m_panel_disable_ams, wxID_ANY, _L("Print with the filament mounted on the back of chassis"), wxDefaultPosition, wxDefaultSize, 0);
|
m_tip_disable_ams = new wxStaticText(m_panel_disable_ams, wxID_ANY, _L("Print with the filament mounted on the back of chassis"), wxDefaultPosition, wxDefaultSize, 0);
|
||||||
|
m_tip_disable_ams->SetMinSize(wxSize(FromDIP(200), FromDIP(50)));
|
||||||
|
m_tip_disable_ams->Wrap(FromDIP(200));
|
||||||
m_tip_disable_ams->SetBackgroundColour(*wxWHITE);
|
m_tip_disable_ams->SetBackgroundColour(*wxWHITE);
|
||||||
m_tip_disable_ams->Wrap(-1);
|
|
||||||
sizer_disable_ams->Add(m_tip_disable_ams, 0, wxTOP, FromDIP(8));
|
sizer_disable_ams->Add(m_tip_disable_ams, 0, wxTOP, FromDIP(8));
|
||||||
|
|
||||||
wxBoxSizer *sizer_disable_ams_img;
|
wxBoxSizer *sizer_disable_ams_img;
|
||||||
|
|
|
@ -356,6 +356,7 @@ MachineObject::MachineObject(NetworkAgent* agent, std::string name, std::string
|
||||||
mc_print_percent = 0;
|
mc_print_percent = 0;
|
||||||
mc_print_sub_stage = 0;
|
mc_print_sub_stage = 0;
|
||||||
mc_left_time = 0;
|
mc_left_time = 0;
|
||||||
|
home_flag = -1;
|
||||||
printing_speed_lvl = PrintingSpeedLevel::SPEED_LEVEL_INVALID;
|
printing_speed_lvl = PrintingSpeedLevel::SPEED_LEVEL_INVALID;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1026,6 +1027,22 @@ bool MachineObject::is_system_printing()
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool MachineObject::is_axis_at_home(std::string axis)
|
||||||
|
{
|
||||||
|
if (home_flag < 0)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (axis == "X") {
|
||||||
|
return home_flag & 1 == 1;
|
||||||
|
} else if (axis == "Y") {
|
||||||
|
return home_flag >> 1 & 1 == 1;
|
||||||
|
} else if (axis == "Z") {
|
||||||
|
return home_flag >> 2 & 1 == 1;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
wxString MachineObject::get_curr_stage()
|
wxString MachineObject::get_curr_stage()
|
||||||
{
|
{
|
||||||
if (stage_list_info.empty()) {
|
if (stage_list_info.empty()) {
|
||||||
|
@ -1315,6 +1332,10 @@ int MachineObject::command_ams_user_settings(int ams_id, bool start_read_opt, bo
|
||||||
j["print"]["startup_read_option"] = start_read_opt;
|
j["print"]["startup_read_option"] = start_read_opt;
|
||||||
j["print"]["tray_read_option"] = tray_read_opt;
|
j["print"]["tray_read_option"] = tray_read_opt;
|
||||||
|
|
||||||
|
ams_insert_flag = tray_read_opt;
|
||||||
|
ams_power_on_flag = start_read_opt;
|
||||||
|
ams_user_setting_hold_count = HOLD_COUNT_MAX;
|
||||||
|
|
||||||
return this->publish_json(j.dump());
|
return this->publish_json(j.dump());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1399,11 +1420,11 @@ int MachineObject::command_set_printing_speed(PrintingSpeedLevel lvl)
|
||||||
|
|
||||||
int MachineObject::command_axis_control(std::string axis, double unit, double value, int speed)
|
int MachineObject::command_axis_control(std::string axis, double unit, double value, int speed)
|
||||||
{
|
{
|
||||||
char cmd[64];
|
char cmd[256];
|
||||||
if (axis.compare("X") == 0
|
if (axis.compare("X") == 0
|
||||||
|| axis.compare("Y") == 0
|
|| axis.compare("Y") == 0
|
||||||
|| axis.compare("Z") == 0) {
|
|| axis.compare("Z") == 0) {
|
||||||
sprintf(cmd, "G91 \nG0 %s%0.1f F%d\n", axis.c_str(), value * unit, speed);
|
sprintf(cmd, "M211 S \nM211 X1 Y1 Z1\nM1002 push_ref_mode\nG91 \nG1 %s%0.1f F%d\nM1002 pop_ref_mode\nM211 R\n", axis.c_str(), value * unit, speed);
|
||||||
}
|
}
|
||||||
else if (axis.compare("E") == 0) {
|
else if (axis.compare("E") == 0) {
|
||||||
sprintf(cmd, "M83 \nG0 %s%0.1f F%d\n", axis.c_str(), value * unit, speed);
|
sprintf(cmd, "M83 \nG0 %s%0.1f F%d\n", axis.c_str(), value * unit, speed);
|
||||||
|
@ -1799,6 +1820,10 @@ int MachineObject::parse_json(std::string payload)
|
||||||
print_type = jj["print_type"].get<std::string>();
|
print_type = jj["print_type"].get<std::string>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (jj.contains("home_flag")) {
|
||||||
|
home_flag = jj["home_flag"].get<int>();
|
||||||
|
}
|
||||||
|
|
||||||
if (jj.contains("mc_remaining_time")) {
|
if (jj.contains("mc_remaining_time")) {
|
||||||
if (jj["mc_remaining_time"].is_string())
|
if (jj["mc_remaining_time"].is_string())
|
||||||
mc_left_time = stoi(j["print"]["mc_remaining_time"].get<std::string>()) * 60;
|
mc_left_time = stoi(j["print"]["mc_remaining_time"].get<std::string>()) * 60;
|
||||||
|
@ -2261,16 +2286,21 @@ int MachineObject::parse_json(std::string payload)
|
||||||
if (jj["ams"].contains("tray_tar")) {
|
if (jj["ams"].contains("tray_tar")) {
|
||||||
m_tray_tar = jj["ams"]["tray_tar"].get<std::string>();
|
m_tray_tar = jj["ams"]["tray_tar"].get<std::string>();
|
||||||
}
|
}
|
||||||
if (jj["ams"].contains("insert_flag")) {
|
|
||||||
ams_insert_flag = jj["ams"]["insert_flag"].get<bool>();
|
|
||||||
}
|
|
||||||
if (jj["ams"].contains("ams_rfid_status"))
|
if (jj["ams"].contains("ams_rfid_status"))
|
||||||
ams_rfid_status = jj["ams"]["ams_rfid_status"].get<int>();
|
ams_rfid_status = jj["ams"]["ams_rfid_status"].get<int>();
|
||||||
|
|
||||||
if (jj["ams"].contains("power_on_flag")) {
|
if (jj["ams"].contains("insert_flag") || jj["ams"].contains("power_on_flag")) {
|
||||||
ams_power_on_flag = jj["ams"]["power_on_flag"].get<bool>();
|
if (ams_user_setting_hold_count > 0) {
|
||||||
|
ams_user_setting_hold_count--;
|
||||||
|
} else {
|
||||||
|
if (jj["ams"].contains("insert_flag")) {
|
||||||
|
ams_insert_flag = jj["ams"]["insert_flag"].get<bool>();
|
||||||
|
}
|
||||||
|
if (jj["ams"].contains("power_on_flag")) {
|
||||||
|
ams_power_on_flag = jj["ams"]["power_on_flag"].get<bool>();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ams_exist_bits != last_ams_exist_bits
|
if (ams_exist_bits != last_ams_exist_bits
|
||||||
|| last_tray_exist_bits != last_tray_exist_bits
|
|| last_tray_exist_bits != last_tray_exist_bits
|
||||||
|| tray_is_bbl_bits != last_is_bbl_bits
|
|| tray_is_bbl_bits != last_is_bbl_bits
|
||||||
|
|
|
@ -364,6 +364,7 @@ public:
|
||||||
bool ams_insert_flag { false };
|
bool ams_insert_flag { false };
|
||||||
bool ams_power_on_flag { false };
|
bool ams_power_on_flag { false };
|
||||||
bool ams_support_use_ams { false };
|
bool ams_support_use_ams { false };
|
||||||
|
int ams_user_setting_hold_count = 0;
|
||||||
AmsStatusMain ams_status_main;
|
AmsStatusMain ams_status_main;
|
||||||
int ams_status_sub;
|
int ams_status_sub;
|
||||||
int ams_version = 0;
|
int ams_version = 0;
|
||||||
|
@ -459,6 +460,7 @@ public:
|
||||||
int mc_print_percent; /* left print progess in percent */
|
int mc_print_percent; /* left print progess in percent */
|
||||||
int mc_left_time; /* left time in seconds */
|
int mc_left_time; /* left time in seconds */
|
||||||
int last_mc_print_stage;
|
int last_mc_print_stage;
|
||||||
|
int home_flag;
|
||||||
bool is_system_printing();
|
bool is_system_printing();
|
||||||
int print_error;
|
int print_error;
|
||||||
|
|
||||||
|
@ -467,6 +469,8 @@ public:
|
||||||
int m_push_count = 0;
|
int m_push_count = 0;
|
||||||
bool calibration_done { false };
|
bool calibration_done { false };
|
||||||
|
|
||||||
|
bool is_axis_at_home(std::string axis);
|
||||||
|
|
||||||
wxString get_curr_stage();
|
wxString get_curr_stage();
|
||||||
// return curr stage index of stage list
|
// return curr stage index of stage list
|
||||||
int get_curr_stage_idx();
|
int get_curr_stage_idx();
|
||||||
|
|
|
@ -1932,8 +1932,8 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re
|
||||||
auto co = dynamic_cast<const ConfigOptionEnum<PrintSequence>*>(m_config->option<ConfigOptionEnum<PrintSequence>>("print_sequence"));
|
auto co = dynamic_cast<const ConfigOptionEnum<PrintSequence>*>(m_config->option<ConfigOptionEnum<PrintSequence>>("print_sequence"));
|
||||||
|
|
||||||
const DynamicPrintConfig &dconfig = wxGetApp().preset_bundle->prints.get_edited_preset().config;
|
const DynamicPrintConfig &dconfig = wxGetApp().preset_bundle->prints.get_edited_preset().config;
|
||||||
const ConfigOption * option = dconfig.option("timelapse_no_toolhead");
|
auto timelapse_type = dconfig.option<ConfigOptionEnum<TimelapseType>>("timelapse_type");
|
||||||
bool timelapse_enabled = option ? option->getBool() : false;
|
bool timelapse_enabled = timelapse_type ? (timelapse_type->value == TimelapseType::tlSmooth) : false;
|
||||||
|
|
||||||
if (timelapse_enabled || (filaments_count > 1 && wt && co != nullptr && co->value != PrintSequence::ByObject)) {
|
if (timelapse_enabled || (filaments_count > 1 && wt && co != nullptr && co->value != PrintSequence::ByObject)) {
|
||||||
for (int plate_id = 0; plate_id < n_plates; plate_id++) {
|
for (int plate_id = 0; plate_id < n_plates; plate_id++) {
|
||||||
|
@ -2264,6 +2264,12 @@ void GLCanvas3D::on_char(wxKeyEvent& evt)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool is_in_painting_mode = false;
|
||||||
|
GLGizmoPainterBase *current_gizmo_painter = dynamic_cast<GLGizmoPainterBase *>(get_gizmos_manager().get_current());
|
||||||
|
if (current_gizmo_painter != nullptr) {
|
||||||
|
is_in_painting_mode = true;
|
||||||
|
}
|
||||||
|
|
||||||
//BBS: add orient deactivate logic
|
//BBS: add orient deactivate logic
|
||||||
if (keyCode == WXK_ESCAPE
|
if (keyCode == WXK_ESCAPE
|
||||||
&& (_deactivate_arrange_menu() || _deactivate_orient_menu()))
|
&& (_deactivate_arrange_menu() || _deactivate_orient_menu()))
|
||||||
|
@ -2281,7 +2287,8 @@ void GLCanvas3D::on_char(wxKeyEvent& evt)
|
||||||
#else /* __APPLE__ */
|
#else /* __APPLE__ */
|
||||||
case WXK_CONTROL_A:
|
case WXK_CONTROL_A:
|
||||||
#endif /* __APPLE__ */
|
#endif /* __APPLE__ */
|
||||||
post_event(SimpleEvent(EVT_GLCANVAS_SELECT_ALL));
|
if (!is_in_painting_mode)
|
||||||
|
post_event(SimpleEvent(EVT_GLCANVAS_SELECT_ALL));
|
||||||
break;
|
break;
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
case 'c':
|
case 'c':
|
||||||
|
@ -2289,7 +2296,8 @@ void GLCanvas3D::on_char(wxKeyEvent& evt)
|
||||||
#else /* __APPLE__ */
|
#else /* __APPLE__ */
|
||||||
case WXK_CONTROL_C:
|
case WXK_CONTROL_C:
|
||||||
#endif /* __APPLE__ */
|
#endif /* __APPLE__ */
|
||||||
post_event(SimpleEvent(EVT_GLTOOLBAR_COPY));
|
if (!is_in_painting_mode)
|
||||||
|
post_event(SimpleEvent(EVT_GLTOOLBAR_COPY));
|
||||||
break;
|
break;
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
case 'm':
|
case 'm':
|
||||||
|
@ -2325,7 +2333,8 @@ void GLCanvas3D::on_char(wxKeyEvent& evt)
|
||||||
#else /* __APPLE__ */
|
#else /* __APPLE__ */
|
||||||
case WXK_CONTROL_V:
|
case WXK_CONTROL_V:
|
||||||
#endif /* __APPLE__ */
|
#endif /* __APPLE__ */
|
||||||
post_event(SimpleEvent(EVT_GLTOOLBAR_PASTE));
|
if (!is_in_painting_mode)
|
||||||
|
post_event(SimpleEvent(EVT_GLTOOLBAR_PASTE));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
|
@ -2334,7 +2343,8 @@ void GLCanvas3D::on_char(wxKeyEvent& evt)
|
||||||
#else /* __APPLE__ */
|
#else /* __APPLE__ */
|
||||||
case WXK_CONTROL_X:
|
case WXK_CONTROL_X:
|
||||||
#endif /* __APPLE__ */
|
#endif /* __APPLE__ */
|
||||||
post_event(SimpleEvent(EVT_GLTOOLBAR_CUT));
|
if (!is_in_painting_mode)
|
||||||
|
post_event(SimpleEvent(EVT_GLTOOLBAR_CUT));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
|
@ -5845,14 +5855,14 @@ void GLCanvas3D::_check_and_update_toolbar_icon_scale()
|
||||||
{
|
{
|
||||||
|
|
||||||
#if ENABLE_RETINA_GL
|
#if ENABLE_RETINA_GL
|
||||||
IMSlider *m_layers_slider = get_gcode_viewer().get_layers_slider();
|
IMSlider* m_layers_slider = get_gcode_viewer().get_layers_slider();
|
||||||
IMSlider *m_moves_slider = get_gcode_viewer().get_moves_slider();
|
IMSlider* m_moves_slider = get_gcode_viewer().get_moves_slider();
|
||||||
const float sc = m_retina_helper->get_scale_factor();
|
const float sc = m_retina_helper->get_scale_factor();
|
||||||
m_layers_slider->set_scale(sc);
|
m_layers_slider->set_scale(sc);
|
||||||
m_moves_slider->set_scale(sc);
|
m_moves_slider->set_scale(sc);
|
||||||
m_gcode_viewer.set_scale(sc);
|
m_gcode_viewer.set_scale(sc);
|
||||||
|
|
||||||
auto *m_notification = wxGetApp().plater()->get_notification_manager();
|
auto* m_notification = wxGetApp().plater()->get_notification_manager();
|
||||||
m_notification->set_scale(sc);
|
m_notification->set_scale(sc);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -5877,7 +5887,7 @@ void GLCanvas3D::_check_and_update_toolbar_icon_scale()
|
||||||
collapse_toolbar.set_scale(sc);
|
collapse_toolbar.set_scale(sc);
|
||||||
size *= m_retina_helper->get_scale_factor();
|
size *= m_retina_helper->get_scale_factor();
|
||||||
|
|
||||||
auto *m_notification = wxGetApp().plater()->get_notification_manager();
|
auto* m_notification = wxGetApp().plater()->get_notification_manager();
|
||||||
m_notification->set_scale(sc);
|
m_notification->set_scale(sc);
|
||||||
#else
|
#else
|
||||||
//BBS: GUI refactor: GLToolbar
|
//BBS: GUI refactor: GLToolbar
|
||||||
|
@ -5892,12 +5902,20 @@ void GLCanvas3D::_check_and_update_toolbar_icon_scale()
|
||||||
float collapse_toolbar_width = collapse_toolbar.is_enabled() ? collapse_toolbar.get_width() : GLToolbar::Default_Icons_Size;
|
float collapse_toolbar_width = collapse_toolbar.is_enabled() ? collapse_toolbar.get_width() : GLToolbar::Default_Icons_Size;
|
||||||
|
|
||||||
float top_tb_width = m_main_toolbar.get_width() + m_gizmos.get_scaled_total_width() + m_assemble_view_toolbar.get_width() + m_separator_toolbar.get_width() + collapse_toolbar_width;
|
float top_tb_width = m_main_toolbar.get_width() + m_gizmos.get_scaled_total_width() + m_assemble_view_toolbar.get_width() + m_separator_toolbar.get_width() + collapse_toolbar_width;
|
||||||
int items_cnt = m_main_toolbar.get_visible_items_cnt() + m_gizmos.get_selectable_icons_cnt() + m_assemble_view_toolbar.get_visible_items_cnt() + m_separator_toolbar.get_visible_items_cnt() + collapse_toolbar.get_visible_items_cnt();
|
int items_cnt = m_main_toolbar.get_visible_items_cnt() + m_gizmos.get_selectable_icons_cnt() + m_assemble_view_toolbar.get_visible_items_cnt() + m_separator_toolbar.get_visible_items_cnt() + collapse_toolbar.get_visible_items_cnt();
|
||||||
float noitems_width = top_tb_width - size * items_cnt; // width of separators and borders in top toolbars
|
float noitems_width = top_tb_width - size * items_cnt; // width of separators and borders in top toolbars
|
||||||
|
|
||||||
// calculate scale needed for items in all top toolbars
|
// calculate scale needed for items in all top toolbars
|
||||||
|
#ifdef __WINDOWS__
|
||||||
|
cnv_size.set_width(cnv_size.get_width() + m_separator_toolbar.get_width() + collapse_toolbar_width);
|
||||||
|
#endif
|
||||||
float new_h_scale = (cnv_size.get_width() - noitems_width) / (items_cnt * GLToolbar::Default_Icons_Size);
|
float new_h_scale = (cnv_size.get_width() - noitems_width) / (items_cnt * GLToolbar::Default_Icons_Size);
|
||||||
|
|
||||||
|
//for protect
|
||||||
|
if (new_h_scale <= 0) {
|
||||||
|
new_h_scale = 1;
|
||||||
|
}
|
||||||
|
|
||||||
//use the same value as horizon
|
//use the same value as horizon
|
||||||
float new_v_scale = new_h_scale;
|
float new_v_scale = new_h_scale;
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -1590,7 +1590,7 @@ void GUI_App::init_networking_callbacks()
|
||||||
if (state == ConnectStatus::ConnectStatusOk) {
|
if (state == ConnectStatus::ConnectStatusOk) {
|
||||||
obj->command_request_push_all();
|
obj->command_request_push_all();
|
||||||
obj->command_get_version();
|
obj->command_get_version();
|
||||||
} else if (state == ConnectStatus::ConnectStatusFailed || ConnectStatus::ConnectStatusLost) {
|
} else if (state == ConnectStatus::ConnectStatusFailed) {
|
||||||
obj->set_access_code("");
|
obj->set_access_code("");
|
||||||
wxString text;
|
wxString text;
|
||||||
if (msg == "5") {
|
if (msg == "5") {
|
||||||
|
@ -1600,6 +1600,9 @@ void GUI_App::init_networking_callbacks()
|
||||||
text = wxString::Format(_L("Connect %s failed! [SN:%s, code=%s]"), from_u8(obj->dev_name), obj->dev_id, msg);
|
text = wxString::Format(_L("Connect %s failed! [SN:%s, code=%s]"), from_u8(obj->dev_name), obj->dev_id, msg);
|
||||||
wxGetApp().show_dialog(text);
|
wxGetApp().show_dialog(text);
|
||||||
}
|
}
|
||||||
|
} else if (state == ConnectStatus::ConnectStatusLost) {
|
||||||
|
m_device_manager->set_selected_machine("");
|
||||||
|
BOOST_LOG_TRIVIAL(info) << "set_on_local_connect_fn: state = lost";
|
||||||
} else {
|
} else {
|
||||||
BOOST_LOG_TRIVIAL(info) << "set_on_local_connect_fn: state = " << state;
|
BOOST_LOG_TRIVIAL(info) << "set_on_local_connect_fn: state = " << state;
|
||||||
}
|
}
|
||||||
|
@ -2007,19 +2010,36 @@ bool GUI_App::on_init_inner()
|
||||||
|
|
||||||
dialog.SetExtendedMessage(extmsg);*/
|
dialog.SetExtendedMessage(extmsg);*/
|
||||||
|
|
||||||
UpdateVersionDialog dialog(this->mainframe);
|
std::string skip_version_str = this->app_config->get("app", "skip_version");
|
||||||
wxString extmsg = wxString::FromUTF8(version_info.description);
|
bool skip_this_version = false;
|
||||||
dialog.update_version_info(extmsg, version_info.version_str);
|
if (!skip_version_str.empty()) {
|
||||||
switch (dialog.ShowModal())
|
BOOST_LOG_TRIVIAL(info) << "new version = " << version_info.version_str << ", skip version = " << skip_version_str;
|
||||||
{
|
if (version_info.version_str <= skip_version_str) {
|
||||||
case wxID_YES:
|
skip_this_version = true;
|
||||||
wxLaunchDefaultBrowser(version_info.url);
|
} else {
|
||||||
break;
|
app_config->set("skip_version", "");
|
||||||
case wxID_NO:
|
skip_this_version = false;
|
||||||
break;
|
}
|
||||||
default:
|
}
|
||||||
;
|
if (!skip_this_version
|
||||||
}
|
|| evt.GetInt() != 0) {
|
||||||
|
UpdateVersionDialog dialog(this->mainframe);
|
||||||
|
wxString extmsg = wxString::FromUTF8(version_info.description);
|
||||||
|
dialog.update_version_info(extmsg, version_info.version_str);
|
||||||
|
if (evt.GetInt() != 0) {
|
||||||
|
dialog.m_remind_choice->Hide();
|
||||||
|
}
|
||||||
|
switch (dialog.ShowModal())
|
||||||
|
{
|
||||||
|
case wxID_YES:
|
||||||
|
wxLaunchDefaultBrowser(version_info.url);
|
||||||
|
break;
|
||||||
|
case wxID_NO:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -3288,7 +3308,7 @@ void GUI_App::reset_to_active()
|
||||||
last_active_point = std::chrono::system_clock::now();
|
last_active_point = std::chrono::system_clock::now();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GUI_App::check_update(bool show_tips)
|
void GUI_App::check_update(bool show_tips, int by_user)
|
||||||
{
|
{
|
||||||
if (version_info.version_str.empty()) return;
|
if (version_info.version_str.empty()) return;
|
||||||
if (version_info.url.empty()) return;
|
if (version_info.url.empty()) return;
|
||||||
|
@ -3305,7 +3325,7 @@ void GUI_App::check_update(bool show_tips)
|
||||||
GUI::wxGetApp().enter_force_upgrade();
|
GUI::wxGetApp().enter_force_upgrade();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
GUI::wxGetApp().request_new_version();
|
GUI::wxGetApp().request_new_version(by_user);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
wxGetApp().app_config->set("upgrade", "force_upgrade", false);
|
wxGetApp().app_config->set("upgrade", "force_upgrade", false);
|
||||||
|
@ -3314,7 +3334,7 @@ void GUI_App::check_update(bool show_tips)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GUI_App::check_new_version(bool show_tips)
|
void GUI_App::check_new_version(bool show_tips, int by_user)
|
||||||
{
|
{
|
||||||
std::string platform = "windows";
|
std::string platform = "windows";
|
||||||
|
|
||||||
|
@ -3337,7 +3357,7 @@ void GUI_App::check_new_version(bool show_tips)
|
||||||
|
|
||||||
http.header("accept", "application/json")
|
http.header("accept", "application/json")
|
||||||
.timeout_max(10)
|
.timeout_max(10)
|
||||||
.on_complete([this, show_tips](std::string body, unsigned) {
|
.on_complete([this, show_tips, by_user](std::string body, unsigned) {
|
||||||
try {
|
try {
|
||||||
json j = json::parse(body);
|
json j = json::parse(body);
|
||||||
if (j.contains("message")) {
|
if (j.contains("message")) {
|
||||||
|
@ -3357,8 +3377,8 @@ void GUI_App::check_new_version(bool show_tips)
|
||||||
if (j["software"].contains("force_update")) {
|
if (j["software"].contains("force_update")) {
|
||||||
version_info.force_upgrade = j["software"]["force_update"].get<bool>();
|
version_info.force_upgrade = j["software"]["force_update"].get<bool>();
|
||||||
}
|
}
|
||||||
CallAfter([this, show_tips](){
|
CallAfter([this, show_tips, by_user](){
|
||||||
this->check_update(show_tips);
|
this->check_update(show_tips, by_user);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3377,10 +3397,11 @@ void GUI_App::check_new_version(bool show_tips)
|
||||||
|
|
||||||
|
|
||||||
//BBS pop up a dialog and download files
|
//BBS pop up a dialog and download files
|
||||||
void GUI_App::request_new_version()
|
void GUI_App::request_new_version(int by_user)
|
||||||
{
|
{
|
||||||
wxCommandEvent* evt = new wxCommandEvent(EVT_SLIC3R_VERSION_ONLINE);
|
wxCommandEvent* evt = new wxCommandEvent(EVT_SLIC3R_VERSION_ONLINE);
|
||||||
evt->SetString(GUI::from_u8(version_info.version_str));
|
evt->SetString(GUI::from_u8(version_info.version_str));
|
||||||
|
evt->SetInt(by_user);
|
||||||
GUI::wxGetApp().QueueEvent(evt);
|
GUI::wxGetApp().QueueEvent(evt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3390,6 +3411,16 @@ void GUI_App::enter_force_upgrade()
|
||||||
GUI::wxGetApp().QueueEvent(evt);
|
GUI::wxGetApp().QueueEvent(evt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GUI_App::set_skip_version(bool skip)
|
||||||
|
{
|
||||||
|
BOOST_LOG_TRIVIAL(info) << "set_skip_version, skip = " << skip << ", version = " <<version_info.version_str;
|
||||||
|
if (skip) {
|
||||||
|
app_config->set("skip_version", version_info.version_str);
|
||||||
|
}else {
|
||||||
|
app_config->set("skip_version", "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void GUI_App::no_new_version()
|
void GUI_App::no_new_version()
|
||||||
{
|
{
|
||||||
wxCommandEvent* evt = new wxCommandEvent(EVT_SHOW_NO_NEW_VERSION);
|
wxCommandEvent* evt = new wxCommandEvent(EVT_SHOW_NO_NEW_VERSION);
|
||||||
|
@ -4516,6 +4547,12 @@ void GUI_App::OSXStoreOpenFiles(const wxArrayString &fileNames)
|
||||||
// wxWidgets override to get an event on open files.
|
// wxWidgets override to get an event on open files.
|
||||||
void GUI_App::MacOpenFiles(const wxArrayString &fileNames)
|
void GUI_App::MacOpenFiles(const wxArrayString &fileNames)
|
||||||
{
|
{
|
||||||
|
if (m_post_initialized) {
|
||||||
|
std::vector<wxString> names;
|
||||||
|
for (auto & n : fileNames) names.push_back(n);
|
||||||
|
start_new_slicer(names);
|
||||||
|
return;
|
||||||
|
}
|
||||||
std::vector<std::string> files;
|
std::vector<std::string> files;
|
||||||
std::vector<wxString> gcode_files;
|
std::vector<wxString> gcode_files;
|
||||||
std::vector<wxString> non_gcode_files;
|
std::vector<wxString> non_gcode_files;
|
||||||
|
|
|
@ -143,6 +143,7 @@ public:
|
||||||
ver_items[i] = 0;
|
ver_items[i] = 0;
|
||||||
}
|
}
|
||||||
force_upgrade = false;
|
force_upgrade = false;
|
||||||
|
version_str = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
void parse_version_str(std::string str) {
|
void parse_version_str(std::string str) {
|
||||||
|
@ -388,10 +389,11 @@ public:
|
||||||
bool m_studio_active = true;
|
bool m_studio_active = true;
|
||||||
std::chrono::system_clock::time_point last_active_point;
|
std::chrono::system_clock::time_point last_active_point;
|
||||||
|
|
||||||
void check_update(bool show_tips);
|
void check_update(bool show_tips, int by_user);
|
||||||
void check_new_version(bool show_tips = false);
|
void check_new_version(bool show_tips = false, int by_user = 0);
|
||||||
void request_new_version();
|
void request_new_version(int by_user);
|
||||||
void enter_force_upgrade();
|
void enter_force_upgrade();
|
||||||
|
void set_skip_version(bool skip = true);
|
||||||
void no_new_version();
|
void no_new_version();
|
||||||
void show_dialog(wxString msg);
|
void show_dialog(wxString msg);
|
||||||
void reload_settings();
|
void reload_settings();
|
||||||
|
|
|
@ -1271,7 +1271,7 @@ void MenuFactory::append_menu_item_simplify(wxMenu* menu)
|
||||||
|
|
||||||
void MenuFactory::append_menu_item_per_object_settings(wxMenu* menu)
|
void MenuFactory::append_menu_item_per_object_settings(wxMenu* menu)
|
||||||
{
|
{
|
||||||
const std::vector<wxString> names = { _L("Per object edit"), _L("Edit print parameters for a single object") };
|
const std::vector<wxString> names = { _L("Edit in Parameter Table"), _L("Edit print parameters for a single object") };
|
||||||
// Delete old menu item
|
// Delete old menu item
|
||||||
for (const wxString& name : names) {
|
for (const wxString& name : names) {
|
||||||
const int item_id = menu->FindItem(name);
|
const int item_id = menu->FindItem(name);
|
||||||
|
|
|
@ -5052,9 +5052,7 @@ void ObjectList::apply_object_instance_transfrom_to_all_volumes(ModelObject *mod
|
||||||
model_object->ensure_on_bed();
|
model_object->ensure_on_bed();
|
||||||
// keep new instance center the same as the original center
|
// keep new instance center the same as the original center
|
||||||
model_object->translate(-original_instance_center);
|
model_object->translate(-original_instance_center);
|
||||||
model_object->origin_translation += original_instance_center;
|
model_object->translate_instances(original_instance_center);
|
||||||
model_object->translate_instances(model_object->origin_translation);
|
|
||||||
model_object->origin_translation = Vec3d::Zero();
|
|
||||||
|
|
||||||
// update the cache data in selection to keep the data of ModelVolume and GLVolume are consistent
|
// update the cache data in selection to keep the data of ModelVolume and GLVolume are consistent
|
||||||
wxGetApp().plater()->update();
|
wxGetApp().plater()->update();
|
||||||
|
|
|
@ -540,6 +540,29 @@ wxString GridCellSupportEditor::ms_stringValues[2] = { wxT(""), wxT("") };
|
||||||
|
|
||||||
void GridCellSupportEditor::DoActivate(int row, int col, wxGrid* grid)
|
void GridCellSupportEditor::DoActivate(int row, int col, wxGrid* grid)
|
||||||
{
|
{
|
||||||
|
ObjectGrid* local_table = dynamic_cast<ObjectGrid*>(grid);
|
||||||
|
wxGridBlocks cell_array = grid->GetSelectedBlocks();
|
||||||
|
|
||||||
|
auto left_col = cell_array.begin()->GetLeftCol();
|
||||||
|
auto right_col = cell_array.begin()->GetRightCol();
|
||||||
|
auto top_row = cell_array.begin()->GetTopRow();
|
||||||
|
auto bottom_row = cell_array.begin()->GetBottomRow();
|
||||||
|
|
||||||
|
if ((left_col == right_col) &&
|
||||||
|
(top_row == bottom_row)) {
|
||||||
|
wxGridCellBoolEditor::DoActivate(row, col, grid);
|
||||||
|
grid->SelectBlock(row, col, row, col, true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if( (left_col == right_col) &&
|
||||||
|
(top_row != bottom_row)){
|
||||||
|
|
||||||
|
for (auto i = top_row; i <= bottom_row; i++) {
|
||||||
|
//grid->GetTable()->SetValueAsBool(i, left_col, false);
|
||||||
|
wxGridCellBoolEditor::DoActivate(i, left_col, grid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
wxGridCellBoolEditor::DoActivate(row, col, grid);
|
wxGridCellBoolEditor::DoActivate(row, col, grid);
|
||||||
grid->SelectBlock(row, col, row, col, true);
|
grid->SelectBlock(row, col, row, col, true);
|
||||||
}
|
}
|
||||||
|
@ -672,8 +695,6 @@ void GridCellSupportRenderer::Draw(wxGrid& grid,
|
||||||
#endif // __WXOSX_MAC__
|
#endif // __WXOSX_MAC__
|
||||||
|
|
||||||
dc.DrawBitmap(check_on, rect.x + offsetx, rect.y + offsety);
|
dc.DrawBitmap(check_on, rect.x + offsetx, rect.y + offsety);
|
||||||
//dc.SetBrush(wxBrush(wxColour(0x00, 0xAE, 0x42)));
|
|
||||||
//dc.DrawBitmap(check_on, (width - check_on.GetSize().x) / 2, (height - check_on.GetSize().y) / 2);
|
|
||||||
} else {
|
} else {
|
||||||
auto check_off = create_scaled_bitmap("check_off_focused", nullptr, 18);
|
auto check_off = create_scaled_bitmap("check_off_focused", nullptr, 18);
|
||||||
dc.SetPen(*wxTRANSPARENT_PEN);
|
dc.SetPen(*wxTRANSPARENT_PEN);
|
||||||
|
@ -689,11 +710,7 @@ void GridCellSupportRenderer::Draw(wxGrid& grid,
|
||||||
offsety = (height - check_off.GetSize().y) / 2;
|
offsety = (height - check_off.GetSize().y) / 2;
|
||||||
#endif // __WXOSX_MAC__
|
#endif // __WXOSX_MAC__
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
dc.DrawBitmap(check_off, rect.x + offsetx, rect.y + offsety);
|
dc.DrawBitmap(check_off, rect.x + offsetx, rect.y + offsety);
|
||||||
//dc.SetBrush(wxBrush(wxColour(0x00, 0xAE, 0x42)));
|
|
||||||
//dc.DrawBitmap(check_off, (width - check_off.GetSize().x) / 2, (height - check_off.GetSize().y) / 2);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -730,10 +747,13 @@ wxBEGIN_EVENT_TABLE( ObjectGrid, wxGrid )
|
||||||
EVT_KEY_UP( ObjectGrid::OnKeyUp )
|
EVT_KEY_UP( ObjectGrid::OnKeyUp )
|
||||||
EVT_CHAR ( ObjectGrid::OnChar )
|
EVT_CHAR ( ObjectGrid::OnChar )
|
||||||
EVT_GRID_LABEL_LEFT_CLICK ( ObjectGrid::OnColHeadLeftClick )
|
EVT_GRID_LABEL_LEFT_CLICK ( ObjectGrid::OnColHeadLeftClick )
|
||||||
|
EVT_GRID_RANGE_SELECTED(ObjectGrid::OnRangeSelected)
|
||||||
wxEND_EVENT_TABLE()
|
wxEND_EVENT_TABLE()
|
||||||
|
|
||||||
bool ObjectGrid::OnCellLeftClick(wxGridEvent& event, int row, int col, ConfigOptionType type)
|
bool ObjectGrid::OnCellLeftClick(wxGridEvent& event, int row, int col, ConfigOptionType type)
|
||||||
{
|
{
|
||||||
|
input_string = wxEmptyString;
|
||||||
|
|
||||||
if (type != coBool)
|
if (type != coBool)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -819,6 +839,11 @@ bool ObjectGrid::OnCellLeftClick(wxGridEvent& event, int row, int col, ConfigOpt
|
||||||
return consumed;
|
return consumed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ObjectGrid::OnRangeSelected(wxGridRangeSelectEvent& ev)
|
||||||
|
{
|
||||||
|
ev.Skip();
|
||||||
|
}
|
||||||
|
|
||||||
void ObjectGrid::OnColHeadLeftClick(wxGridEvent& event)
|
void ObjectGrid::OnColHeadLeftClick(wxGridEvent& event)
|
||||||
{
|
{
|
||||||
bool consumed = false;
|
bool consumed = false;
|
||||||
|
@ -838,6 +863,87 @@ void ObjectGrid::OnColHeadLeftClick(wxGridEvent& event)
|
||||||
|
|
||||||
void ObjectGrid::OnKeyDown( wxKeyEvent& event )
|
void ObjectGrid::OnKeyDown( wxKeyEvent& event )
|
||||||
{
|
{
|
||||||
|
// see include/wx/defs.h enum wxKeyCode
|
||||||
|
int keyCode = event.GetKeyCode();
|
||||||
|
int ctrlMask = wxMOD_CONTROL;
|
||||||
|
int shiftMask = wxMOD_SHIFT;
|
||||||
|
// Coordinates of the selected block to copy to clipboard.
|
||||||
|
wxGridBlockCoords selection;
|
||||||
|
wxTextDataObject text_data;
|
||||||
|
|
||||||
|
if ((event.GetModifiers() & ctrlMask) != 0) {
|
||||||
|
// CTRL is pressed
|
||||||
|
switch (keyCode) {
|
||||||
|
case 'c':
|
||||||
|
case 'C':
|
||||||
|
{
|
||||||
|
// Check if we have any selected blocks and if we don't
|
||||||
|
// have too many of them.
|
||||||
|
const wxGridBlocks blocks = GetSelectedBlocks();
|
||||||
|
wxGridBlocks::iterator iter = blocks.begin();
|
||||||
|
if (iter == blocks.end())
|
||||||
|
{
|
||||||
|
// No selection, copy just the current cell.
|
||||||
|
if (m_currentCellCoords == wxGridNoCellCoords)
|
||||||
|
{
|
||||||
|
// But we don't even have it -- nothing to do then.
|
||||||
|
event.Skip();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
selection = wxGridBlockCoords(GetGridCursorRow(),
|
||||||
|
GetGridCursorCol(),
|
||||||
|
GetGridCursorRow(),
|
||||||
|
GetGridCursorCol());
|
||||||
|
}
|
||||||
|
else // We do have at least one selected block.
|
||||||
|
{
|
||||||
|
selection = *blocks.begin();
|
||||||
|
|
||||||
|
}
|
||||||
|
m_selected_block = selection;
|
||||||
|
|
||||||
|
ObjectGridTable* table = dynamic_cast<ObjectGridTable*>(this->GetTable());
|
||||||
|
|
||||||
|
if (GetGridCursorCol() == ObjectGridTable::col_printable ||
|
||||||
|
GetGridCursorCol() == ObjectGridTable::col_enable_support) {
|
||||||
|
m_cell_data = table->GetValueAsBool(GetGridCursorRow(), GetGridCursorCol()) ? wxT("1") : wxT("0");
|
||||||
|
}
|
||||||
|
else if (GetGridCursorCol() == ObjectGridTable::col_filaments) {
|
||||||
|
m_cell_data = table->GetValue(GetGridCursorRow(), GetGridCursorCol());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
m_cell_data = table->GetValue(GetGridCursorRow(), GetGridCursorCol());
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'v':
|
||||||
|
case 'V': {
|
||||||
|
wxTheClipboard->GetData(text_data);
|
||||||
|
|
||||||
|
if (!m_cell_data.empty()) {
|
||||||
|
text_data.SetText(m_cell_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
paste_data(text_data);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'f':
|
||||||
|
case 'F':
|
||||||
|
//TODO: search
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'z':
|
||||||
|
case 'Z':
|
||||||
|
//TODO:
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
event.Skip();
|
||||||
|
}
|
||||||
|
}
|
||||||
event.Skip();
|
event.Skip();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -942,20 +1048,21 @@ void ObjectGrid::paste_data( wxTextDataObject& text_data )
|
||||||
wxLogWarning(_L("one cell can only be copied to one or multiple cells in the same column"));
|
wxLogWarning(_L("one cell can only be copied to one or multiple cells in the same column"));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
split(buf, string_array);
|
split(buf, string_array);
|
||||||
wxString source_string = string_array[0];
|
wxString source_string = string_array[0];
|
||||||
if (string_array.GetCount() <= 0) {
|
if (string_array.GetCount() <= 0) {
|
||||||
BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << boost::format(", can not split pasted data %1%")%buf;
|
BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << boost::format(", can not split pasted data %1%") % buf;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for ( int i = 0; i < dst_row_cnt; i++ )
|
for (int i = 0; i < dst_row_cnt; i++)
|
||||||
{
|
{
|
||||||
if (!this->IsReadOnly(dst_top_row+i, dst_left_col)) {
|
if (!this->IsReadOnly(dst_top_row + i, dst_left_col)) {
|
||||||
grid_table->SetValue(dst_top_row+i, dst_left_col, source_string);
|
grid_table->SetValue(dst_top_row + i, dst_left_col, source_string);
|
||||||
grid_table->OnCellValueChanged(dst_top_row+i, dst_left_col);
|
grid_table->OnCellValueChanged(dst_top_row + i, dst_left_col);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
wxLogWarning(_L("multiple cells copy is not supported"));
|
wxLogWarning(_L("multiple cells copy is not supported"));
|
||||||
|
@ -983,74 +1090,14 @@ void ObjectGrid::paste_data( wxTextDataObject& text_data )
|
||||||
|
|
||||||
void ObjectGrid::OnKeyUp( wxKeyEvent& event )
|
void ObjectGrid::OnKeyUp( wxKeyEvent& event )
|
||||||
{
|
{
|
||||||
// see include/wx/defs.h enum wxKeyCode
|
event.Skip();
|
||||||
int keyCode = event.GetKeyCode();
|
|
||||||
int ctrlMask = wxMOD_CONTROL;
|
|
||||||
int shiftMask = wxMOD_SHIFT;
|
|
||||||
// Coordinates of the selected block to copy to clipboard.
|
|
||||||
wxGridBlockCoords selection;
|
|
||||||
wxTextDataObject text_data;
|
|
||||||
|
|
||||||
if ((event.GetModifiers() & ctrlMask) != 0) {
|
|
||||||
// CTRL is pressed
|
|
||||||
switch (keyCode) {
|
|
||||||
case 'c':
|
|
||||||
case 'C':
|
|
||||||
{
|
|
||||||
// Check if we have any selected blocks and if we don't
|
|
||||||
// have too many of them.
|
|
||||||
const wxGridBlocks blocks = GetSelectedBlocks();
|
|
||||||
wxGridBlocks::iterator iter = blocks.begin();
|
|
||||||
if (iter == blocks.end())
|
|
||||||
{
|
|
||||||
// No selection, copy just the current cell.
|
|
||||||
if (m_currentCellCoords == wxGridNoCellCoords)
|
|
||||||
{
|
|
||||||
// But we don't even have it -- nothing to do then.
|
|
||||||
event.Skip();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
selection = wxGridBlockCoords(GetGridCursorRow(),
|
|
||||||
GetGridCursorCol(),
|
|
||||||
GetGridCursorRow(),
|
|
||||||
GetGridCursorCol());
|
|
||||||
}
|
|
||||||
else // We do have at least one selected block.
|
|
||||||
{
|
|
||||||
selection = *blocks.begin();
|
|
||||||
|
|
||||||
}
|
|
||||||
m_selected_block = selection;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 'v':
|
|
||||||
case 'V':
|
|
||||||
//
|
|
||||||
wxTheClipboard->GetData(text_data);
|
|
||||||
paste_data(text_data);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'f':
|
|
||||||
case 'F':
|
|
||||||
//TODO: search
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'z':
|
|
||||||
case 'Z':
|
|
||||||
//TODO:
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
event.Skip();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectGrid::OnChar( wxKeyEvent& event )
|
void ObjectGrid::OnChar( wxKeyEvent& event ) {
|
||||||
{
|
auto keycode = event.GetKeyCode();
|
||||||
|
if (keycode >= 0x20 && keycode <= 0x7F) {
|
||||||
|
input_string = event.GetUnicodeKey();
|
||||||
|
}
|
||||||
event.Skip();
|
event.Skip();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1387,7 +1434,7 @@ void ObjectGridTable::update_volume_values_from_object(int row, int col)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
part_row->filaments = grid_row->filaments;
|
part_row->filaments = grid_row->filaments;
|
||||||
part_row->ori_filaments = grid_row->filaments;
|
//part_row->ori_filaments = grid_row->filaments;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
reload_part_data(part_row, grid_row, m_col_data[col]->category, global_config);
|
reload_part_data(part_row, grid_row, m_col_data[col]->category, global_config);
|
||||||
|
@ -1725,7 +1772,7 @@ wxString ObjectGridTable::convert_filament_string(int index, wxString& filament_
|
||||||
else
|
else
|
||||||
result_str = filament_str;
|
result_str = filament_str;
|
||||||
|
|
||||||
result_str = "";
|
//result_str = "";
|
||||||
return result_str;
|
return result_str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1762,7 +1809,7 @@ void ObjectGridTable::init_cols(ObjectGrid *object_grid)
|
||||||
|
|
||||||
//3th column: for object/volume name
|
//3th column: for object/volume name
|
||||||
col = new ObjectGridCol(coString, "name", ObjectGridTable::category_all, false, false, true, false, wxALIGN_LEFT);
|
col = new ObjectGridCol(coString, "name", ObjectGridTable::category_all, false, false, true, false, wxALIGN_LEFT);
|
||||||
col->size = 200;
|
//col->size = 200;
|
||||||
m_col_data.push_back(col);
|
m_col_data.push_back(col);
|
||||||
|
|
||||||
//object/volume extruder_id
|
//object/volume extruder_id
|
||||||
|
@ -1774,11 +1821,11 @@ void ObjectGridTable::init_cols(ObjectGrid *object_grid)
|
||||||
m_col_data.push_back(col);
|
m_col_data.push_back(col);
|
||||||
|
|
||||||
//reset icon for extruder_id
|
//reset icon for extruder_id
|
||||||
col = new ObjectGridCol(coEnum, "extruder_reset", ObjectGridTable::category_all, false, true, false, false, wxALIGN_CENTRE);
|
col = new ObjectGridCol(coString, "extruder_reset", ObjectGridTable::category_all, false, false, false, false, wxALIGN_CENTRE);
|
||||||
m_col_data.push_back(col);
|
m_col_data.push_back(col);
|
||||||
|
|
||||||
//object layer height
|
//object layer height
|
||||||
col = new ObjectGridCol(coFloat, "layer_height", L("Quality"), true, false, true, true, wxALIGN_CENTRE);
|
col = new ObjectGridCol(coFloat, "layer_height", L("Quality"), true, false, true, true, wxALIGN_LEFT);
|
||||||
col->size = object_grid->GetTextExtent(L("Layer height")).x - 28;
|
col->size = object_grid->GetTextExtent(L("Layer height")).x - 28;
|
||||||
m_col_data.push_back(col);
|
m_col_data.push_back(col);
|
||||||
|
|
||||||
|
@ -1825,8 +1872,8 @@ void ObjectGridTable::init_cols(ObjectGrid *object_grid)
|
||||||
m_col_data.push_back(col);
|
m_col_data.push_back(col);
|
||||||
|
|
||||||
//object/volume speed
|
//object/volume speed
|
||||||
col = new ObjectGridCol(coFloat, "inner_wall_speed", L("Speed"), false, false, true, true, wxALIGN_LEFT);
|
col = new ObjectGridCol(coFloat, "outer_wall_speed", L("Speed"), false, false, true, true, wxALIGN_LEFT);
|
||||||
col->size = object_grid->GetTextExtent(L("Inner wall speed")).x;
|
col->size = object_grid->GetTextExtent(L("Outer wall speed")).x;
|
||||||
m_col_data.push_back(col);
|
m_col_data.push_back(col);
|
||||||
|
|
||||||
//reset icon for speed
|
//reset icon for speed
|
||||||
|
@ -1886,7 +1933,7 @@ void ObjectGridTable::construct_object_configs(ObjectGrid *object_grid)
|
||||||
object_grid->filaments.value = 1;
|
object_grid->filaments.value = 1;
|
||||||
object_grid->config->set_key_value(m_col_data[col_filaments]->key, object_grid->filaments.clone());
|
object_grid->config->set_key_value(m_col_data[col_filaments]->key, object_grid->filaments.clone());
|
||||||
}
|
}
|
||||||
object_grid->ori_filaments.value = 1;
|
//object_grid->ori_filaments.value = 1;
|
||||||
|
|
||||||
object_grid->layer_height = *(get_object_config_value<ConfigOptionFloat>(global_config, object_grid->config, m_col_data[col_layer_height]->key));
|
object_grid->layer_height = *(get_object_config_value<ConfigOptionFloat>(global_config, object_grid->config, m_col_data[col_layer_height]->key));
|
||||||
object_grid->ori_layer_height = *(global_config.option<ConfigOptionFloat>(m_col_data[col_layer_height]->key));
|
object_grid->ori_layer_height = *(global_config.option<ConfigOptionFloat>(m_col_data[col_layer_height]->key));
|
||||||
|
@ -1936,7 +1983,7 @@ void ObjectGridTable::construct_object_configs(ObjectGrid *object_grid)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
volume_grid->filaments = object_grid->filaments;
|
volume_grid->filaments = object_grid->filaments;
|
||||||
volume_grid->ori_filaments = object_grid->filaments;
|
//volume_grid->ori_filaments = object_grid->filaments;
|
||||||
volume_grid->layer_height = *(get_volume_config_value<ConfigOptionFloat>(global_config, object_grid->config, volume_grid->config, m_col_data[col_layer_height]->key));
|
volume_grid->layer_height = *(get_volume_config_value<ConfigOptionFloat>(global_config, object_grid->config, volume_grid->config, m_col_data[col_layer_height]->key));
|
||||||
volume_grid->ori_layer_height = object_grid->layer_height;
|
volume_grid->ori_layer_height = object_grid->layer_height;
|
||||||
volume_grid->wall_loops = *(get_volume_config_value<ConfigOptionInt>(global_config, object_grid->config, volume_grid->config, m_col_data[col_wall_loops]->key));
|
volume_grid->wall_loops = *(get_volume_config_value<ConfigOptionInt>(global_config, object_grid->config, volume_grid->config, m_col_data[col_wall_loops]->key));
|
||||||
|
@ -2179,10 +2226,17 @@ void ObjectGridTable::update_row_properties()
|
||||||
//new wxGridCellChoiceEditor(grid_col->choice_count, grid_col->choices));
|
//new wxGridCellChoiceEditor(grid_col->choice_count, grid_col->choices));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case coFloat:
|
case coFloat: {
|
||||||
grid_table->SetCellEditor(row, col, new GridCellTextEditor());
|
grid_table->SetCellEditor(row, col, new GridCellTextEditor());
|
||||||
grid_table->SetCellRenderer(row, col, new wxGridCellFloatRenderer(6,1));
|
if (col == ObjectGridTable::col_speed_perimeter) {
|
||||||
break;
|
grid_table->SetCellRenderer(row, col, new wxGridCellFloatRenderer(6, 0));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
grid_table->SetCellRenderer(row, col, new wxGridCellFloatRenderer(6, 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
case coPercent:
|
case coPercent:
|
||||||
{
|
{
|
||||||
grid_table->SetCellEditor(row, col, new GridCellTextEditor());
|
grid_table->SetCellEditor(row, col, new GridCellTextEditor());
|
||||||
|
@ -2195,7 +2249,7 @@ void ObjectGridTable::update_row_properties()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (col == ObjectGridTable::col_name) {
|
else if (col == ObjectGridTable::col_name) {
|
||||||
grid_table->SetCellFont(row, col, Label::Body_13);
|
grid_table->SetCellFont(row, col, Label::Body_12);
|
||||||
/*if (grid_row->row_type == ObjectGridTable::row_object)
|
/*if (grid_row->row_type == ObjectGridTable::row_object)
|
||||||
grid_table->SetCellFont(row, col, Label::Head_14);
|
grid_table->SetCellFont(row, col, Label::Head_14);
|
||||||
else
|
else
|
||||||
|
@ -2301,6 +2355,22 @@ void ObjectGridTable::sort_by_col(int col)
|
||||||
m_sort_col = col;
|
m_sort_col = col;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (col == col_filaments) {
|
||||||
|
if (m_sort_col == col) {
|
||||||
|
auto sort_func = [](ObjectGridRow* row1, ObjectGridRow* row2) {
|
||||||
|
return (std::to_string(row2->filaments.value).compare(std::to_string(row1->filaments.value)) < 0);
|
||||||
|
};
|
||||||
|
sort_row_data(sort_func);
|
||||||
|
m_sort_col = -1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
auto sort_func = [](ObjectGridRow* row1, ObjectGridRow* row2) {
|
||||||
|
return (std::to_string(row1->filaments.value).compare(std::to_string(row2->filaments.value)) < 0);
|
||||||
|
};
|
||||||
|
sort_row_data(sort_func);
|
||||||
|
m_sort_col = col;
|
||||||
|
}
|
||||||
|
}
|
||||||
//else if (col == col_assemble_name) {
|
//else if (col == col_assemble_name) {
|
||||||
// if (m_sort_col == col) {
|
// if (m_sort_col == col) {
|
||||||
// compare_row_func sort_func = [](ObjectGridRow* row1, ObjectGridRow* row2) {
|
// compare_row_func sort_func = [](ObjectGridRow* row1, ObjectGridRow* row2) {
|
||||||
|
@ -2443,7 +2513,7 @@ void ObjectGridTable::OnSelectCell(int row, int col)
|
||||||
{
|
{
|
||||||
m_selected_cells.clear();
|
m_selected_cells.clear();
|
||||||
m_panel->m_side_window->Freeze();
|
m_panel->m_side_window->Freeze();
|
||||||
if (row == 0) {
|
if (row == 0 || col == col_filaments) {
|
||||||
m_panel->m_object_settings->UpdateAndShow(row, false, false, false, nullptr, nullptr, std::string());
|
m_panel->m_object_settings->UpdateAndShow(row, false, false, false, nullptr, nullptr, std::string());
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -2765,10 +2835,10 @@ void ObjectTablePanel::load_data()
|
||||||
|
|
||||||
m_object_grid->SetColLabelValue(ObjectGridTable::col_printable, _L("Printable"));
|
m_object_grid->SetColLabelValue(ObjectGridTable::col_printable, _L("Printable"));
|
||||||
m_object_grid->SetColLabelValue(ObjectGridTable::col_printable_reset, "");
|
m_object_grid->SetColLabelValue(ObjectGridTable::col_printable_reset, "");
|
||||||
m_object_grid->SetColLabelValue(ObjectGridTable::col_plate_index, _L("Plate"));
|
m_object_grid->SetColLabelValue(ObjectGridTable::col_plate_index, wxString::Format("%S%S", _L("Plate"), wxString::FromUTF8("\u2191\u2193")));
|
||||||
/*m_object_grid->SetColLabelValue(ObjectGridTable::col_assemble_name, L("Module"));*/
|
/*m_object_grid->SetColLabelValue(ObjectGridTable::col_assemble_name, L("Module"));*/
|
||||||
m_object_grid->SetColLabelValue(ObjectGridTable::col_name, _L("Name"));
|
m_object_grid->SetColLabelValue(ObjectGridTable::col_name, wxString::Format("%S%S", _L("Name"), wxString::FromUTF8("\u2191\u2193")));
|
||||||
m_object_grid->SetColLabelValue(ObjectGridTable::col_filaments, _L("Filament"));
|
m_object_grid->SetColLabelValue(ObjectGridTable::col_filaments, wxString::Format("%S%S", _L("Filament"), wxString::FromUTF8("\u2191\u2193")));
|
||||||
m_object_grid->SetColLabelValue(ObjectGridTable::col_filaments_reset, "");
|
m_object_grid->SetColLabelValue(ObjectGridTable::col_filaments_reset, "");
|
||||||
m_object_grid->SetColLabelValue(ObjectGridTable::col_layer_height, _L("Layer height"));
|
m_object_grid->SetColLabelValue(ObjectGridTable::col_layer_height, _L("Layer height"));
|
||||||
m_object_grid->SetColLabelValue(ObjectGridTable::col_layer_height_reset, "");
|
m_object_grid->SetColLabelValue(ObjectGridTable::col_layer_height_reset, "");
|
||||||
|
@ -2780,7 +2850,7 @@ void ObjectTablePanel::load_data()
|
||||||
m_object_grid->SetColLabelValue(ObjectGridTable::col_enable_support_reset, "");
|
m_object_grid->SetColLabelValue(ObjectGridTable::col_enable_support_reset, "");
|
||||||
m_object_grid->SetColLabelValue(ObjectGridTable::col_brim_type, _L("Brim"));
|
m_object_grid->SetColLabelValue(ObjectGridTable::col_brim_type, _L("Brim"));
|
||||||
m_object_grid->SetColLabelValue(ObjectGridTable::col_brim_type_reset, "");
|
m_object_grid->SetColLabelValue(ObjectGridTable::col_brim_type_reset, "");
|
||||||
m_object_grid->SetColLabelValue(ObjectGridTable::col_speed_perimeter, _L("Inner wall speed"));
|
m_object_grid->SetColLabelValue(ObjectGridTable::col_speed_perimeter, _L("Outer wall speed"));
|
||||||
m_object_grid->SetColLabelValue(ObjectGridTable::col_speed_perimeter_reset, "");
|
m_object_grid->SetColLabelValue(ObjectGridTable::col_speed_perimeter_reset, "");
|
||||||
m_object_grid->SetLabelFont(Label::Head_13);
|
m_object_grid->SetLabelFont(Label::Head_13);
|
||||||
m_object_grid->SetLabelTextColour(wxColour(0x30,0x3a,0x3c));
|
m_object_grid->SetLabelTextColour(wxColour(0x30,0x3a,0x3c));
|
||||||
|
@ -2795,6 +2865,7 @@ void ObjectTablePanel::load_data()
|
||||||
m_object_grid->EnableDragGridSize(false);
|
m_object_grid->EnableDragGridSize(false);
|
||||||
m_object_grid->EnableDragRowSize(false);
|
m_object_grid->EnableDragRowSize(false);
|
||||||
|
|
||||||
|
|
||||||
/*set the first row as label*/
|
/*set the first row as label*/
|
||||||
//format
|
//format
|
||||||
wxGridCellAttr *attr;
|
wxGridCellAttr *attr;
|
||||||
|
@ -2878,10 +2949,17 @@ void ObjectTablePanel::load_data()
|
||||||
m_object_grid->SetCellRenderer(row, col, new wxGridCellChoiceRenderer());
|
m_object_grid->SetCellRenderer(row, col, new wxGridCellChoiceRenderer());
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case coFloat:
|
case coFloat: {
|
||||||
m_object_grid->SetCellEditor(row, col, new GridCellTextEditor());
|
m_object_grid->SetCellEditor(row, col, new GridCellTextEditor());
|
||||||
m_object_grid->SetCellRenderer(row, col, new wxGridCellFloatRenderer(6,1));
|
if (col == ObjectGridTable::col_speed_perimeter) {
|
||||||
break;
|
m_object_grid->SetCellRenderer(row, col, new wxGridCellFloatRenderer(6, 0));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
m_object_grid->SetCellRenderer(row, col, new wxGridCellFloatRenderer(6, 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
case coPercent:
|
case coPercent:
|
||||||
{
|
{
|
||||||
m_object_grid->SetCellEditor(row, col, new GridCellTextEditor());
|
m_object_grid->SetCellEditor(row, col, new GridCellTextEditor());
|
||||||
|
@ -2914,25 +2992,25 @@ void ObjectTablePanel::load_data()
|
||||||
|
|
||||||
for (int i = 0; i < ObjectGridTable::col_max; i++) {
|
for (int i = 0; i < ObjectGridTable::col_max; i++) {
|
||||||
switch (i) {
|
switch (i) {
|
||||||
case ObjectGridTable::col_printable: {
|
/* case ObjectGridTable::col_printable: {
|
||||||
m_object_grid->SetColSize(i, m_object_grid->GetColSize(i) - FromDIP(28));
|
m_object_grid->SetColSize(i, m_object_grid->GetColSize(i) - FromDIP(28) - FromDIP(5));
|
||||||
break;
|
break;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
case ObjectGridTable::col_printable_reset:
|
case ObjectGridTable::col_printable_reset:
|
||||||
m_object_grid->SetColSize(i, FromDIP(28));
|
m_object_grid->SetColSize(i, FromDIP(0));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ObjectGridTable::col_name:
|
case ObjectGridTable::col_name:
|
||||||
m_object_grid->SetColSize(i, FromDIP(100));
|
m_object_grid->SetColSize(i, FromDIP(140));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ObjectGridTable::col_filaments:
|
/* case ObjectGridTable::col_filaments:
|
||||||
m_object_grid->SetColSize(i, FromDIP(52));
|
m_object_grid->SetColSize(i, FromDIP(55));
|
||||||
break;
|
break;*/
|
||||||
|
|
||||||
case ObjectGridTable::col_filaments_reset:
|
case ObjectGridTable::col_filaments_reset:
|
||||||
m_object_grid->SetColSize(i, FromDIP(28));
|
m_object_grid->SetColSize(i, FromDIP(0));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ObjectGridTable::col_layer_height: {
|
case ObjectGridTable::col_layer_height: {
|
||||||
|
@ -2948,10 +3026,14 @@ void ObjectTablePanel::load_data()
|
||||||
m_object_grid->SetColSize(i, FromDIP(28));
|
m_object_grid->SetColSize(i, FromDIP(28));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ObjectGridTable::col_wall_loops:
|
case ObjectGridTable::col_wall_loops: {
|
||||||
m_object_grid->SetColSize(i, m_object_grid->GetColSize(i) - FromDIP(28));
|
auto width = m_object_grid->GetColSize(i) - FromDIP(28);
|
||||||
|
if (width < m_object_grid->GetTextExtent(("000.00")).x) {
|
||||||
|
width = m_object_grid->GetTextExtent(("000.00")).x;
|
||||||
|
}
|
||||||
|
m_object_grid->SetColSize(i, width);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case ObjectGridTable::col_wall_loops_reset:
|
case ObjectGridTable::col_wall_loops_reset:
|
||||||
m_object_grid->SetColSize(i, FromDIP(28));
|
m_object_grid->SetColSize(i, FromDIP(28));
|
||||||
break;
|
break;
|
||||||
|
@ -3021,17 +3103,17 @@ void ObjectTablePanel::OnCellLeftClick( wxGridEvent& ev )
|
||||||
int row = ev.GetRow();
|
int row = ev.GetRow();
|
||||||
int col = ev.GetCol();
|
int col = ev.GetCol();
|
||||||
|
|
||||||
ConfigOptionType type = coNone;
|
ConfigOptionType type = coNone;
|
||||||
bool consumed = m_object_grid_table->OnCellLeftClick(row, col, type);
|
bool consumed = m_object_grid_table->OnCellLeftClick(row, col, type);
|
||||||
if (consumed) {
|
if (consumed) {
|
||||||
//m_object_grid->ClearSelection();
|
m_object_grid->ClearSelection();
|
||||||
//m_object_grid->SelectBlock(row, col-1, row, col-1, true);
|
m_object_grid->SelectBlock(row, col-1, row, col-1, true);
|
||||||
return;
|
//return;
|
||||||
}
|
}
|
||||||
|
m_object_grid->input_string = wxEmptyString;
|
||||||
consumed = m_object_grid->OnCellLeftClick(ev, row, col, type);
|
ev.Skip();
|
||||||
if (!consumed)
|
//consumed = m_object_grid->OnCellLeftClick(ev, row, col, type);
|
||||||
ev.Skip();
|
//if (!consumed) ev.Skip();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectTablePanel::OnRowSize( wxGridSizeEvent& ev)
|
void ObjectTablePanel::OnRowSize( wxGridSizeEvent& ev)
|
||||||
|
@ -3096,13 +3178,10 @@ void ObjectTablePanel::OnCellValueChanged( wxGridEvent& ev )
|
||||||
|
|
||||||
void ObjectTablePanel::OnRangeSelected( wxGridRangeSelectEvent& ev )
|
void ObjectTablePanel::OnRangeSelected( wxGridRangeSelectEvent& ev )
|
||||||
{
|
{
|
||||||
int left_col = ev.GetLeftCol();
|
range_select_left_col = ev.GetLeftCol();
|
||||||
int right_col = ev.GetRightCol();
|
range_select_right_col = ev.GetRightCol();
|
||||||
int top_row = ev.GetTopRow();
|
range_select_top_row = ev.GetTopRow();
|
||||||
int bottom_row = ev.GetBottomRow();
|
range_select_bottom_row = ev.GetBottomRow();
|
||||||
|
|
||||||
BOOST_LOG_TRIVIAL(debug) << __FUNCTION__ << boost::format("cell from (%1%, %2%) to (%3%, %4%) selected") %top_row %left_col %bottom_row %right_col;
|
|
||||||
|
|
||||||
ev.Skip();
|
ev.Skip();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3189,7 +3268,7 @@ ObjectTableDialog::ObjectTableDialog(wxWindow* parent, Plater* platerObj, Model
|
||||||
m_main_sizer->Add(m_line_top, 0, wxEXPAND, 0);
|
m_main_sizer->Add(m_line_top, 0, wxEXPAND, 0);
|
||||||
|
|
||||||
m_obj_panel = new ObjectTablePanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE, wxEmptyString, m_plater, m_model);
|
m_obj_panel = new ObjectTablePanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE, wxEmptyString, m_plater, m_model);
|
||||||
m_obj_panel->SetBackgroundColour(wxColour(0x00,0xAE,0x42));
|
m_obj_panel->SetBackgroundColour(*wxWHITE);
|
||||||
//m_top_sizer->Add(m_obj_panel, 1, wxALL | wxEXPAND, 5);
|
//m_top_sizer->Add(m_obj_panel, 1, wxALL | wxEXPAND, 5);
|
||||||
|
|
||||||
wxSize panel_size = m_obj_panel->get_init_size();
|
wxSize panel_size = m_obj_panel->get_init_size();
|
||||||
|
@ -3211,12 +3290,13 @@ ObjectTableDialog::ObjectTableDialog(wxWindow* parent, Plater* platerObj, Model
|
||||||
g_dialog_max_width = (panel_size.GetWidth() > g_max_size_from_parent.GetWidth())?g_max_size_from_parent.GetWidth():panel_size.GetWidth();
|
g_dialog_max_width = (panel_size.GetWidth() > g_max_size_from_parent.GetWidth())?g_max_size_from_parent.GetWidth():panel_size.GetWidth();
|
||||||
g_dialog_max_height = g_max_size_from_parent.GetHeight();
|
g_dialog_max_height = g_max_size_from_parent.GetHeight();
|
||||||
//g_dialog_max_height = (panel_size.GetHeight() > g_max_size_from_parent.GetHeight()) ? g_max_size_from_parent.GetHeight() : panel_size.GetHeight();
|
//g_dialog_max_height = (panel_size.GetHeight() > g_max_size_from_parent.GetHeight()) ? g_max_size_from_parent.GetHeight() : panel_size.GetHeight();
|
||||||
this->SetMaxSize(wxSize(g_dialog_max_width, g_dialog_max_height));
|
//this->SetMaxSize(wxSize(g_dialog_max_width, g_dialog_max_height));
|
||||||
//m_top_sizer->SetSizeHints(this);
|
//m_top_sizer->SetSizeHints(this);
|
||||||
//this->SetSizer(m_top_sizer);
|
//this->SetSizer(m_top_sizer);
|
||||||
//SetClientSize(m_panel->GetSize());
|
//SetClientSize(m_panel->GetSize());
|
||||||
Bind(wxEVT_CLOSE_WINDOW, &ObjectTableDialog::OnClose, this);
|
Bind(wxEVT_CLOSE_WINDOW, &ObjectTableDialog::OnClose, this);
|
||||||
Bind(wxEVT_SIZE, &ObjectTableDialog::OnSize, this);
|
Bind(wxEVT_SIZE, &ObjectTableDialog::OnSize, this);
|
||||||
|
Bind(wxEVT_CHAR_HOOK, &ObjectTableDialog::OnText, this);
|
||||||
|
|
||||||
//this->Layout();
|
//this->Layout();
|
||||||
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", created, this %1%, m_obj_panel %2%") %this % m_obj_panel;
|
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", created, this %1%, m_obj_panel %2%") %this % m_obj_panel;
|
||||||
|
@ -3283,19 +3363,22 @@ void ObjectTableDialog::OnClose(wxCloseEvent &evt)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ObjectTableDialog::OnText(wxKeyEvent &evt)
|
||||||
|
{
|
||||||
|
if (evt.GetKeyCode() != WXK_ESCAPE) {
|
||||||
|
evt.Skip();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ObjectTableDialog::OnSize(wxSizeEvent& event)
|
void ObjectTableDialog::OnSize(wxSizeEvent& event)
|
||||||
{
|
{
|
||||||
//SetSize(wxSize(-1, FromDIP(480)));
|
wxSize new_size = event.GetSize();
|
||||||
//SetMinSize(wxSize(-1, FromDIP(480)));
|
if ((new_size.GetWidth() > g_dialog_max_width) || (new_size.GetHeight() > g_dialog_max_height)) {
|
||||||
//SetMaxSize(wxSize(-1, FromDIP(480)));
|
int width = (new_size.GetWidth() > g_dialog_max_width) ? new_size.GetWidth() : g_dialog_max_width;
|
||||||
//return;
|
int height = (new_size.GetHeight() > g_dialog_max_height) ? new_size.GetHeight() : g_dialog_max_height;
|
||||||
//wxSize new_size = event.GetSize();
|
this->SetMaxSize(wxSize(width, height));
|
||||||
//if ((new_size.GetWidth() > g_dialog_max_width) || (new_size.GetHeight() > g_dialog_max_height)) {
|
}
|
||||||
// int width = (new_size.GetWidth() > g_dialog_max_width)?new_size.GetWidth():g_dialog_max_width;
|
event.Skip();
|
||||||
// int height = (new_size.GetHeight() > g_dialog_max_height)?new_size.GetHeight():g_dialog_max_height;
|
|
||||||
// this->SetMaxSize(wxSize(width, height));
|
|
||||||
//}
|
|
||||||
//event.Skip();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
@ -3324,8 +3407,33 @@ void GridCellTextEditor::BeginEdit(int row, int col, wxGrid *grid)
|
||||||
ObjectGridTable::ObjectGridRow *grid_row = table->get_grid_row(row - 1);
|
ObjectGridTable::ObjectGridRow *grid_row = table->get_grid_row(row - 1);
|
||||||
|
|
||||||
auto val = table->GetValue(row, col);
|
auto val = table->GetValue(row, col);
|
||||||
Text()->GetTextCtrl()->SetValue(val);
|
|
||||||
|
ObjectGrid* ogrid = dynamic_cast<ObjectGrid*>(grid);
|
||||||
|
|
||||||
|
|
||||||
|
if (!ogrid->input_string.empty()) {
|
||||||
|
Text()->GetTextCtrl()->SetValue(ogrid->input_string);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Text()->GetTextCtrl()->SetValue(val);
|
||||||
|
}
|
||||||
Text()->SetFocus();
|
Text()->SetFocus();
|
||||||
|
Text()->GetTextCtrl()->SetInsertionPointEnd();
|
||||||
|
|
||||||
|
|
||||||
|
m_control->Bind(wxEVT_TEXT_ENTER, [this, row, col, grid](wxCommandEvent &e) {
|
||||||
|
grid->HideCellEditControl();
|
||||||
|
grid->SaveEditControlValue();
|
||||||
|
e.Skip();
|
||||||
|
});
|
||||||
|
|
||||||
|
m_control->Bind(wxEVT_CHAR_HOOK, [this, row, col, grid](wxKeyEvent &e) {
|
||||||
|
if (e.GetKeyCode() == WXK_ESCAPE) {
|
||||||
|
grid->HideCellEditControl();
|
||||||
|
grid->SaveEditControlValue();
|
||||||
|
}
|
||||||
|
e.Skip();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GridCellTextEditor::EndEdit(int row, int col, const wxGrid *grid, const wxString &WXUNUSED(oldval), wxString *newval)
|
bool GridCellTextEditor::EndEdit(int row, int col, const wxGrid *grid, const wxString &WXUNUSED(oldval), wxString *newval)
|
||||||
|
|
|
@ -242,6 +242,7 @@ public:
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
bool OnCellLeftClick(wxGridEvent& event, int row, int col, ConfigOptionType type);
|
bool OnCellLeftClick(wxGridEvent& event, int row, int col, ConfigOptionType type);
|
||||||
|
void OnRangeSelected(wxGridRangeSelectEvent& ev);
|
||||||
void OnColHeadLeftClick(wxGridEvent& event);
|
void OnColHeadLeftClick(wxGridEvent& event);
|
||||||
|
|
||||||
virtual void DrawColLabels( wxDC& dc, const wxArrayInt& cols );
|
virtual void DrawColLabels( wxDC& dc, const wxArrayInt& cols );
|
||||||
|
@ -250,6 +251,9 @@ public:
|
||||||
//set ObjectGridTable and ObjectTablePanel as friend
|
//set ObjectGridTable and ObjectTablePanel as friend
|
||||||
friend class ObjectGridTable;
|
friend class ObjectGridTable;
|
||||||
friend class ObjectTablePanel;
|
friend class ObjectTablePanel;
|
||||||
|
|
||||||
|
wxString input_string;
|
||||||
|
wxString m_cell_data;
|
||||||
protected:
|
protected:
|
||||||
//void OnSize( wxSizeEvent& );
|
//void OnSize( wxSizeEvent& );
|
||||||
void OnKeyDown( wxKeyEvent& );
|
void OnKeyDown( wxKeyEvent& );
|
||||||
|
@ -258,7 +262,6 @@ protected:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
wxDECLARE_EVENT_TABLE();
|
wxDECLARE_EVENT_TABLE();
|
||||||
|
|
||||||
wxGridBlockCoords m_selected_block;
|
wxGridBlockCoords m_selected_block;
|
||||||
void paste_data( wxTextDataObject& text_data );
|
void paste_data( wxTextDataObject& text_data );
|
||||||
};
|
};
|
||||||
|
@ -519,8 +522,9 @@ public:
|
||||||
|
|
||||||
int m_icon_col_width{ 0 };
|
int m_icon_col_width{ 0 };
|
||||||
int m_icon_row_height{ 0 };
|
int m_icon_row_height{ 0 };
|
||||||
|
ObjectTablePanel* m_panel{ nullptr };
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ObjectTablePanel* m_panel{nullptr};
|
|
||||||
std::vector<ObjectGridRow*> m_grid_data;
|
std::vector<ObjectGridRow*> m_grid_data;
|
||||||
std::vector<ObjectGridCol*> m_col_data;
|
std::vector<ObjectGridCol*> m_col_data;
|
||||||
bool m_data_valid{false};
|
bool m_data_valid{false};
|
||||||
|
@ -544,6 +548,12 @@ private:
|
||||||
//the main panel
|
//the main panel
|
||||||
class ObjectTablePanel : public wxPanel
|
class ObjectTablePanel : public wxPanel
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
|
int range_select_left_col;
|
||||||
|
int range_select_right_col;
|
||||||
|
int range_select_top_row;
|
||||||
|
int range_select_bottom_row;
|
||||||
|
|
||||||
void OnCellLeftClick( wxGridEvent& );
|
void OnCellLeftClick( wxGridEvent& );
|
||||||
void OnRowSize( wxGridSizeEvent& );
|
void OnRowSize( wxGridSizeEvent& );
|
||||||
void OnColSize( wxGridSizeEvent& );
|
void OnColSize( wxGridSizeEvent& );
|
||||||
|
@ -628,6 +638,7 @@ public:
|
||||||
~ObjectTableDialog();
|
~ObjectTableDialog();
|
||||||
void Popup(int obj_idx = -1, int vol_idx = -1, wxPoint position = wxDefaultPosition);
|
void Popup(int obj_idx = -1, int vol_idx = -1, wxPoint position = wxDefaultPosition);
|
||||||
void OnClose(wxCloseEvent &evt);
|
void OnClose(wxCloseEvent &evt);
|
||||||
|
void OnText(wxKeyEvent &evt);
|
||||||
void OnSize(wxSizeEvent& event);
|
void OnSize(wxSizeEvent& event);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
|
@ -13,6 +13,14 @@ namespace GUI {
|
||||||
|
|
||||||
const float GLGizmoScale3D::Offset = 5.0f;
|
const float GLGizmoScale3D::Offset = 5.0f;
|
||||||
|
|
||||||
|
// get intersection of ray and plane
|
||||||
|
Vec3d GetIntersectionOfRayAndPlane(Vec3d ray_position, Vec3d ray_dir, Vec3d plane_position, Vec3d plane_normal)
|
||||||
|
{
|
||||||
|
double t = (plane_normal.dot(plane_position) - plane_normal.dot(ray_position)) / (plane_normal.dot(ray_dir));
|
||||||
|
Vec3d intersection = ray_position + t * ray_dir;
|
||||||
|
return intersection;
|
||||||
|
}
|
||||||
|
|
||||||
//BBS: GUI refactor: add obj manipulation
|
//BBS: GUI refactor: add obj manipulation
|
||||||
GLGizmoScale3D::GLGizmoScale3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id, GizmoObjectManipulation* obj_manipulation)
|
GLGizmoScale3D::GLGizmoScale3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id, GizmoObjectManipulation* obj_manipulation)
|
||||||
: GLGizmoBase(parent, icon_filename, sprite_id)
|
: GLGizmoBase(parent, icon_filename, sprite_id)
|
||||||
|
@ -95,6 +103,8 @@ void GLGizmoScale3D::on_start_dragging()
|
||||||
if (m_hover_id != -1)
|
if (m_hover_id != -1)
|
||||||
{
|
{
|
||||||
m_starting.drag_position = m_grabbers[m_hover_id].center;
|
m_starting.drag_position = m_grabbers[m_hover_id].center;
|
||||||
|
m_starting.plane_center = m_grabbers[4].center;
|
||||||
|
m_starting.plane_nromal = m_grabbers[5].center - m_grabbers[4].center;
|
||||||
m_starting.ctrl_down = wxGetKeyState(WXK_CONTROL);
|
m_starting.ctrl_down = wxGetKeyState(WXK_CONTROL);
|
||||||
m_starting.box = (m_starting.ctrl_down && (m_hover_id < 6)) ? m_box : m_parent.get_selection().get_bounding_box();
|
m_starting.box = (m_starting.ctrl_down && (m_hover_id < 6)) ? m_box : m_parent.get_selection().get_bounding_box();
|
||||||
|
|
||||||
|
@ -303,19 +313,23 @@ double GLGizmoScale3D::calc_ratio(const UpdateData& data) const
|
||||||
{
|
{
|
||||||
double ratio = 0.0;
|
double ratio = 0.0;
|
||||||
|
|
||||||
Vec3d pivot = (m_starting.ctrl_down && (m_hover_id < 6)) ? m_starting.pivots[m_hover_id] : m_starting.box.center();
|
Vec3d pivot = (m_starting.ctrl_down && (m_hover_id < 6)) ? m_starting.pivots[m_hover_id] : m_starting.plane_center;
|
||||||
|
|
||||||
Vec3d starting_vec = m_starting.drag_position - pivot;
|
Vec3d starting_vec = m_starting.drag_position - pivot;
|
||||||
double len_starting_vec = starting_vec.norm();
|
double len_starting_vec = starting_vec.norm();
|
||||||
if (len_starting_vec != 0.0)
|
if (len_starting_vec != 0.0)
|
||||||
{
|
{
|
||||||
Vec3d mouse_dir = data.mouse_ray.unit_vector();
|
Vec3d mouse_dir = data.mouse_ray.unit_vector();
|
||||||
// finds the intersection of the mouse ray with the plane parallel to the camera viewport and passing throught the starting position
|
Vec3d plane_normal = m_starting.plane_nromal;
|
||||||
// use ray-plane intersection see i.e. https://en.wikipedia.org/wiki/Line%E2%80%93plane_intersection algebric form
|
if (m_hover_id == 5) {
|
||||||
// in our case plane normal and ray direction are the same (orthogonal view)
|
// get z-axis moving plane normal
|
||||||
// when moving to perspective camera the negative z unit axis of the camera needs to be transformed in world space and used as plane normal
|
Vec3d plane_vec = mouse_dir.cross(m_starting.plane_nromal);
|
||||||
Vec3d inters = data.mouse_ray.a + (m_starting.drag_position - data.mouse_ray.a).dot(mouse_dir) / mouse_dir.squaredNorm() * mouse_dir;
|
plane_normal = plane_vec.cross(m_starting.plane_nromal);
|
||||||
// vector from the starting position to the found intersection
|
}
|
||||||
|
|
||||||
|
// finds the intersection of the mouse ray with the plane that the drag point moves
|
||||||
|
// use ray-plane intersection see i.e. https://en.wikipedia.org/wiki/Line%E2%80%93plane_intersection
|
||||||
|
Vec3d inters = GetIntersectionOfRayAndPlane(data.mouse_ray.a, mouse_dir, m_starting.drag_position, plane_normal.normalized());
|
||||||
|
|
||||||
Vec3d inters_vec = inters - m_starting.drag_position;
|
Vec3d inters_vec = inters - m_starting.drag_position;
|
||||||
|
|
||||||
// finds projection of the vector along the staring direction
|
// finds projection of the vector along the staring direction
|
||||||
|
|
|
@ -19,6 +19,8 @@ class GLGizmoScale3D : public GLGizmoBase
|
||||||
{
|
{
|
||||||
Vec3d scale;
|
Vec3d scale;
|
||||||
Vec3d drag_position;
|
Vec3d drag_position;
|
||||||
|
Vec3d plane_center; // keep the relative center position for scale in the bottom plane
|
||||||
|
Vec3d plane_nromal; // keep the bottom plane
|
||||||
BoundingBoxf3 box;
|
BoundingBoxf3 box;
|
||||||
Vec3d pivots[6];
|
Vec3d pivots[6];
|
||||||
bool ctrl_down;
|
bool ctrl_down;
|
||||||
|
|