Merge remote-tracking branch 'remote/master' into SoftFever

# Conflicts:
#	src/libslic3r/Preset.cpp
This commit is contained in:
SoftFever 2022-09-09 21:54:57 +08:00
commit bb74438f7c
132 changed files with 5737 additions and 3598 deletions

View file

@ -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 ""
@ -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 ""

File diff suppressed because it is too large Load diff

View file

@ -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"
@ -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!"

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -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

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -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 "正在发送打印配置"
@ -1313,7 +1310,7 @@ msgstr ""
"被注释于相应的代码中。" "被注释于相应的代码中。"
msgid "AMS Materials Setting" 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 "保留最小"

View file

@ -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>

View file

@ -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

View file

@ -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
@ -15,6 +21,7 @@ bambustudio_add_cmake_project(GLFW
-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)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View 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

View 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

View 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

View 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

View 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

View file

@ -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

Before After
Before After

View file

@ -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

Before After
Before After

View file

@ -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

Before After
Before After

View file

@ -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

Before After
Before After

View file

@ -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

Before After
Before After

View file

@ -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

Before After
Before After

View file

@ -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"

View file

@ -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"
] ]
} }

View file

@ -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"
] ]
} }

View file

@ -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"
] ]
} }

View file

@ -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"
] ]
} }

View file

@ -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"
] ]
} }

View file

@ -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"
]
}

View file

@ -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"
]
}

View 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"
]
}

View 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"
]
}

View file

@ -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",

File diff suppressed because one or more lines are too long

View 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",

View file

@ -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"

View file

@ -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"
] ]
} }

View file

@ -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"
] ]
} }

View file

@ -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提供了数十种字体并支持粗体和斜体样式使文本具有更大的灵活性。",
} }
}; };

View file

@ -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;

View file

@ -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;
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 321 KiB

View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View file

@ -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>
@ -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>

View file

@ -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())

View file

@ -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()

View file

@ -534,7 +534,9 @@ 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
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); substitutions_ctxt.unrecogized_keys.push_back(opt_key_src);
return true; return true;
} }

View file

@ -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);
} }

View file

@ -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)
{} {}

View file

@ -990,13 +990,24 @@ 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) {
//BBS: for single extruder multi material, only use the offset of first extruder
if (single_extruder_multi_material != nullptr && single_extruder_multi_material->getBool()) {
Vec2f offset = extruder_offset->values[0].cast<float>();
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()); m_extruder_offsets.resize(extruder_offset->values.size());
for (size_t i = 0; i < extruder_offset->values.size(); ++i) { for (size_t i = 0; i < extruder_offset->values.size(); ++i) {
Vec2f offset = extruder_offset->values[i].cast<float>(); Vec2f offset = extruder_offset->values[i].cast<float>();
m_extruder_offsets[i] = { offset(0), offset(1), 0.0f }; m_extruder_offsets[i] = { offset(0), offset(1), 0.0f };
} }
} }
}
if (m_extruder_offsets.size() < m_result.extruders_count) { if (m_extruder_offsets.size() < m_result.extruders_count) {
for (size_t i = m_extruder_offsets.size(); i < m_result.extruders_count; ++i) { for (size_t i = m_extruder_offsets.size(); i < m_result.extruders_count; ++i) {
@ -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,

View file

@ -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;

View file

@ -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);

View file

@ -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

View file

@ -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 {

View file

@ -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",

View file

@ -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;
} }

View file

@ -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");
ConfigOptionEnum<TimelapseType> *timelapse_opt = this->option<ConfigOptionEnum<TimelapseType>>("timelapse_type");
if (timelapse_opt && timelapse_opt->value == TimelapseType::tlSmooth) {
if (used_filaments == 1 || ps_opt->value == PrintSequence::ByObject) if (used_filaments == 1 || ps_opt->value == PrintSequence::ByObject)
ept_opt->value = false; ept_opt->value = false;
}
if (ept_opt->value) { if (ept_opt->value) {
if (islh_opt) if (islh_opt)

View file

@ -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))

View file

@ -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"

View file

@ -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,

View file

@ -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"

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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();
@ -432,7 +430,8 @@ void AMSMaterialsSetting::Popup(wxString filament, wxString sn, wxString temp_mi
if (printer_it->name == printer_str) { if (printer_it->name == printer_str) {
if (filament_id_set.find(filament_it->filament_id) != filament_id_set.end()) { if (filament_id_set.find(filament_it->filament_id) != filament_id_set.end()) {
continue; continue;
} else { }
else {
filament_id_set.insert(filament_it->filament_id); filament_id_set.insert(filament_it->filament_id);
// name matched // name matched
filament_items.push_back(filament_it->alias); filament_items.push_back(filament_it->alias);
@ -467,6 +466,7 @@ void AMSMaterialsSetting::Popup(wxString filament, wxString sn, wxString temp_mi
COMBOBOX_FILAMENT->SetSelection(selection_idx); COMBOBOX_FILAMENT->SetSelection(selection_idx);
post_select_event(); post_select_event();
} }
update(); update();
ShowModal(); ShowModal();
} }

View file

@ -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

View file

@ -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)

View file

@ -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;

View file

@ -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("insert_flag") || jj["ams"].contains("power_on_flag")) {
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")) { if (jj["ams"].contains("power_on_flag")) {
ams_power_on_flag = jj["ams"]["power_on_flag"].get<bool>(); 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

View file

@ -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();

View file

@ -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,6 +2287,7 @@ void GLCanvas3D::on_char(wxKeyEvent& evt)
#else /* __APPLE__ */ #else /* __APPLE__ */
case WXK_CONTROL_A: case WXK_CONTROL_A:
#endif /* __APPLE__ */ #endif /* __APPLE__ */
if (!is_in_painting_mode)
post_event(SimpleEvent(EVT_GLCANVAS_SELECT_ALL)); post_event(SimpleEvent(EVT_GLCANVAS_SELECT_ALL));
break; break;
#ifdef __APPLE__ #ifdef __APPLE__
@ -2289,6 +2296,7 @@ void GLCanvas3D::on_char(wxKeyEvent& evt)
#else /* __APPLE__ */ #else /* __APPLE__ */
case WXK_CONTROL_C: case WXK_CONTROL_C:
#endif /* __APPLE__ */ #endif /* __APPLE__ */
if (!is_in_painting_mode)
post_event(SimpleEvent(EVT_GLTOOLBAR_COPY)); post_event(SimpleEvent(EVT_GLTOOLBAR_COPY));
break; break;
#ifdef __APPLE__ #ifdef __APPLE__
@ -2325,6 +2333,7 @@ void GLCanvas3D::on_char(wxKeyEvent& evt)
#else /* __APPLE__ */ #else /* __APPLE__ */
case WXK_CONTROL_V: case WXK_CONTROL_V:
#endif /* __APPLE__ */ #endif /* __APPLE__ */
if (!is_in_painting_mode)
post_event(SimpleEvent(EVT_GLTOOLBAR_PASTE)); post_event(SimpleEvent(EVT_GLTOOLBAR_PASTE));
break; break;
@ -2334,6 +2343,7 @@ void GLCanvas3D::on_char(wxKeyEvent& evt)
#else /* __APPLE__ */ #else /* __APPLE__ */
case WXK_CONTROL_X: case WXK_CONTROL_X:
#endif /* __APPLE__ */ #endif /* __APPLE__ */
if (!is_in_painting_mode)
post_event(SimpleEvent(EVT_GLTOOLBAR_CUT)); post_event(SimpleEvent(EVT_GLTOOLBAR_CUT));
break; break;
@ -5896,8 +5906,16 @@ void GLCanvas3D::_check_and_update_toolbar_icon_scale()
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

View file

@ -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,9 +2010,25 @@ bool GUI_App::on_init_inner()
dialog.SetExtendedMessage(extmsg);*/ dialog.SetExtendedMessage(extmsg);*/
std::string skip_version_str = this->app_config->get("app", "skip_version");
bool skip_this_version = false;
if (!skip_version_str.empty()) {
BOOST_LOG_TRIVIAL(info) << "new version = " << version_info.version_str << ", skip version = " << skip_version_str;
if (version_info.version_str <= skip_version_str) {
skip_this_version = true;
} else {
app_config->set("skip_version", "");
skip_this_version = false;
}
}
if (!skip_this_version
|| evt.GetInt() != 0) {
UpdateVersionDialog dialog(this->mainframe); UpdateVersionDialog dialog(this->mainframe);
wxString extmsg = wxString::FromUTF8(version_info.description); wxString extmsg = wxString::FromUTF8(version_info.description);
dialog.update_version_info(extmsg, version_info.version_str); dialog.update_version_info(extmsg, version_info.version_str);
if (evt.GetInt() != 0) {
dialog.m_remind_choice->Hide();
}
switch (dialog.ShowModal()) switch (dialog.ShowModal())
{ {
case wxID_YES: case wxID_YES:
@ -2021,6 +2040,7 @@ bool GUI_App::on_init_inner()
; ;
} }
} }
}
}); });
Bind(EVT_ENTER_FORCE_UPGRADE, [this](const wxCommandEvent& evt) { Bind(EVT_ENTER_FORCE_UPGRADE, [this](const wxCommandEvent& evt) {
@ -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;

View file

@ -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();

View file

@ -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);

View file

@ -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();

View file

@ -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();
} }
@ -956,6 +1062,7 @@ void ObjectGrid::paste_data( wxTextDataObject& text_data )
} }
} }
} }
} }
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
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(); 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) {
grid_table->SetCellRenderer(row, col, new wxGridCellFloatRenderer(6, 0));
}
else {
grid_table->SetCellRenderer(row, col, new wxGridCellFloatRenderer(6, 2));
}
break; 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) {
m_object_grid->SetCellRenderer(row, col, new wxGridCellFloatRenderer(6, 0));
}
else {
m_object_grid->SetCellRenderer(row, col, new wxGridCellFloatRenderer(6, 2));
}
break; 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;
@ -3024,14 +3106,14 @@ void ObjectTablePanel::OnCellLeftClick( wxGridEvent& ev )
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);
if (!consumed)
ev.Skip(); ev.Skip();
//consumed = m_object_grid->OnCellLeftClick(ev, row, col, type);
//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);
ObjectGrid* ogrid = dynamic_cast<ObjectGrid*>(grid);
if (!ogrid->input_string.empty()) {
Text()->GetTextCtrl()->SetValue(ogrid->input_string);
}
else {
Text()->GetTextCtrl()->SetValue(val); 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)

View file

@ -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 };
private:
ObjectTablePanel* m_panel{ nullptr }; ObjectTablePanel* m_panel{ nullptr };
private:
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:

View file

@ -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

View file

@ -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;

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