diff --git a/deps/CMakeLists.txt b/deps/CMakeLists.txt index bef5482..2314f2d 100644 --- a/deps/CMakeLists.txt +++ b/deps/CMakeLists.txt @@ -43,6 +43,7 @@ option(DEP_BUILD_GLFW "Compile GLFW" ON) option(DEP_BUILD_FREETYPE "Compile freetype" ON) option(DEP_BUILD_WXWIDGETS "Compile wxWidgets" ON) option(DEP_BUILD_FFMPEG "Compile ffmpeg" ON) +option(DEP_BUILD_WEBSOCKET "Comile websocket" ON) set(DESTDIR "${CMAKE_CURRENT_BINARY_DIR}/destdir" CACHE PATH "Destination directory") set(DEP_DOWNLOAD_DIR ${CMAKE_CURRENT_BINARY_DIR} CACHE PATH "Path for downloaded source packages.") @@ -269,6 +270,12 @@ if (DEP_BUILD_FFMPEG) set(FFMPEG_PKG dep_FFMPEG) endif () +set(WEBSOCKETPP_PKG "") +if (DEP_BUILD_WEBSOCKET) + include(WebSocketPP/WebSocketPP.cmake) + set(WEBSOCKETPP_PKG dep_WebSocketPP) +endif() + set(_dep_list ${BOOST_PKG} dep_TBB @@ -287,6 +294,7 @@ set(_dep_list ${EXPAT_PKG} ${FREETYPE_PKG} ${FFMPEG_PKG} + ${WEBSOCKETPP_PKG} ) if (MSVC) diff --git a/deps/WebSocketPP/WebSocketPP.cmake b/deps/WebSocketPP/WebSocketPP.cmake new file mode 100644 index 0000000..ce6f658 --- /dev/null +++ b/deps/WebSocketPP/WebSocketPP.cmake @@ -0,0 +1,25 @@ +# 构建 WebSocketPP +ExternalProject_Add( + dep_WebSocketPP + GIT_REPOSITORY https://github.com/zaphoyd/websocketpp.git + GIT_TAG 0.8.2 + DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/WebSocketPP + PREFIX ${CMAKE_CURRENT_BINARY_DIR}/WebSocketPP + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND + ${CMAKE_COMMAND} -E make_directory ${DESTDIR}/usr/local/include && + ${CMAKE_COMMAND} -E copy_directory + ${CMAKE_CURRENT_BINARY_DIR}/WebSocketPP/src/dep_WebSocketPP/websocketpp + ${DESTDIR}/usr/local/include/websocketpp + UPDATE_COMMAND "" + PATCH_COMMAND "" +) + +# 设置依赖关系 +ExternalProject_Add_StepDependencies( + dep_WebSocketPP + configure + dep_OpenSSL + dep_Boost +) \ No newline at end of file diff --git a/resources/i18n/pt_BR/QIDIStudio.mo b/resources/i18n/pt_BR/QIDIStudio.mo new file mode 100644 index 0000000..fae811a Binary files /dev/null and b/resources/i18n/pt_BR/QIDIStudio.mo differ diff --git a/resources/images/QIDIStudio_p.svg b/resources/images/QIDIStudio_p.svg new file mode 100644 index 0000000..f74a611 --- /dev/null +++ b/resources/images/QIDIStudio_p.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/resources/images/add_machine_list_able.svg b/resources/images/add_machine_list_able.svg index 48b0d94..7d2c8bd 100644 --- a/resources/images/add_machine_list_able.svg +++ b/resources/images/add_machine_list_able.svg @@ -1,6 +1,4 @@ - - - - + + + diff --git a/resources/images/add_machine_list_disable.svg b/resources/images/add_machine_list_disable.svg index b5cb4f1..7d2c8bd 100644 --- a/resources/images/add_machine_list_disable.svg +++ b/resources/images/add_machine_list_disable.svg @@ -1,6 +1,4 @@ - - - - + + + diff --git a/resources/images/ams_editable_light.svg b/resources/images/ams_editable_light.svg new file mode 100644 index 0000000..ca0d376 --- /dev/null +++ b/resources/images/ams_editable_light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/images/ams_icon.svg b/resources/images/ams_icon.svg new file mode 100644 index 0000000..66a8295 --- /dev/null +++ b/resources/images/ams_icon.svg @@ -0,0 +1,628 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/images/ams_readonly.svg b/resources/images/ams_readonly.svg new file mode 100644 index 0000000..fd67c7f --- /dev/null +++ b/resources/images/ams_readonly.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/resources/images/ams_readonly_light.svg b/resources/images/ams_readonly_light.svg new file mode 100644 index 0000000..b9404c4 --- /dev/null +++ b/resources/images/ams_readonly_light.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/resources/images/ams_refresh_normal.svg b/resources/images/ams_refresh_normal.svg new file mode 100644 index 0000000..99ea110 --- /dev/null +++ b/resources/images/ams_refresh_normal.svg @@ -0,0 +1,14 @@ + + + + + + + + Layer 1 + + + + + + \ No newline at end of file diff --git a/resources/images/ams_refresh_selected.svg b/resources/images/ams_refresh_selected.svg new file mode 100644 index 0000000..653d0ed --- /dev/null +++ b/resources/images/ams_refresh_selected.svg @@ -0,0 +1,14 @@ + + + + + + + + Layer 1 + + + + + + \ No newline at end of file diff --git a/resources/images/ams_setting_hover.svg b/resources/images/ams_setting_hover.svg new file mode 100644 index 0000000..36625b7 --- /dev/null +++ b/resources/images/ams_setting_hover.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/resources/images/ams_setting_normal.svg b/resources/images/ams_setting_normal.svg new file mode 100644 index 0000000..4183643 --- /dev/null +++ b/resources/images/ams_setting_normal.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/images/ams_setting_press.svg b/resources/images/ams_setting_press.svg new file mode 100644 index 0000000..123325e --- /dev/null +++ b/resources/images/ams_setting_press.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/resources/images/delete_machine_list_able.svg b/resources/images/delete_machine_list_able.svg index e725b8a..43c2aba 100644 --- a/resources/images/delete_machine_list_able.svg +++ b/resources/images/delete_machine_list_able.svg @@ -1,6 +1,3 @@ - - - - + + diff --git a/resources/images/delete_machine_list_disable.svg b/resources/images/delete_machine_list_disable.svg index 8f086b0..43c2aba 100644 --- a/resources/images/delete_machine_list_disable.svg +++ b/resources/images/delete_machine_list_disable.svg @@ -1,6 +1,3 @@ - - - - + + diff --git a/resources/images/edit_machine_list_able.svg b/resources/images/edit_machine_list_able.svg index 603c251..d447a81 100644 --- a/resources/images/edit_machine_list_able.svg +++ b/resources/images/edit_machine_list_able.svg @@ -1,7 +1,3 @@ - - - - + + diff --git a/resources/images/edit_machine_list_disable.svg b/resources/images/edit_machine_list_disable.svg index 921c7c2..d447a81 100644 --- a/resources/images/edit_machine_list_disable.svg +++ b/resources/images/edit_machine_list_disable.svg @@ -1,7 +1,3 @@ - - - - + + diff --git a/resources/images/ext_image_xmax4.svg b/resources/images/ext_image_xmax4.svg new file mode 100644 index 0000000..4a34d7a --- /dev/null +++ b/resources/images/ext_image_xmax4.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/resources/images/extra_ams_tray_left.svg b/resources/images/extra_ams_tray_left.svg new file mode 100644 index 0000000..f2aae5c --- /dev/null +++ b/resources/images/extra_ams_tray_left.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/resources/images/extra_ams_tray_left_hover.svg b/resources/images/extra_ams_tray_left_hover.svg new file mode 100644 index 0000000..aff51a2 --- /dev/null +++ b/resources/images/extra_ams_tray_left_hover.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/resources/images/extra_ams_tray_left_selected.svg b/resources/images/extra_ams_tray_left_selected.svg new file mode 100644 index 0000000..f2d168d --- /dev/null +++ b/resources/images/extra_ams_tray_left_selected.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/resources/images/extra_ams_tray_right.svg b/resources/images/extra_ams_tray_right.svg new file mode 100644 index 0000000..993222a --- /dev/null +++ b/resources/images/extra_ams_tray_right.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/resources/images/extra_ams_tray_right_hover.svg b/resources/images/extra_ams_tray_right_hover.svg new file mode 100644 index 0000000..01a6349 --- /dev/null +++ b/resources/images/extra_ams_tray_right_hover.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/resources/images/extra_ams_tray_right_selected.svg b/resources/images/extra_ams_tray_right_selected.svg new file mode 100644 index 0000000..21c6d27 --- /dev/null +++ b/resources/images/extra_ams_tray_right_selected.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/resources/images/left_extruder_active_empty.svg b/resources/images/left_extruder_active_empty.svg new file mode 100644 index 0000000..04aa8fa --- /dev/null +++ b/resources/images/left_extruder_active_empty.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/resources/images/left_extruder_active_filled.svg b/resources/images/left_extruder_active_filled.svg new file mode 100644 index 0000000..887ed13 --- /dev/null +++ b/resources/images/left_extruder_active_filled.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/resources/images/left_extruder_unactive_empty.svg b/resources/images/left_extruder_unactive_empty.svg new file mode 100644 index 0000000..6daa358 --- /dev/null +++ b/resources/images/left_extruder_unactive_empty.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/resources/images/left_extruder_unactive_filled.svg b/resources/images/left_extruder_unactive_filled.svg new file mode 100644 index 0000000..6daa358 --- /dev/null +++ b/resources/images/left_extruder_unactive_filled.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/resources/images/left_nozzle.svg b/resources/images/left_nozzle.svg new file mode 100644 index 0000000..e59b051 --- /dev/null +++ b/resources/images/left_nozzle.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/resources/images/live_stream_default.png b/resources/images/live_stream_default.png new file mode 100644 index 0000000..027cca4 Binary files /dev/null and b/resources/images/live_stream_default.png differ diff --git a/resources/images/media_play.svg b/resources/images/media_play.svg new file mode 100644 index 0000000..afff37b --- /dev/null +++ b/resources/images/media_play.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/resources/images/media_stop.svg b/resources/images/media_stop.svg new file mode 100644 index 0000000..eef22c1 --- /dev/null +++ b/resources/images/media_stop.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/images/monitor_axis_home.svg b/resources/images/monitor_axis_home.svg new file mode 100644 index 0000000..ec078d8 --- /dev/null +++ b/resources/images/monitor_axis_home.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/images/monitor_bed_down.svg b/resources/images/monitor_bed_down.svg new file mode 100644 index 0000000..25869ee --- /dev/null +++ b/resources/images/monitor_bed_down.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/images/monitor_bed_down_disable.svg b/resources/images/monitor_bed_down_disable.svg new file mode 100644 index 0000000..2551512 --- /dev/null +++ b/resources/images/monitor_bed_down_disable.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/images/monitor_bed_temp.svg b/resources/images/monitor_bed_temp.svg new file mode 100644 index 0000000..e012469 --- /dev/null +++ b/resources/images/monitor_bed_temp.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/resources/images/monitor_bed_temp_active.svg b/resources/images/monitor_bed_temp_active.svg new file mode 100644 index 0000000..5a81ebe --- /dev/null +++ b/resources/images/monitor_bed_temp_active.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/resources/images/monitor_bed_up.svg b/resources/images/monitor_bed_up.svg new file mode 100644 index 0000000..2ef6e06 --- /dev/null +++ b/resources/images/monitor_bed_up.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/images/monitor_bed_up_disable.svg b/resources/images/monitor_bed_up_disable.svg new file mode 100644 index 0000000..4e69a78 --- /dev/null +++ b/resources/images/monitor_bed_up_disable.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/images/monitor_brokenimg.png b/resources/images/monitor_brokenimg.png new file mode 100644 index 0000000..6c2e180 Binary files /dev/null and b/resources/images/monitor_brokenimg.png differ diff --git a/resources/images/monitor_extruder_empty_load.png b/resources/images/monitor_extruder_empty_load.png new file mode 100644 index 0000000..3a94f8a Binary files /dev/null and b/resources/images/monitor_extruder_empty_load.png differ diff --git a/resources/images/monitor_extruder_empty_unload.png b/resources/images/monitor_extruder_empty_unload.png new file mode 100644 index 0000000..3aace27 Binary files /dev/null and b/resources/images/monitor_extruder_empty_unload.png differ diff --git a/resources/images/monitor_extruder_filled_load.png b/resources/images/monitor_extruder_filled_load.png new file mode 100644 index 0000000..1066447 Binary files /dev/null and b/resources/images/monitor_extruder_filled_load.png differ diff --git a/resources/images/monitor_extruder_filled_unload.png b/resources/images/monitor_extruder_filled_unload.png new file mode 100644 index 0000000..4e7788a Binary files /dev/null and b/resources/images/monitor_extruder_filled_unload.png differ diff --git a/resources/images/monitor_fan_off.svg b/resources/images/monitor_fan_off.svg new file mode 100644 index 0000000..da8f310 --- /dev/null +++ b/resources/images/monitor_fan_off.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/images/monitor_fan_on.svg b/resources/images/monitor_fan_on.svg new file mode 100644 index 0000000..bcd0ee6 --- /dev/null +++ b/resources/images/monitor_fan_on.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/images/monitor_frame_temp.svg b/resources/images/monitor_frame_temp.svg new file mode 100644 index 0000000..5e7a7fa --- /dev/null +++ b/resources/images/monitor_frame_temp.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/resources/images/monitor_frame_temp_active.svg b/resources/images/monitor_frame_temp_active.svg new file mode 100644 index 0000000..411ff71 --- /dev/null +++ b/resources/images/monitor_frame_temp_active.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/resources/images/monitor_item_cost.svg b/resources/images/monitor_item_cost.svg new file mode 100644 index 0000000..ed69e06 --- /dev/null +++ b/resources/images/monitor_item_cost.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/resources/images/monitor_item_prediction.svg b/resources/images/monitor_item_prediction.svg new file mode 100644 index 0000000..34056c4 --- /dev/null +++ b/resources/images/monitor_item_prediction.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/images/monitor_item_print.svg b/resources/images/monitor_item_print.svg new file mode 100644 index 0000000..7d28019 --- /dev/null +++ b/resources/images/monitor_item_print.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/images/monitor_lamp_off.svg b/resources/images/monitor_lamp_off.svg new file mode 100644 index 0000000..c5f1a13 --- /dev/null +++ b/resources/images/monitor_lamp_off.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/images/monitor_lamp_on.svg b/resources/images/monitor_lamp_on.svg new file mode 100644 index 0000000..defb773 --- /dev/null +++ b/resources/images/monitor_lamp_on.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/images/monitor_nozzle_temp.svg b/resources/images/monitor_nozzle_temp.svg new file mode 100644 index 0000000..0e3eba4 --- /dev/null +++ b/resources/images/monitor_nozzle_temp.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/resources/images/monitor_nozzle_temp_active.svg b/resources/images/monitor_nozzle_temp_active.svg new file mode 100644 index 0000000..f2bd6a3 --- /dev/null +++ b/resources/images/monitor_nozzle_temp_active.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/resources/images/monitor_placeholder.svg b/resources/images/monitor_placeholder.svg new file mode 100644 index 0000000..e7d907d --- /dev/null +++ b/resources/images/monitor_placeholder.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/resources/images/monitor_recording_off.svg b/resources/images/monitor_recording_off.svg new file mode 100644 index 0000000..c45f93e --- /dev/null +++ b/resources/images/monitor_recording_off.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/resources/images/monitor_recording_off_dark.svg b/resources/images/monitor_recording_off_dark.svg new file mode 100644 index 0000000..520dd1b --- /dev/null +++ b/resources/images/monitor_recording_off_dark.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/resources/images/monitor_recording_on.svg b/resources/images/monitor_recording_on.svg new file mode 100644 index 0000000..4bccded --- /dev/null +++ b/resources/images/monitor_recording_on.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/resources/images/monitor_recording_on_dark.svg b/resources/images/monitor_recording_on_dark.svg new file mode 100644 index 0000000..cc0b3ec --- /dev/null +++ b/resources/images/monitor_recording_on_dark.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/resources/images/monitor_speed.svg b/resources/images/monitor_speed.svg new file mode 100644 index 0000000..4816476 --- /dev/null +++ b/resources/images/monitor_speed.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/resources/images/monitor_speed_active.svg b/resources/images/monitor_speed_active.svg new file mode 100644 index 0000000..f8e7e68 --- /dev/null +++ b/resources/images/monitor_speed_active.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/resources/images/monitor_timelapse_off.svg b/resources/images/monitor_timelapse_off.svg new file mode 100644 index 0000000..103a97f --- /dev/null +++ b/resources/images/monitor_timelapse_off.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/resources/images/monitor_timelapse_off_dark.svg b/resources/images/monitor_timelapse_off_dark.svg new file mode 100644 index 0000000..1978532 --- /dev/null +++ b/resources/images/monitor_timelapse_off_dark.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/resources/images/monitor_timelapse_on.svg b/resources/images/monitor_timelapse_on.svg new file mode 100644 index 0000000..ca46179 --- /dev/null +++ b/resources/images/monitor_timelapse_on.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/resources/images/monitor_timelapse_on_dark.svg b/resources/images/monitor_timelapse_on_dark.svg new file mode 100644 index 0000000..63ab229 --- /dev/null +++ b/resources/images/monitor_timelapse_on_dark.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/resources/images/monitor_vcamera_off.svg b/resources/images/monitor_vcamera_off.svg new file mode 100644 index 0000000..edbcc92 --- /dev/null +++ b/resources/images/monitor_vcamera_off.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/resources/images/monitor_vcamera_off_dark.svg b/resources/images/monitor_vcamera_off_dark.svg new file mode 100644 index 0000000..8ed58c9 --- /dev/null +++ b/resources/images/monitor_vcamera_off_dark.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/resources/images/monitor_vcamera_on.svg b/resources/images/monitor_vcamera_on.svg new file mode 100644 index 0000000..b26c3f1 --- /dev/null +++ b/resources/images/monitor_vcamera_on.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/resources/images/monitor_vcamera_on_dark.svg b/resources/images/monitor_vcamera_on_dark.svg new file mode 100644 index 0000000..1c829d6 --- /dev/null +++ b/resources/images/monitor_vcamera_on_dark.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/resources/images/pipe_of_empty.svg b/resources/images/pipe_of_empty.svg new file mode 100644 index 0000000..1508e54 --- /dev/null +++ b/resources/images/pipe_of_empty.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/resources/images/pipe_of_loading_selected.svg b/resources/images/pipe_of_loading_selected.svg new file mode 100644 index 0000000..4479919 --- /dev/null +++ b/resources/images/pipe_of_loading_selected.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/images/pipe_of_loading_unselected.svg b/resources/images/pipe_of_loading_unselected.svg new file mode 100644 index 0000000..7d47a04 --- /dev/null +++ b/resources/images/pipe_of_loading_unselected.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/images/pipe_of_unloading_selected.svg b/resources/images/pipe_of_unloading_selected.svg new file mode 100644 index 0000000..dda2874 --- /dev/null +++ b/resources/images/pipe_of_unloading_selected.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/images/pipe_of_unloading_unselected.svg b/resources/images/pipe_of_unloading_unselected.svg new file mode 100644 index 0000000..22638cb --- /dev/null +++ b/resources/images/pipe_of_unloading_unselected.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/images/refresh_machine_list_able.svg b/resources/images/refresh_machine_list_able.svg index dad967f..8fba003 100644 --- a/resources/images/refresh_machine_list_able.svg +++ b/resources/images/refresh_machine_list_able.svg @@ -1,8 +1,3 @@ - - - - + + diff --git a/resources/images/right_extruder_active_empty.svg b/resources/images/right_extruder_active_empty.svg new file mode 100644 index 0000000..ccbc111 --- /dev/null +++ b/resources/images/right_extruder_active_empty.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/resources/images/right_extruder_active_filled.svg b/resources/images/right_extruder_active_filled.svg new file mode 100644 index 0000000..b160ee8 --- /dev/null +++ b/resources/images/right_extruder_active_filled.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/resources/images/right_extruder_unactive_empty.svg b/resources/images/right_extruder_unactive_empty.svg new file mode 100644 index 0000000..6d62ac7 --- /dev/null +++ b/resources/images/right_extruder_unactive_empty.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/resources/images/right_extruder_unactive_filled.svg b/resources/images/right_extruder_unactive_filled.svg new file mode 100644 index 0000000..6d62ac7 --- /dev/null +++ b/resources/images/right_extruder_unactive_filled.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/resources/images/right_nozzle.svg b/resources/images/right_nozzle.svg new file mode 100644 index 0000000..5fb901f --- /dev/null +++ b/resources/images/right_nozzle.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/resources/images/sdcard_state_abnormal.svg b/resources/images/sdcard_state_abnormal.svg new file mode 100644 index 0000000..a88e8df --- /dev/null +++ b/resources/images/sdcard_state_abnormal.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/resources/images/sdcard_state_abnormal_dark.svg b/resources/images/sdcard_state_abnormal_dark.svg new file mode 100644 index 0000000..b2ac57f --- /dev/null +++ b/resources/images/sdcard_state_abnormal_dark.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/resources/images/sdcard_state_no.svg b/resources/images/sdcard_state_no.svg new file mode 100644 index 0000000..ae45a0c --- /dev/null +++ b/resources/images/sdcard_state_no.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/resources/images/sdcard_state_no_dark.svg b/resources/images/sdcard_state_no_dark.svg new file mode 100644 index 0000000..6b17701 --- /dev/null +++ b/resources/images/sdcard_state_no_dark.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/resources/images/sdcard_state_normal.svg b/resources/images/sdcard_state_normal.svg new file mode 100644 index 0000000..635c33e --- /dev/null +++ b/resources/images/sdcard_state_normal.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/resources/images/sdcard_state_normal_dark.svg b/resources/images/sdcard_state_normal_dark.svg new file mode 100644 index 0000000..0175c20 --- /dev/null +++ b/resources/images/sdcard_state_normal_dark.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/resources/images/single_nozzle_xp.png b/resources/images/single_nozzle_xp.png new file mode 100644 index 0000000..0b20bc4 Binary files /dev/null and b/resources/images/single_nozzle_xp.png differ diff --git a/resources/printers/X-Max 4.json b/resources/printers/X-Max 4.json new file mode 100644 index 0000000..4525789 --- /dev/null +++ b/resources/printers/X-Max 4.json @@ -0,0 +1,84 @@ +{ + "00.00.00.00": { + "display_name": "QIDI X-MAX 4", + "print": { + "2D": { + "laser": { + "power": [ 10, 40 ] + } + }, + "ipcam": { + "resolution_supported": [ "1080p" ], + "virtual_camera": "enabled", + "liveview": { + "remote": "tutk" + }, + "file": { + "local": "local", + "remote": "tutk", + "model_download": "enabled" + } + }, + "nozzle_temp_range": [ 0, 350 ], + "nozzle_replace_wiki": { + "zh": "", + "en": "" + }, + "bed_temp_range": [ 0, 120 ], + "support_motor_noise_cali": false, + "support_tunnel_mqtt": true, + "support_mqtt_alive": true, + "support_command_ams_switch": true, + "support_ssl_for_mqtt": true, + "support_cloud_print_only": false, + "support_1080dpi": true, + "support_prompt_sound": false, + "support_ams_humidity": true, + "support_auto_recovery_step_loss": true, + "support_bed_leveling": 2, + "support_update_remain": true, + "support_timelapse": true, + "support_filament_backup": true, + "support_chamber_fan": true, + "support_aux_fan": true, + "support_send_to_sd": true, + "support_print_all": true, + "support_print_without_sd": true, + "support_flow_calibration": true, + "support_auto_flow_calibration": true, + "support_build_plate_marker_detect": true, + "support_build_plate_marker_detect_type": 2, + "support_lidar_calibration": false, + "support_nozzle_offset_calibration": false, + "support_high_tempbed_calibration": true, + "support_ai_monitoring": true, + "support_first_layer_inspect": false, + "support_save_remote_print_file_to_storage": true, + "support_chamber": true, + "support_chamber_temp_edit": true, + "support_chamber_temp_edit_range": [0, 65], + "support_chamber_temp_switch_heating": 40, + "support_extrusion_cali": false, + "support_user_preset": false, + "support_ams_ext_mix_print": true + }, + "model_id": "MAX 4", + "subseries": [ "MAX 4" ], + "auto_pa_cali_thumbnail_image": "fd_calibration_auto_single_o", + "support_wrapping_detection": false, + "printer_modes": [ "fdm", "laser", "cut" ], + "compatible_machine": [], + "printer_type": "MAX 4", + "printer_thumbnail_image": "printer_thumbnail_xmax4", + "printer_connect_help_image": "input_access_code_x1", + "printer_use_ams_image": "ams_icon", + "printer_ext_image": ["ext_image_xmax4"], + "use_ams_type": "generic", + "printer_arch": "core_xy", + "printer_series": "series_o", + "has_cali_line": true, + "printer_is_enclosed": true, + "enable_set_nozzle_info": false, + "support_safety_options": false + } +} \ No newline at end of file diff --git a/resources/profiles/Q Series.json b/resources/profiles/Q Series.json index 34580d9..a0dd67a 100644 --- a/resources/profiles/Q Series.json +++ b/resources/profiles/Q Series.json @@ -1,6 +1,6 @@ { "name": "Q Series", - "version": "02.04.00.70", + "version": "02.04.01.10", "force_update": "0", "description": "Q Series configurations", "machine_model_list": [ diff --git a/resources/profiles/Q Series/machine/Qidi Q2 0.4 nozzle.json b/resources/profiles/Q Series/machine/Qidi Q2 0.4 nozzle.json index 58a3f25..dc09a71 100644 --- a/resources/profiles/Q Series/machine/Qidi Q2 0.4 nozzle.json +++ b/resources/profiles/Q Series/machine/Qidi Q2 0.4 nozzle.json @@ -17,6 +17,7 @@ "extruder_clearance_height_to_lid": "120", "extruder_clearance_height_to_rod": "40", "extruder_clearance_max_radius": "70", + "is_support_air_condition" : "1", "is_support_3mf" : "1", "is_support_timelapse": "1", "is_support_multi_box": "1", diff --git a/resources/profiles/Q Series/machine/Qidi Q2C 0.4 nozzle.json b/resources/profiles/Q Series/machine/Qidi Q2C 0.4 nozzle.json index 829915b..338ba22 100644 --- a/resources/profiles/Q Series/machine/Qidi Q2C 0.4 nozzle.json +++ b/resources/profiles/Q Series/machine/Qidi Q2C 0.4 nozzle.json @@ -17,6 +17,7 @@ "extruder_clearance_height_to_lid": "120", "extruder_clearance_height_to_rod": "40", "extruder_clearance_max_radius": "70", + "is_support_air_condition" : "1", "is_support_3mf" : "1", "is_support_multi_box": "1", "layer_change_gcode": "SET_PRINT_STATS_INFO CURRENT_LAYER={layer_num + 1}", diff --git a/resources/profiles/X 3 Series.json b/resources/profiles/X 3 Series.json index 5b1594e..38f256f 100644 --- a/resources/profiles/X 3 Series.json +++ b/resources/profiles/X 3 Series.json @@ -1,6 +1,6 @@ { "name": "X-3-Series", - "version": "02.04.00.70", + "version": "02.04.01.10", "force_update": "0", "description": "X-3-Series configurations", "machine_model_list": [ diff --git a/resources/profiles/X 4 Series.json b/resources/profiles/X 4 Series.json index 026d334..37ba5a5 100644 --- a/resources/profiles/X 4 Series.json +++ b/resources/profiles/X 4 Series.json @@ -1,6 +1,6 @@ { "name": "X-4-Series", - "version": "02.04.00.70", + "version": "02.04.01.10", "force_update": "0", "description": "X-4-Series configurations", "machine_model_list": [ diff --git a/resources/profiles/X 4 Series/machine/Qidi X-Max 4 0.4 nozzle.json b/resources/profiles/X 4 Series/machine/Qidi X-Max 4 0.4 nozzle.json index 5a89699..dd4d533 100644 --- a/resources/profiles/X 4 Series/machine/Qidi X-Max 4 0.4 nozzle.json +++ b/resources/profiles/X 4 Series/machine/Qidi X-Max 4 0.4 nozzle.json @@ -11,16 +11,18 @@ "default_print_profile": "0.20mm Standard @X-Max 4", "printer_settings_id": "Qidi", "bed_exclude_area": ["0x0, 16x0, 16x13, 0x13, 0x0, 0x0, 0x0, 0x0, 0x387, 53x387, 53x390, 0x390, 0x387, 0x387, 0x397, 0x390, 338x390, 338x384, 390x384, 390x390, 0x390"], - "change_filament_gcode": "G1 Z{max_layer_z + 3.0} F1200\nTOOL_CHANGE_START F=[current_extruder] T=[next_extruder]\nDISABLE_ALL_SENSOR\nM104 S{old_filament_temp - 10}\nM106 S255\n{if long_retractions_when_cut[previous_extruder]}\nG1 E-{retraction_distances_when_cut[previous_extruder]} F{old_filament_e_feedrate}\n{else}\nG1 E-2 F{old_filament_e_feedrate}\n{endif}\nM400\nCUT_FILAMENT T=[current_extruder]\nMOVE_TO_TRASH\nM106 P2 S0\nUNLOAD_T[current_extruder]\nT[next_extruder]\nM106 S0\n{if nozzle_temperature_range_high[current_extruder] >= nozzle_temperature_range_high[next_extruder]}\nM104 S{nozzle_temperature_range_high[current_extruder]}\nM109.0 S{(nozzle_temperature_range_high[current_extruder])-25}\n{else}\nM104 S{nozzle_temperature_range_high[next_extruder]}\nM109.0 S{(nozzle_temperature_range_high[next_extruder])-25}\n{endif}\n{if long_retractions_when_cut[previous_extruder]}\nG1 E{retraction_distances_when_cut[previous_extruder]} F{old_filament_e_feedrate}\n{endif}\n{if flush_length_1 > 1}\n; FLUSH_START\nG1 Y404 F2000\nG1 E{flush_length_1} F{old_filament_e_feedrate *0.5}\n; FLUSH_END\n{endif}\n{if flush_length_2 > 1}\n; FLUSH_START\nG1 E{flush_length_2} F{new_filament_e_feedrate * 0.5}\n; FLUSH_END\n{endif}\n{if flush_length_3 > 1}\n; FLUSH_START\nG1 E{flush_length_3} F{new_filament_e_feedrate * 0.5}\n; FLUSH_END\n{endif}\n{if flush_length_4 > 1}\n; FLUSH_START\nG1 E{flush_length_4} F{new_filament_e_feedrate * 0.5}\n; FLUSH_END\n{endif}\nM400\nM106 S180\nM104 S{new_filament_temp - 10}\nG1 E1 F10\nM109.1 S{new_filament_temp - 10}\nG1 E-4 F1000\nG4 P2000\nM204 S10000\nG1 Y403 F2000\nG1 X163 F8000\nG1 X145 F5000\nG1 X163 F8000\nG1 X145 F5000\nG1 X175 F6000\nG1 X163\nG1 X175\nG1 X163\nG1 X175\nG1 X163\nG1 X180 F10000\nG1 Y380\nM104 S[new_filament_temp]\nTOOL_CHANGE_END\nG1 E{new_retract_length_toolchange + 1} F{new_filament_e_feedrate}\nENABLE_ALL_SENSOR\n", + "change_filament_gcode": "G1 Z{max_layer_z + 3.0} F1200\nTOOL_CHANGE_START F=[current_extruder] T=[next_extruder]\nDISABLE_ALL_SENSOR\nM104 S{old_filament_temp - 10}\nM106 S255\n{if long_retractions_when_cut[previous_extruder]}\nG1 E-{retraction_distances_when_cut[previous_extruder]} F{old_filament_e_feedrate}\n{else}\nG1 E-2 F{old_filament_e_feedrate}\n{endif}\nM400\nCUT_FILAMENT T=[current_extruder]\nMOVE_TO_TRASH\nM106 P2 S0\nUNLOAD_T[current_extruder]\nT[next_extruder]\nM106 S0\n{if nozzle_temperature_range_high[current_extruder] >= nozzle_temperature_range_high[next_extruder]}\nM104 S{nozzle_temperature_range_high[current_extruder]}\nM109.0 S{(nozzle_temperature_range_high[current_extruder])-25}\n{else}\nM104 S{nozzle_temperature_range_high[next_extruder]}\nM109.0 S{(nozzle_temperature_range_high[next_extruder])-25}\n{endif}\n{if long_retractions_when_cut[previous_extruder]}\nG1 E{retraction_distances_when_cut[previous_extruder]} F{old_filament_e_feedrate}\n{endif}\n{if flush_length_1 > 1}\n; FLUSH_START\nG1 Y403.5 F2000\nG1 E{flush_length_1} F{old_filament_e_feedrate * 0.5}\n; FLUSH_END\n{endif}\n{if flush_length_2 > 1}\n; FLUSH_START\nG1 E{flush_length_2} F{new_filament_e_feedrate * 0.5}\n; FLUSH_END\n{endif}\n{if flush_length_3 > 1}\n; FLUSH_START\nG1 E{flush_length_3} F{new_filament_e_feedrate * 0.5}\n; FLUSH_END\n{endif}\n{if flush_length_4 > 1}\n; FLUSH_START\nG1 E{flush_length_4} F{new_filament_e_feedrate * 0.5}\n; FLUSH_END\n{endif}\nM400\nM106 S180\nM104 S{new_filament_temp - 10}\nG1 E1 F10\nM109.1 S{new_filament_temp - 10}\nG1 E-4 F1000\nG4 P2000\nM204 S5000\nG1 Y403 F2000\nG1 X163 F8000\nG1 X145 F5000\nG1 X163 F3000\nG1 X145 F2000\nG1 X175 F6000\nG1 X163\nG1 X175\nG1 X163\nG1 X175\nG1 X163\nG1 X180 F8000\nG1 Y380\nG1 X116\nG4 P2000\nG1 Y403 F3000\nG1 X130\nG1 X100 F8000\nG1 Y380\nG1 X116\nG1 Y403 F3000\nG1 X130 F3000\nG1 X100 F8000\nG1 Y380\nM104 S[new_filament_temp]\nTOOL_CHANGE_END\nG1 E{new_retract_length_toolchange + 1} F{new_filament_e_feedrate}\nENABLE_ALL_SENSOR\n", "default_filament_profile": ["QIDI PLA Rapido @Qidi X-Max 4 0.4 nozzle"], "enable_long_retraction_when_cut": "2", "extruder_clearance_height_to_lid": "120", "extruder_clearance_height_to_rod": "40", "extruder_clearance_max_radius": "70", + "is_support_air_condition" : "1", "is_support_3mf" : "1", + "is_support_mqtt" : "1", "is_support_timelapse": "1", "is_support_multi_box": "1", - "layer_change_gcode": "{if timelapse_type == 1} ; timelapse with wipe tower\nG92 E0\nG1 E-[retraction_length] F1800\nG2 Z{layer_z + 0.4} I0.86 J0.86 P1 F20000 ; spiral lift a little\nG1 Y380 F20000\nG1 X128 F20000\n{if layer_z <=25}\nG1 Z25\n{endif}\nG1 Y403 F2000\nG92 E0\nM400\nTIMELAPSE_TAKE_FRAME\nG1 E[retraction_length] F300\nG1 X180 F8000\nG1 Y380 F8000\n{if layer_z <=25}\nG1 Z[layer_z]\n{endif}\n{elsif timelapse_type == 0} ; timelapse without wipe tower\nTIMELAPSE_TAKE_FRAME\n{endif}\nG92 E0\nSET_PRINT_STATS_INFO CURRENT_LAYER={layer_num + 1}", + "layer_change_gcode": "{if timelapse_type == 1} ; timelapse with wipe tower\nG92 E0\nG1 E-[retraction_length] F1800\nG2 Z{layer_z + 0.4} I0.86 J0.86 P1 F20000 ; spiral lift a little\nMOVE_TO_TRASH\n{if layer_z <=25}\nG1 Z25\n{endif}\nG92 E0\nM400\nTIMELAPSE_TAKE_FRAME\nG1 E[retraction_length] F300\nG1 X180 F8000\nG1 Y380\n{if layer_z <=25}\nG1 Z[layer_z]\n{endif}\n{elsif timelapse_type == 0} ; timelapse without wipe tower\nTIMELAPSE_TAKE_FRAME\n{endif}\nG92 E0\nSET_PRINT_STATS_INFO CURRENT_LAYER={layer_num + 1}", "machine_end_gcode": "DISABLE_BOX_HEATER\nM141 S0\nM140 S0\nDISABLE_ALL_SENSOR\nG1 E-3 F1800\nG0 Z{max_layer_z + 3} F600\nUNLOAD_FILAMENT T=[current_extruder]\nG0 Y380 F12000\nG0 X128 Y380 F12000\n{if max_layer_z < max_print_height / 2}G1 Z{max_print_height / 2 + 10} F600{else}G1 Z{min(max_print_height, max_layer_z + 3)}{endif}\nM104 S0\nPRINT_END", "machine_max_jerk_e": ["4"], "machine_max_jerk_x": ["9"], @@ -32,7 +34,7 @@ "machine_max_acceleration_y": ["30000"], "machine_max_speed_x": ["800"], "machine_max_speed_y": ["800"], - "machine_start_gcode": ";===== PRINT_PHASE_INIT =====\nSET_PRINT_MAIN_STATUS MAIN_STATUS=print_start\nM220 S100\nM221 S100\nSET_INPUT_SHAPER SHAPER_TYPE_X=mzv\nSET_INPUT_SHAPER SHAPER_TYPE_Y=mzv\nDISABLE_ALL_SENSOR\nM1002 R1\nM107\nCLEAR_PAUSE\nM140 S[bed_temperature_initial_layer_single]\nM141 S[chamber_temperatures]\nG29.0\nG28\n\n;===== BOX_PREPAR =====\nBOX_PRINT_START EXTRUDER=[initial_no_support_extruder] HOTENDTEMP={nozzle_temperature_range_high[initial_tool]}\nM400\nEXTRUSION_AND_FLUSH HOTEND=[nozzle_temperature_initial_layer]\n\n;===== CLEAR_NOZZLE =====\nG1 Z20 F480\nMOVE_TO_TRASH\nG1 Y404 F2000\n{if chamber_temperatures[0] == 0}\nM106 P3 S[during_print_exhaust_fan_speed]\n{else}\nM106 P3 S0\n{endif}\nM1004\nM106 S0\nM109 S[nozzle_temperature_initial_layer]\nG92 E0\nM83\nG1 E5 F80\nG1 E250 F300\nM400\nM106 S255\nG1 E-3 F1000\nM104 S140\nM109.1 S{nozzle_temperature_initial_layer[0]-30}\nM204 S10000\nG1 Y403 F2000\nG1 X163 F8000\nG1 X145 F5000\nG1 X163 F8000\nG1 X145 F5000\nG1 X175 F6000\nG1 X163\nG1 X175\nG1 X163\nG1 X175\nG1 X163\nG1 X180 F10000\nG1 Y395 F6000\nG1 X188\nG1 Z-0.2 F480\nM106 S255\nM109.1 S150\nG91\nG1 X15 F200\nG1 Y2\nG1 X-15\nG1 Y-2\nG1 X15\nG90\nG2 I0.5 J0.5 F480\nG2 I0.5 J0.5\nG2 I0.5 J0.5\nG1 Z10\nG1 Y383 F12000\nG1 X116\nG1 X163 F8000\nG1 X145 F5000\nG1 X163 F8000\nG1 X145 F5000\nG1 X175 F6000\nG1 X163\nG1 X175\nG1 X163\nG1 X175\nG1 X163\nG1 X180 F10000\nM106 S0\nM190 S[bed_temperature_initial_layer_single]\nM191 S[chamber_temperatures]\nG1 Y0 F15000\nG1 X15 F15000\nG1 X3 F5000\nG4 P1000\nG1 X4 F1000\nG1 X3 F5000\nG4 P1000\nG1 X15 F3000\nG1 E-4 F1800\nG1 X20 Y20 F15000\nZ_TILT_ADJUST\nG29\nM1002 A1\nG1 X380 Y5 F20000\nM109 S[nozzle_temperature_initial_layer]\nENABLE_ALL_SENSOR\n\n;===== PRINT_START =====\nSET_PRINT_MAIN_STATUS MAIN_STATUS=printing\nSET_PRINT_STATS_INFO TOTAL_LAYER=[total_layer_count]\nT[initial_tool]\nM140 S[bed_temperature_initial_layer_single]\nM104 S[nozzle_temperature_initial_layer]\nM141 S[chamber_temperatures]\nG0 X200 Y1 F20000\nG0 Z10 F480\nG4 P3000\nprobe samples=1\nG91\nG0 Z5 F480\nG90\nG1 X173 Y1 F20000\nG91\nG0 Z{initial_layer_print_height-5} F480\nG90\nG0 X193 E8 F{outer_wall_volumetric_speed/(24/20) * 60}\nG0 X198 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\nG0 X203 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 X208 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\nG0 X213 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 X218 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\nG91\nG1 X1 Z{-initial_layer_print_height-0.1}\nG1 X4\nG1 Z1 F480\nG90\nG1 X173 Y2.5 F20000\nG91\nG1 Z-0.7 F480\nG90\nG0 X193 E10 F{outer_wall_volumetric_speed/(24/20) * 60}\nG0 X198 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\nG0 X203 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 X208 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\nG0 X213 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 X218 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\nG91\nG1 X1 Z{-initial_layer_print_height-0.1}\nG1 X4\nG1 Z1 F480\nG90\n", + "machine_start_gcode": ";===== PRINT_PHASE_INIT =====\nSET_PRINT_MAIN_STATUS MAIN_STATUS=print_start\nM220 S100\nM221 S100\nSET_INPUT_SHAPER SHAPER_TYPE_X=mzv\nSET_INPUT_SHAPER SHAPER_TYPE_Y=mzv\nDISABLE_ALL_SENSOR\nM1002 R1\nM107\nCLEAR_PAUSE\nM140 S[bed_temperature_initial_layer_single]\nM141 S[chamber_temperatures]\nG29.0\nG28\n\n;===== BOX_PREPAR =====\nBOX_PRINT_START EXTRUDER=[initial_no_support_extruder] HOTENDTEMP={nozzle_temperature_range_high[initial_tool]}\nM400\nEXTRUSION_AND_FLUSH HOTEND=[nozzle_temperature_initial_layer]\n\n;===== CLEAR_NOZZLE =====\nG1 Z20 F480\nMOVE_TO_TRASH\nG1 Y403.5 F2000\n{if chamber_temperatures[0] == 0}\nM106 P3 S[during_print_exhaust_fan_speed]\n{else}\nM106 P3 S0\n{endif}\nM1004\nM106 S0\nM109 S[nozzle_temperature_initial_layer]\nG92 E0\nM83\nG1 E5 F80\nG1 E250 F300\nM400\nM106 S255\nG1 E-3 F1000\nM104 S140\nM109.1 S{nozzle_temperature_initial_layer[0]-30}\nM204 S10000\nG1 Y403 F2000\nG1 X163 F8000\nG1 X145 F5000\nG1 X163 F8000\nG1 X145 F5000\nG1 X175 F6000\nG1 X163\nG1 X175\nG1 X163\nG1 X175\nG1 X163\nG1 X180 F10000\nG1 Y395 F6000\nG1 X188\nG1 Z-0.2 F480\nM106 S255\nM109.1 S150\nG91\nG1 X15 F200\nG1 Y2\nG1 X-15\nG1 Y-2\nG1 X15\nG90\nG2 I0.5 J0.5 F480\nG2 I0.5 J0.5\nG2 I0.5 J0.5\nG1 Z10\nG1 Y383 F12000\nG1 X116\nG1 Y403\nG1 X163 F8000\nG1 X145 F5000\nG1 X163 F8000\nG1 X145 F5000\nG1 X175 F6000\nG1 X163\nG1 X175\nG1 X163\nG1 X175\nG1 X163\nG1 X180 F10000\nG1 X195 Y195\nM106 S0\nM190 S[bed_temperature_initial_layer_single]\nM191 S[chamber_temperatures]\nM400\nSET_OPERATING_CURRENT STEPPER=x VALUE=1500\nG4 P400\nSET_OPERATING_CURRENT STEPPER=y VALUE=1500\nG4 P400\nG1 Y0 F15000\nG1 X15\nG1 X3 F5000\nG4 P1000\nG1 X4 F1000\nG1 X3 F5000\nG4 P1000\nG1 E-4 F1800\nG1 X15 F3000\n\nM400\nSET_OPERATING_CURRENT STEPPER=x VALUE=1200\nG4 P400\nSET_OPERATING_CURRENT STEPPER=y VALUE=1200\nG4 P2000\nG1 X20 Y20 F15000\nZ_TILT_ADJUST\nG29\nM1002 A1\nG1 X380 Y5 F20000\nM109 S[nozzle_temperature_initial_layer]\nENABLE_ALL_SENSOR\n\n;===== PRINT_START =====\nSET_PRINT_MAIN_STATUS MAIN_STATUS=printing\nSET_PRINT_STATS_INFO TOTAL_LAYER=[total_layer_count]\nT[initial_tool]\nM140 S[bed_temperature_initial_layer_single]\nM104 S[nozzle_temperature_initial_layer]\nM141 S[chamber_temperatures]\nG0 X195 Y1 F20000\nG0 Z10 F480\nG92 Z{10 - ((nozzle_temperature_initial_layer[initial_tool] - 130) / 14 - 5.0) / 100}\nG4 P3000\nprobe samples=1\nG91\nG0 Z5 F480\nG90\nG1 X170 Y1 F20000\nG91\nG0 Z{initial_layer_print_height-5} F480\nG90\nG0 X190 E8 F{outer_wall_volumetric_speed/(24/20) * 60}\nG0 X195 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\nG0 X200 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 X205 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\nG0 X210 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 X215 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\nG91\nG1 X1 Z{-initial_layer_print_height-0.1}\nG1 X4\nG1 Z1 F480\nG1 X-50 Y1.5 F20000\nG1 Z{1-initial_layer_print_height-0.1} F480\nG90\nG0 X190 E10 F{outer_wall_volumetric_speed/(24/20) * 60}\nG0 X195 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\nG0 X200 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 X205 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\nG0 X210 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 X215 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\nG91\nG1 X1 Z{-initial_layer_print_height-0.1}\nG1 X4\nG1 Z1 F480\nG90", "nozzle_diameter": ["0.4"], "nozzle_volume": ["150"], "printable_area": ["0x0","390x0","390x390","0x390"], diff --git a/resources/profiles/officiall_filas_list.cfg b/resources/profiles/officiall_filas_list.cfg new file mode 100644 index 0000000..612bef6 --- /dev/null +++ b/resources/profiles/officiall_filas_list.cfg @@ -0,0 +1,432 @@ +[fila1] +filament = PLA Rapido +min_temp = 190 +max_temp = 240 +box_min_temp = 0 +box_max_temp = 0 +type = PLA + +[fila2] +filament = PLA Matte +min_temp = 190 +max_temp = 240 +box_min_temp = 0 +box_max_temp = 0 +type = PLA + +[fila3] +filament = PLA Metal +min_temp = 190 +max_temp = 240 +box_min_temp = 0 +box_max_temp = 0 +type = PLA + +[fila4] +filament = PLA Silk +min_temp = 190 +max_temp = 240 +box_min_temp = 0 +box_max_temp = 0 +type = PLA + +[fila5] +filament = PLA-CF +min_temp = 210 +max_temp = 250 +box_min_temp = 0 +box_max_temp = 0 +type = PLA-CF + +[fila6] +filament = PLA-Wood +min_temp = 190 +max_temp = 240 +box_min_temp = 0 +box_max_temp = 45 +type = PLA + +[fila7] +filament = PLA Basic +min_temp = 190 +max_temp = 240 +box_min_temp = 0 +box_max_temp = 0 +type = PLA + +[fila8] +filament = PLA Matte Basic +min_temp = 190 +max_temp = 230 +box_min_temp = 0 +box_max_temp = 0 +type = PLA + +[fila9] +filament = +min_temp = +max_temp = +box_min_temp = +box_max_temp = +type = + +[fila10] +filament = Support For PLA +min_temp = 210 +max_temp = 240 +box_min_temp = 0 +box_max_temp = 0 +type = PLA-S + +[fila11] +filament = ABS Rapido +min_temp = 240 +max_temp = 280 +box_min_temp = 0 +box_max_temp = 45 +type = ABS + +[fila12] +filament = ABS-GF +min_temp = 240 +max_temp = 280 +box_min_temp = 0 +box_max_temp = 45 +type = ABS-GF + +[fila13] +filament = ABS-Metal +min_temp = 240 +max_temp = 280 +box_min_temp = 0 +box_max_temp = 45 +type = ABS + +[fila14] +filament = ABS-Odorless +min_temp = 240 +max_temp = 280 +box_min_temp = 0 +box_max_temp = 45 +type = ABS + +[fila15] +filament = +min_temp = +max_temp = +box_min_temp = +box_max_temp = +type = + +[fila16] +filament = +min_temp = +max_temp = +box_min_temp = +box_max_temp = +type = + +[fila17] +filament = +min_temp = +max_temp = +box_min_temp = +box_max_temp = +type = + +[fila18] +filament = ASA +min_temp = 240 +max_temp = 280 +box_min_temp = 0 +box_max_temp = 45 +type = ASA + +[fila19] +filament = ASA-Aero +min_temp = 240 +max_temp = 280 +box_min_temp = 0 +box_max_temp = 45 +type = ASA-AERO + +[fila20] +filament = ASA-CF +min_temp = 240 +max_temp = 280 +box_min_temp = 0 +box_max_temp = 45 +type = ASA-CF + +[fila21] +filament = +min_temp = +max_temp = +box_min_temp = +box_max_temp = +type = + +[fila22] +filament = +min_temp = +max_temp = +box_min_temp = +box_max_temp = +type = + +[fila23] +filament = PC +min_temp = 240 +max_temp = 280 +box_min_temp = 0 +box_max_temp = 0 +type = PC + +[fila24] +filament = UltraPA +min_temp = 260 +max_temp = 300 +box_min_temp = 0 +box_max_temp = 55 +type = UltraPA + +[fila25] +filament = PA-CF +min_temp = 260 +max_temp = 300 +box_min_temp = 0 +box_max_temp = 65 +type = PA-CF + +[fila26] +filament = UltraPA-CF25 +min_temp = 300 +max_temp = 320 +box_min_temp = 0 +box_max_temp = 65 +type = UltraPA-CF25 + +[fila27] +filament = PA12-CF +min_temp = 260 +max_temp = 300 +box_min_temp = 0 +box_max_temp = 65 +type = PA12-CF + +[fila28] +filament = +min_temp = +max_temp = +box_min_temp = +box_max_temp = +type = + +[fila29] +filament = +min_temp = +max_temp = +box_min_temp = +box_max_temp = +type = + +[fila30] +filament = PAHT-CF +min_temp = 300 +max_temp = 320 +box_min_temp = 0 +box_max_temp = 65 +type = PAHT-CF + +[fila31] +filament = PAHT-GF +min_temp = 300 +max_temp = 320 +box_min_temp = 0 +box_max_temp = 65 +type = PAHT-GF + +[fila32] +filament = Support For PAHT +min_temp = 260 +max_temp = 280 +box_min_temp = 0 +box_max_temp = 65 +type = PAHT-S + +[fila33] +filament = Support For PET/PA +min_temp = 260 +max_temp = 280 +box_min_temp = 0 +box_max_temp = 65 +type = PA-S + +[fila34] +filament = PC/ABS-FR +min_temp = 260 +max_temp = 280 +box_min_temp = 0 +box_max_temp = 50 +type = PC-ABS-FR + +[fila35] +filament = TPEE +min_temp = 230 +max_temp = 260 +box_min_temp = 0 +box_max_temp = 0 +type = TPEE + +[fila36] +filament = PEBA +min_temp = 230 +max_temp = 260 +box_min_temp = 0 +box_max_temp = 0 +type = PEBA + +[fila37] +filament = PET-CF +min_temp = 280 +max_temp = 320 +box_min_temp = 0 +box_max_temp = 65 +type = PET-CF + +[fila38] +filament = PET-GF +min_temp = 280 +max_temp = 320 +box_min_temp = 0 +box_max_temp = 50 +type = PET-GF + +[fila39] +filament = PETG Basic +min_temp = 240 +max_temp = 280 +box_min_temp = 0 +box_max_temp = 45 +type = PETG + +[fila40] +filament = PETG-Tough +min_temp = 240 +max_temp = 275 +box_min_temp = 0 +box_max_temp = 45 +type = PETG + +[fila41] +filament = PETG Rapido +min_temp = 220 +max_temp = 270 +box_min_temp = 0 +box_max_temp = 45 +type = PETG + +[fila42] +filament = PETG-CF +min_temp = 240 +max_temp = 270 +box_min_temp = 0 +box_max_temp = 45 +type = PETG-CF + +[fila43] +filament = PETG-GF +min_temp = 240 +max_temp = 270 +box_min_temp = 0 +box_max_temp = 45 +type = PETG-GF + +[fila44] +filament = PPS-CF +min_temp = 300 +max_temp = 350 +box_min_temp = 0 +box_max_temp = 65 +type = PPS-CF + +[fila45] +filament = PETG Translucent +min_temp = 240 +max_temp = 280 +box_min_temp = 0 +box_max_temp = 45 +type = PETG + +[fila46] +filament = PPS-GF +min_temp = 300 +max_temp = 350 +box_min_temp = 0 +box_max_temp = 65 +type = PPS-GF + +[fila47] +filament = PVA +min_temp = 210 +max_temp = 250 +box_min_temp = 0 +box_max_temp = 50 +type = PVA + +[fila48] +filament = TPU-AERO 64D +min_temp = 200 +max_temp = 250 +box_min_temp = 0 +box_max_temp = 0 +type = TPU-AERO 64D + +[fila49] +filament = TPU-Aero +min_temp = 200 +max_temp = 250 +box_min_temp = 0 +box_max_temp = 0 +type = TPU-AERO + +[fila50] +filament = TPU 95A-HF +min_temp = 200 +max_temp = 250 +box_min_temp = 0 +box_max_temp = 0 +type = TPU + +[colordict] +1 = #FAFAFA +2 = #060606 +3 = #D9E3ED +4 = #5CF30F +5 = #63E492 +6 = #2850FF +7 = #FE98FE +8 = #DFD628 +9 = #228332 +10 = #99DEFF +11 = #1714B0 +12 = #CEC0FE +13 = #CADE4B +14 = #1353AB +15 = #5EA9FD +16 = #A878FF +17 = #FE717A +18 = #FF362D +19 = #E2DFCD +20 = #898F9B +21 = #6E3812 +22 = #CAC59F +23 = #F28636 +24 = #B87F2B + +[vendor_list] +0 = Generic +1 = QIDI + + + diff --git a/resources/web/homepage3/img/arrow-right.png b/resources/web/homepage3/img/arrow-right.png new file mode 100644 index 0000000..4d6e1ed Binary files /dev/null and b/resources/web/homepage3/img/arrow-right.png differ diff --git a/resources/web/homepage3/img/arrow-right.svg b/resources/web/homepage3/img/arrow-right.svg new file mode 100644 index 0000000..389cf2a --- /dev/null +++ b/resources/web/homepage3/img/arrow-right.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/web/homepage3/img/loginBackground.png b/resources/web/homepage3/img/loginBackground.png new file mode 100644 index 0000000..ebb9109 Binary files /dev/null and b/resources/web/homepage3/img/loginBackground.png differ diff --git a/resources/web/homepage3/login.html b/resources/web/homepage3/login.html new file mode 100644 index 0000000..933ab3e --- /dev/null +++ b/resources/web/homepage3/login.html @@ -0,0 +1,254 @@ + + + + + 登录指南 + + + +
+

登录指南

+ +
+

通过 QIDI MAKER 或 QIDI LINK 注册并登录账号后,即可将你的 QIDI

+

STUDIO 软件绑定至账户。

+

完成绑定后,QIDI STUDIO 切片软件可通过 QIDI 云服务器、远程控制并管理 +

当前全部已登录该用户账号的打印机,实现远程发送打印任务、状态同步与 +

设备管理。

+
+ +
+ + +
+ +
+ +
+
+
+
+
QIDI MAKER与QIDI LINK的区别?
+
QIDI MAKER APP是一个面向用户的一站式3D打印平台,致力于为用户提供便
+ 捷、流畅且愉悦的3D打印体验。目前,QIDI MAKER暂时仅兼容QIDI Max4,
+ 后续将逐步支持更多QIDI 3D打印机型号。
+
+ +
+
账号无法登录?
+
如遇到任何问题,请随时联系QIDI官方售后支持:
+
+
+ + +
+
+ + + + \ No newline at end of file diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index 4819984..333d41c 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -463,6 +463,12 @@ void AppConfig::set_defaults() if (get("print", "enable_multi_box").empty()) { set_str("print", "enable_multi_box", "0"); } + +//y76 + if (get("print", "enable_air_condition").empty()){ + set_str("print", "enable_air_condition", "0"); + } + if (get("print", "flow_cali").empty()) { set_str("print", "flow_cali", "1"); } @@ -513,6 +519,16 @@ void AppConfig::set_defaults() if(get("switch to device tab after upload").empty()) set_bool("switch to device tab after upload", false); +//y76 + if(get("last_selected_machine").empty()) + set("last_selected_machine", ""); + + if(get("last_sel_machine_is_net").empty()) + set_bool("last_sel_machine_is_net", false); + + if(get("is_support_mqtt").empty()) + set_bool("is_support_mqtt", false); + // Remove legacy window positions/sizes erase("app", "main_frame_maximized"); erase("app", "main_frame_pos"); diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 49ce8ac..ac1f1c7 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -1073,6 +1073,8 @@ static std::vector s_Preset_printer_options { , "is_support_timelapse" //y65 , "is_support_multi_box" + , "is_support_mqtt" + , "is_support_air_condition" }; static std::vector s_Preset_sla_print_options { diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 510a171..c0db662 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -224,6 +224,7 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n ,"box_temperature" //y60 ,"is_support_3mf" + , "is_support_mqtt" }; static std::unordered_set steps_ignore; diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index e7ae651..0bc0e46 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -2865,6 +2865,11 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvanced; def->set_default_value(new ConfigOptionBool(false)); +//y76 + def = this->add("is_support_mqtt", coBool); + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionBool(false)); + //QDS // def = this->add("spaghetti_detector", coBool); // def->label = L("Enable spaghetti detector"); @@ -3854,6 +3859,11 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvanced; def->set_default_value(new ConfigOptionBool(false)); +//y76 + def = this->add("is_support_air_condition", coBool); + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionBool(false)); + def = this->add("printer_variant", coString); //def->label = L("Printer variant"); def->label = "Printer variant"; diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 1a5e405..1d3b8a0 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1211,6 +1211,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionBool, support_multi_bed_types)) //y60 ((ConfigOptionBool, is_support_3mf)) + ((ConfigOptionBool, is_support_mqtt)) ) // This object is mapped to Perl as Slic3r::Config::Print. @@ -1391,7 +1392,8 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionString, box_id)) ((ConfigOptionBool, is_support_timelapse)) //y65 - ((ConfigOptionBool, is_support_multi_box))) + ((ConfigOptionBool, is_support_multi_box)) + ((ConfigOptionBool, is_support_air_condition))) // This object is mapped to Perl as Slic3r::Config::Full. PRINT_CONFIG_CLASS_DERIVED_DEFINE0( diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index 983094e..b6de849 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -222,6 +222,8 @@ set(SLIC3R_GUI_SOURCES GUI/MainFrame.hpp GUI/QDTTopbar.cpp GUI/QDTTopbar.hpp + GUI/QDSDeviceManager.cpp + GUI/QDSDeviceManager.hpp GUI/BedShapeDialog.cpp GUI/BedShapeDialog.hpp GUI/Plater.cpp @@ -663,6 +665,7 @@ if (APPLE) GUI/wxMediaCtrl2.mm GUI/wxMediaCtrl2.h GUI/wxMediaCtrl3.h + GUI/wxMediaCtrl3.cpp ) FIND_LIBRARY(DISKARBITRATION_LIBRARY DiskArbitration) else () @@ -685,6 +688,9 @@ endif () add_library(libslic3r_gui STATIC ${SLIC3R_GUI_SOURCES}) target_include_directories(libslic3r_gui PRIVATE Utils) +#set(WEBSOCKETPP_INSTALL_DIR ${CMAKE_PREFIX_PATH}) +#target_include_directories(libslic3r_gui ${CMAKE_PREFIX_PATH}/include) + if (WIN32) target_include_directories(libslic3r_gui PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../../deps/WebView2/include) endif() diff --git a/src/slic3r/GUI/AMSMaterialsSetting.cpp b/src/slic3r/GUI/AMSMaterialsSetting.cpp index ae4f09e..19ffcfa 100644 --- a/src/slic3r/GUI/AMSMaterialsSetting.cpp +++ b/src/slic3r/GUI/AMSMaterialsSetting.cpp @@ -22,6 +22,9 @@ namespace Slic3r { namespace GUI { wxDEFINE_EVENT(EVT_SELECTED_COLOR, wxCommandEvent); +wxDEFINE_EVENT(EVT_SELECTED_TYPE, wxCommandEvent); +wxDEFINE_EVENT(EVT_SET_COLOR, wxCommandEvent); +wxDEFINE_EVENT(EVT_SET_TYPE, wxCommandEvent); static std::string float_to_string_with_precision(float value, int precision = 3) { @@ -50,7 +53,7 @@ void AMSMaterialsSetting::create() create_panel_normal(m_panel_normal); m_panel_kn = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); create_panel_kn(m_panel_kn); - + m_panel_kn->Hide(); wxBoxSizer *m_sizer_button = new wxBoxSizer(wxHORIZONTAL); m_sizer_button->Add(0, 0, 1, wxEXPAND, 0); @@ -66,6 +69,7 @@ void AMSMaterialsSetting::create() m_button_confirm->Bind(wxEVT_BUTTON, &AMSMaterialsSetting::on_select_ok, this); m_button_reset = new Button(this, _L("Reset")); + m_button_reset->Hide(); m_btn_bg_gray = StateColor(std::pair(wxColour(206, 206, 206), StateColor::Pressed), std::pair(*wxWHITE, StateColor::Focused), std::pair(wxColour(238, 238, 238), StateColor::Hovered), std::pair(*wxWHITE, StateColor::Normal)); @@ -184,8 +188,7 @@ void AMSMaterialsSetting::create_panel_normal(wxWindow* parent) m_clr_picker = new ColorPicker(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize); m_clr_picker->set_show_full(true); m_clr_picker->SetBackgroundColour(*wxWHITE); - - + m_clr_picker->Bind(wxEVT_LEFT_DOWN, &AMSMaterialsSetting::on_clr_picker, this); m_sizer_colour->Add(m_clr_picker, 0, 0, 0); m_clr_name = new Label(parent, wxEmptyString); @@ -225,7 +228,7 @@ void AMSMaterialsSetting::create_panel_normal(wxWindow* parent) sizer_tempinput->Add(FromDIP(10), 0, 0, 0); sizer_tempinput->Add(m_input_nozzle_min, 1, wxALIGN_CENTER, 0); sizer_tempinput->Add(bitmap_max_degree, 0, wxALIGN_CENTER, 0); - + wxBoxSizer* sizer_temp_txt = new wxBoxSizer(wxHORIZONTAL); auto m_title_max = new wxStaticText(parent, wxID_ANY, _L("max"), wxDefaultPosition, AMS_MATERIALS_SETTING_INPUT_SIZE); m_title_max->SetForegroundColour(AMS_MATERIALS_SETTING_GREY800); @@ -276,6 +279,7 @@ void AMSMaterialsSetting::create_panel_normal(wxWindow* parent) m_panel_SN->SetSizer(m_sizer_SN); m_panel_SN->Layout(); m_panel_SN->Fit(); + m_panel_SN->Hide(); wxBoxSizer* m_tip_sizer = new wxBoxSizer(wxHORIZONTAL); m_tip_readonly = new Label(parent, _L("")); @@ -298,6 +302,7 @@ void AMSMaterialsSetting::create_panel_normal(wxWindow* parent) sizer->Add(0, 0, 0, wxTOP, FromDIP(24)); sizer->Add(m_tip_sizer, 0, wxLEFT, FromDIP(20)); parent->SetSizer(sizer); + } void AMSMaterialsSetting::create_panel_kn(wxWindow* parent) @@ -484,7 +489,8 @@ void AMSMaterialsSetting::update_filament_editing(bool is_printing) } m_tip_readonly->Wrap(FromDIP(380)); - m_tip_readonly->Show(is_printing); + m_tip_readonly->Hide(); + //m_tip_readonly->Show(is_printing); } } @@ -573,6 +579,30 @@ void AMSMaterialsSetting::on_select_reset(wxCommandEvent& event) { void AMSMaterialsSetting::on_select_ok(wxCommandEvent &event) { + //cj_1 + wxString filamentName = m_comboBox_filament->GetValue(); + wxColour curColor = m_clr_picker->m_colour; + wxString colorHex = curColor.GetAsString(wxC2S_HTML_SYNTAX); + if (filamentName.IsEmpty() || colorHex.IsEmpty()) { + BOOST_LOG_TRIVIAL(trace) << "Invalid Setting id"; + MessageDialog msg_dlg(nullptr, _L("You need to select the material type and color first."), wxEmptyString, wxICON_WARNING | wxOK); + msg_dlg.ShowModal(); + return; + } + wxCommandEvent setColorEvt(EVT_SET_COLOR); + setColorEvt.SetString(colorHex); + setColorEvt.SetInt(slot_id); + wxPostEvent(GetParent(), setColorEvt); + + + + wxCommandEvent setTypeEvt(EVT_SET_TYPE); + setTypeEvt.SetString(filamentName); + wxPostEvent(GetParent(), setTypeEvt); + + Close(); + return; + //get filament id ams_filament_id = ""; ams_setting_id = ""; @@ -760,7 +790,8 @@ void AMSMaterialsSetting::set_color(wxColour color) //m_clrData->SetColour(color); m_clr_picker->is_empty(false); m_clr_picker->set_color(color); - + m_clr_picker->set_colors({ wxColour("#FFFOOO") }); + return; FilamentColor fila_color; fila_color.m_colors.insert(color); fila_color.EndSet(m_clr_picker->ctype); @@ -804,20 +835,37 @@ void AMSMaterialsSetting::on_picker_color(wxCommandEvent& event) set_colors({ color }); } +//cj_1 +void AMSMaterialsSetting::setComboBoxData(wxArrayString data) +{ + m_comboBox_filament->Set(data); +} + +void AMSMaterialsSetting::setMinMaxTemp(wxString minTemp, wxString maxTmep) +{ + m_input_nozzle_min->GetTextCtrl()->SetValue(minTemp); + m_input_nozzle_max->GetTextCtrl()->SetValue(maxTmep); +} + +//cj_1 +void AMSMaterialsSetting::setComboBoxValue(wxString curValue) +{ + m_comboBox_filament->SetValue(curValue); +} + void AMSMaterialsSetting::on_clr_picker(wxMouseEvent &event) { if(!m_is_third) return; - if (obj->is_in_printing() || obj->can_resume()) { - if (!obj->is_support_filament_setting_inprinting) { - return; - } - } +// return; +// if (obj->is_in_printing() || obj->can_resume()) { +// if (!obj->is_support_filament_setting_inprinting) { +// return; +// } +// } std::vector ams_colors; - obj->GetFilaSystem()->CollectAmsColors(ams_colors); - wxPoint img_pos = m_clr_picker->ClientToScreen(wxPoint(0, 0)); wxPoint popup_pos(img_pos.x - m_color_picker_popup.GetSize().x - FromDIP(95), img_pos.y - FromDIP(65)); m_color_picker_popup.Position(popup_pos, wxSize(0, 0)); @@ -846,10 +894,10 @@ void AMSMaterialsSetting::update_widgets() m_panel_normal->Show(); else m_panel_normal->Hide(); - m_panel_kn->Show(); + //m_panel_kn->Show(); } else if (obj && (obj->ams_support_virtual_tray || obj->cali_version >= 0)) { m_panel_normal->Show(); - m_panel_kn->Show(); + //m_panel_kn->Show(); } else { m_panel_normal->Show(); m_panel_kn->Hide(); @@ -866,12 +914,13 @@ bool AMSMaterialsSetting::Show(bool show) //m_clr_picker->set_color(m_clr_picker->GetParent()->GetBackgroundColour()); m_ratio_text->Show(); - m_wiki_ctrl->Show(); - m_k_param->Show(); - m_input_k_val->Show(); + //m_wiki_ctrl->Show(); + //m_k_param->Show(); + //m_input_k_val->Show(); Layout(); Fit(); - wxGetApp().UpdateDlgDarkUI(this); + // ShowModal(); + // wxGetApp().UpdateDlgDarkUI(this); } return DPIDialog::Show(show); } @@ -887,8 +936,9 @@ static void _collect_filament_info(const wxString& shown_name, void AMSMaterialsSetting::Popup(wxString filament, wxString sn, wxString temp_min, wxString temp_max, wxString k, wxString n) { - if (!obj) return; + //if (!obj) return; update_widgets(); + // set default value if (k.IsEmpty()) k = "0.000"; @@ -908,15 +958,11 @@ void AMSMaterialsSetting::Popup(wxString filament, wxString sn, wxString temp_mi std::set filament_id_set; PresetBundle * preset_bundle = wxGetApp().preset_bundle; std::ostringstream stream; - int extruder_id = obj->get_extruder_id_by_ams_id(std::to_string(ams_id)); - if (!obj->GetExtderSystem()->GetExtderById(extruder_id)) - { - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " get extruder id failed"; - extruder_id = 0; - } - stream << std::fixed << std::setprecision(1) << obj->GetExtderSystem()->GetNozzleDiameter(extruder_id); + + //stream << std::fixed << std::setprecision(1) << obj->GetExtderSystem()->GetNozzleDiameter(0); std::string nozzle_diameter_str = stream.str(); - std::set printer_names = preset_bundle->get_printer_names_by_printer_type_and_nozzle(DevPrinterConfigUtil::get_printer_display_name(obj->printer_type), nozzle_diameter_str); + //std::set printer_names = preset_bundle->get_printer_names_by_printer_type_and_nozzle(DevPrinterConfigUtil::get_printer_display_name(obj->printer_type), nozzle_diameter_str); + std::set printer_names = { "X-Max 4" }; auto & filaments = preset_bundle->filaments; if (preset_bundle) { @@ -927,7 +973,7 @@ void AMSMaterialsSetting::Popup(wxString filament, wxString sn, wxString temp_mi /*The situation where the user preset is not displayed is as follows: 1. Not a root preset 2. Not system preset and the printer firmware does not support user preset */ - if (filaments.get_preset_base(*filament_it) != &preset || (!filament_it->is_system && !obj->is_support_user_preset)) { + if (preset_bundle->filaments.get_preset_base(*filament_it) != &preset || (!filament_it->is_system /* &&!obj->is_support_user_preset*/)) { continue; } @@ -984,7 +1030,8 @@ void AMSMaterialsSetting::Popup(wxString filament, wxString sn, wxString temp_mi if (!sn.empty()) { m_sn_number->SetLabel(sn); - m_panel_SN->Show(); + //m_panel_SN->Show(); + m_panel_SN->Hide(); } else { m_panel_SN->Hide(); @@ -1342,8 +1389,15 @@ int AMSMaterialsSetting::get_cali_index_by_ams_slot(MachineObject *obj, int ams_ void AMSMaterialsSetting::on_select_filament(wxCommandEvent &evt) { // Get the flag whether to open the filament setting dialog from the device page - int* from_printer = static_cast(m_comboBox_filament->GetClientData()); + //cj_1 + int selectIndex = evt.GetSelection(); + wxString curSelectName = m_comboBox_filament->GetValue(); + wxCommandEvent evt1(EVT_SELECTED_TYPE); + evt1.SetString(curSelectName); + wxPostEvent(GetParent(), evt1); + return; + int* from_printer = static_cast(m_comboBox_filament->GetClientData()); m_filament_type = ""; PresetBundle* preset_bundle = wxGetApp().preset_bundle; if (preset_bundle) { @@ -1726,30 +1780,31 @@ ColorPickerPopup::ColorPickerPopup(wxWindow* parent) :PopupWindow(parent, wxBORDER_NONE) { m_def_colors.clear(); - m_def_colors.push_back(wxColour("#FFFFFF")); - m_def_colors.push_back(wxColour("#fff144")); - m_def_colors.push_back(wxColour("#DCF478")); - m_def_colors.push_back(wxColour("#0ACC38")); - m_def_colors.push_back(wxColour("#057748")); - m_def_colors.push_back(wxColour("#0d6284")); - m_def_colors.push_back(wxColour("#0EE2A0")); - m_def_colors.push_back(wxColour("#76D9F4")); - m_def_colors.push_back(wxColour("#46a8f9")); - m_def_colors.push_back(wxColour("#2850E0")); - m_def_colors.push_back(wxColour("#443089")); - m_def_colors.push_back(wxColour("#A03CF7")); - m_def_colors.push_back(wxColour("#F330F9")); - m_def_colors.push_back(wxColour("#D4B1DD")); - m_def_colors.push_back(wxColour("#f95d73")); - m_def_colors.push_back(wxColour("#f72323")); - m_def_colors.push_back(wxColour("#7c4b00")); - m_def_colors.push_back(wxColour("#f98c36")); - m_def_colors.push_back(wxColour("#fcecd6")); - m_def_colors.push_back(wxColour("#D3C5A3")); - m_def_colors.push_back(wxColour("#AF7933")); - m_def_colors.push_back(wxColour("#898989")); - m_def_colors.push_back(wxColour("#BCBCBC")); - m_def_colors.push_back(wxColour("#161616")); + //cj_1 + m_def_colors.push_back(wxColour("#FAFAFA")); + m_def_colors.push_back(wxColour("#060606")); + m_def_colors.push_back(wxColour("#D9E3ED")); + m_def_colors.push_back(wxColour("#5CF30F")); + m_def_colors.push_back(wxColour("#63E492")); + m_def_colors.push_back(wxColour("#2850FF")); + m_def_colors.push_back(wxColour("#FE98FE")); + m_def_colors.push_back(wxColour("#DFD628")); + m_def_colors.push_back(wxColour("#228332")); + m_def_colors.push_back(wxColour("#99DEFF")); + m_def_colors.push_back(wxColour("#1714B0")); + m_def_colors.push_back(wxColour("#CEC0FE")); + m_def_colors.push_back(wxColour("#CADE4B")); + m_def_colors.push_back(wxColour("#1353AB")); + m_def_colors.push_back(wxColour("#5EA9FD")); + m_def_colors.push_back(wxColour("#A878FF")); + m_def_colors.push_back(wxColour("#FE717A")); + m_def_colors.push_back(wxColour("#FF362D")); + m_def_colors.push_back(wxColour("#E2DFCD")); + m_def_colors.push_back(wxColour("#898F9B")); + m_def_colors.push_back(wxColour("#6E3812")); + m_def_colors.push_back(wxColour("#CAC59F")); + m_def_colors.push_back(wxColour("#F28636")); + m_def_colors.push_back(wxColour("#B87F2B")); SetBackgroundColour(wxColour(*wxWHITE)); diff --git a/src/slic3r/GUI/AMSMaterialsSetting.hpp b/src/slic3r/GUI/AMSMaterialsSetting.hpp index 4ec5b39..b90a21d 100644 --- a/src/slic3r/GUI/AMSMaterialsSetting.hpp +++ b/src/slic3r/GUI/AMSMaterialsSetting.hpp @@ -116,6 +116,13 @@ public: void set_ctype(int ctype); void on_picker_color(wxCommandEvent& color); + + //cj_1 + void setComboBoxData(wxArrayString data); + void setMinMaxTemp(wxString minTemp, wxString maxTmep); + + //cj_1 + void setComboBoxValue(wxString curValue); MachineObject* obj{ nullptr }; int ams_id { 0 }; /* 0 ~ 3 */ int slot_id { 0 }; /* 0 ~ 3 */ @@ -208,6 +215,9 @@ protected: }; wxDECLARE_EVENT(EVT_SELECTED_COLOR, wxCommandEvent); +wxDECLARE_EVENT(EVT_SELECTED_TYPE, wxCommandEvent); +wxDECLARE_EVENT(EVT_SET_COLOR, wxCommandEvent); +wxDECLARE_EVENT(EVT_SET_TYPE, wxCommandEvent); }} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/AMSSetting.cpp b/src/slic3r/GUI/AMSSetting.cpp index 7d2f83f..2ef367f 100644 --- a/src/slic3r/GUI/AMSSetting.cpp +++ b/src/slic3r/GUI/AMSSetting.cpp @@ -15,7 +15,10 @@ #include "slic3r/GUI/Widgets/ComboBox.hpp" namespace Slic3r { namespace GUI { - + //cj_1 + wxDEFINE_EVENT(EVTSET_INSERT_READ, wxCommandEvent); ///ams/insert/filament/read/enable + wxDEFINE_EVENT(EVTSET_BOOT_READ, wxCommandEvent); ///ams/boot/read/enable + wxDEFINE_EVENT(EVTSET_AUTO_FILAMENT, wxCommandEvent); ///ams/auto/filament/enable AMSSetting::AMSSetting(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, long style) : DPIDialog(parent, id, wxEmptyString, pos, size, style) { @@ -77,7 +80,7 @@ void AMSSetting::create() m_tip_Insert_material_line1->SetForegroundColour(AMS_SETTING_GREY700); m_tip_Insert_material_line1->SetSize(wxSize(AMS_SETTING_BODY_WIDTH, -1)); m_tip_Insert_material_line1->Wrap(AMS_SETTING_BODY_WIDTH); - m_tip_Insert_material_line1->Hide(); + //m_tip_Insert_material_line1->Hide(); m_sizer_Insert_material_tip_inline->Add(m_tip_Insert_material_line1, 0, wxEXPAND, 0); // tip line2 @@ -148,11 +151,13 @@ void AMSSetting::create() // checkbox area 3 wxBoxSizer* m_sizer_remain = new wxBoxSizer(wxHORIZONTAL); m_checkbox_remain = new ::CheckBox(m_panel_body); + m_checkbox_remain->Hide(); m_checkbox_remain->Bind(wxEVT_TOGGLEBUTTON, &AMSSetting::on_remain, this); m_sizer_remain->Add(m_checkbox_remain, 0, wxALIGN_CENTER_VERTICAL); m_sizer_remain->Add(0, 0, 0, wxLEFT, 12); m_title_remain = new wxStaticText(m_panel_body, wxID_ANY, _L("Update remaining capacity"), wxDefaultPosition, wxDefaultSize, 0); m_title_remain->SetFont(::Label::Head_13); + m_title_remain->Hide(); m_title_remain->SetForegroundColour(AMS_SETTING_GREY800); m_title_remain->Wrap(AMS_SETTING_BODY_WIDTH); m_sizer_remain->Add(m_title_remain, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT, 0); @@ -166,6 +171,7 @@ void AMSSetting::create() m_sizer_remain_inline = new wxBoxSizer(wxVERTICAL); m_tip_remain_line1 = new Label(m_panel_body, _L("BOX will attempt to estimate the remaining capacity of the QIDI Tech filaments.")); + m_tip_remain_line1->Hide(); m_tip_remain_line1->SetFont(::Label::Body_13); m_tip_remain_line1->SetForegroundColour(AMS_SETTING_GREY700); m_tip_remain_line1->SetSize(wxSize(AMS_SETTING_BODY_WIDTH, -1)); @@ -376,6 +382,23 @@ void AMSSetting::update_insert_material_read_mode(MachineObject* obj) void AMSSetting::update_insert_material_read_mode(bool selected, std::string version) { + //cj_1 + m_panel_Insert_material->Show(); + m_checkbox_Insert_material_auto_read->SetValue(selected); + m_checkbox_Insert_material_auto_read->Show(); + m_title_Insert_material_auto_read->Show(); + if (selected) { + m_tip_Insert_material_line1->Show(); + m_tip_Insert_material_line2->Show(); + m_tip_Insert_material_line3->Hide(); + } + else { + m_tip_Insert_material_line1->Hide(); + m_tip_Insert_material_line2->Hide(); + m_tip_Insert_material_line3->Show(); + } + return; + if (!version.empty() && version >= AMS_F1_SUPPORT_INSERTION_UPDATE_DEFAULT) { m_checkbox_Insert_material_auto_read->SetValue(true); m_checkbox_Insert_material_auto_read->Hide(); @@ -409,11 +432,17 @@ void AMSSetting::update_insert_material_read_mode(bool selected, std::string ver void AMSSetting::update_ams_img(MachineObject* obj_) { + std::string ams_icon_str1 = DevPrinterConfigUtil::get_printer_ams_img("X-MAX 4"); + if (ams_icon_str1 != m_ams_img_name) { + m_am_img->SetBitmap(create_scaled_bitmap(ams_icon_str1, nullptr, 126)); + m_am_img->Refresh(); + } if (!obj_) { return; } - std::string ams_icon_str = DevPrinterConfigUtil::get_printer_ams_img(obj_->printer_type); + std::string ams_icon_str = DevPrinterConfigUtil::get_printer_ams_img(obj_->printer_type); + if (auto ams_switch = obj_->GetFilaSystem()->GetAmsFirmwareSwitch().lock(); ams_switch->GetCurrentFirmwareIdxSel() == 1) { ams_icon_str = "ams_icon";// A series support AMS @@ -448,9 +477,10 @@ void AMSSetting::update_starting_read_mode(bool selected) void AMSSetting::update_remain_mode(bool selected) { if (m_obj->is_support_update_remain) { - m_checkbox_remain->Show(); - m_title_remain->Show(); - m_tip_remain_line1->Show(); + //cj_1 + //m_checkbox_remain->Show(); + //m_title_remain->Show(); + //m_tip_remain_line1->Show(); Layout(); } else { @@ -464,17 +494,18 @@ void AMSSetting::update_remain_mode(bool selected) void AMSSetting::update_switch_filament(bool selected) { - if (m_obj->is_support_filament_backup) { - m_checkbox_switch_filament->Show(); - m_title_switch_filament->Show(); - m_tip_switch_filament_line1->Show(); - Layout(); - } else { - m_checkbox_switch_filament->Hide(); - m_title_switch_filament->Hide(); - m_tip_switch_filament_line1->Hide(); - Layout(); - } + //cj_1 +// if (m_obj->is_support_filament_backup) { +// m_checkbox_switch_filament->Show(); +// m_title_switch_filament->Show(); +// m_tip_switch_filament_line1->Show(); +// Layout(); +// } else { +// m_checkbox_switch_filament->Hide(); +// m_title_switch_filament->Hide(); +// m_tip_switch_filament_line1->Hide(); +// Layout(); +// } m_checkbox_switch_filament->SetValue(selected); } @@ -500,6 +531,13 @@ void AMSSetting::update_air_printing_detection(MachineObject* obj) void AMSSetting::on_insert_material_read(wxCommandEvent &event) { + event.Skip(); + wxCommandEvent e(EVTSET_INSERT_READ); + e.SetInt(m_checkbox_Insert_material_auto_read->GetValue()); + e.SetString("enable"); + wxPostEvent(GetParent(), e); + return; + // send command if (m_checkbox_Insert_material_auto_read->GetValue()) { // checked @@ -529,6 +567,13 @@ void AMSSetting::on_insert_material_read(wxCommandEvent &event) void AMSSetting::on_starting_read(wxCommandEvent &event) { + + event.Skip(); + wxCommandEvent e(EVTSET_BOOT_READ); + e.SetInt(m_checkbox_starting_auto_read->GetValue()); + e.SetString("enable"); + wxPostEvent(GetParent(), e); + return; if (m_checkbox_starting_auto_read->GetValue()) { // checked m_tip_starting_line1->Show(); @@ -564,6 +609,13 @@ void AMSSetting::on_remain(wxCommandEvent& event) void AMSSetting::on_switch_filament(wxCommandEvent& event) { + event.Skip(); + wxCommandEvent e(EVTSET_AUTO_FILAMENT); + e.SetInt(m_checkbox_switch_filament->GetValue()); + e.SetString("enable"); + wxPostEvent(GetParent(), e); + return; + bool switch_filament = m_checkbox_switch_filament->GetValue(); m_obj->command_ams_switch_filament(switch_filament); event.Skip(); diff --git a/src/slic3r/GUI/AMSSetting.hpp b/src/slic3r/GUI/AMSSetting.hpp index 8e8a258..fada013 100644 --- a/src/slic3r/GUI/AMSSetting.hpp +++ b/src/slic3r/GUI/AMSSetting.hpp @@ -24,7 +24,10 @@ class AnimaIcon; class ComboBox; namespace Slic3r { namespace GUI { - + //cj_1 + wxDECLARE_EVENT(EVTSET_INSERT_READ, wxCommandEvent); ///ams/insert/filament/read/enable + wxDECLARE_EVENT(EVTSET_BOOT_READ, wxCommandEvent); ///ams/boot/read/enable + wxDECLARE_EVENT(EVTSET_AUTO_FILAMENT, wxCommandEvent); ///ams/auto/filament/enable class AMSSettingTypePanel; class AMSSetting : public DPIDialog { @@ -35,9 +38,6 @@ public: public: void UpdateByObj(MachineObject* obj); -protected: - void create(); - void update_ams_img(MachineObject* obj); void update_starting_read_mode(bool selected); void update_remain_mode(bool selected); @@ -45,6 +45,9 @@ protected: void update_insert_material_read_mode(MachineObject* obj); void update_insert_material_read_mode(bool selected, std::string version); void update_air_printing_detection(MachineObject* obj); +protected: + void create(); + void update_firmware_switching_status(); diff --git a/src/slic3r/GUI/AmsMappingPopup.cpp b/src/slic3r/GUI/AmsMappingPopup.cpp index 4c2de0a..8f3d215 100644 --- a/src/slic3r/GUI/AmsMappingPopup.cpp +++ b/src/slic3r/GUI/AmsMappingPopup.cpp @@ -1955,7 +1955,7 @@ AmsHumidityTipPopup::AmsHumidityTipPopup(wxWindow* parent) humidity_level_list = new AmsHumidityLevelList(this); curr_humidity_img = new wxStaticBitmap(this, wxID_ANY, create_scaled_bitmap("hum_level1_light", this, 132), wxDefaultPosition, wxSize(FromDIP(132), FromDIP(132)), 0); - + m_staticText_note = new Label(this, _L("Please change the desiccant when it is too wet. The indicator may not represent accurately in following cases : when the lid is open or the desiccant pack is changed. it take hours to absorb the moisture, low temperatures also slow down the process.")); m_staticText_note->SetMinSize(wxSize(FromDIP(680), -1)); m_staticText_note->SetMaxSize(wxSize(FromDIP(680), -1)); @@ -2382,7 +2382,7 @@ void AmsReplaceMaterialDialog::create() m_scrollview_groups = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL | wxVSCROLL); m_scrollview_groups->SetScrollRate(5, 5); - //m_scrollview_groups->SetMinSize(wxSize(400, 400)); + //m_scrollview_groups->SetMinSize(wxSize(200, 200)); //m_scrollview_groups->SetMaxSize(wxSize(400, 400)); m_scrollview_sizer = new wxBoxSizer(wxVERTICAL); @@ -2422,13 +2422,27 @@ void AmsReplaceMaterialDialog::create() m_main_sizer->Add(m_button_sizer,0,wxALIGN_CENTER, FromDIP(16)); m_main_sizer->Add(0,0,0, wxTOP, FromDIP(20)); - CenterOnParent(); SetSizer(m_main_sizer); Layout(); Fit(); } +void AmsReplaceMaterialDialog::update_data(std::vectorbackupGroupDatas) +{ + int index = 1; + for (BackupGroupData groupData : backupGroupDatas) { + m_groups_sizer->Add(create_backup_group(wxString::Format("%s%d", _L("Group"), index), + groupData.group_info, groupData.material), 0, wxALL, FromDIP(10)); + ++index; + } + m_scrollview_groups->SetMinSize(wxSize(200, 200)); + m_scrollview_groups->SetMaxSize(wxSize(200, 200)); + + Layout(); + Fit(); +} + void AmsReplaceMaterialDialog::update_machine_obj(MachineObject* obj) { if (obj) @@ -2467,8 +2481,7 @@ void AmsReplaceMaterialDialog::on_dpi_changed(const wxRect& suggested_rect) } -static std::unordered_map -_GetBackupStatus(unsigned int fila_back_group) +static std::unordered_map _GetBackupStatus(unsigned int fila_back_group) { std::unordered_map trayid_group; for (int i = 0; i < 16; i++) diff --git a/src/slic3r/GUI/AmsMappingPopup.hpp b/src/slic3r/GUI/AmsMappingPopup.hpp index a3eb497..ce26c33 100644 --- a/src/slic3r/GUI/AmsMappingPopup.hpp +++ b/src/slic3r/GUI/AmsMappingPopup.hpp @@ -501,6 +501,12 @@ private: wxString m_group_index; }; + +struct BackupGroupData +{ + wxString material; + std::mapgroup_info; +}; class AmsReplaceMaterialDialog : public DPIDialog { public: @@ -508,6 +514,7 @@ public: ~AmsReplaceMaterialDialog() {}; public: + void update_data(std::vectorbackupGroupDatas); void update_machine_obj(MachineObject* obj); void paintEvent(wxPaintEvent& evt); void on_dpi_changed(const wxRect& suggested_rect) override; diff --git a/src/slic3r/GUI/DeviceCore/DevManager.cpp b/src/slic3r/GUI/DeviceCore/DevManager.cpp index 5f8121c..8dc091a 100644 --- a/src/slic3r/GUI/DeviceCore/DevManager.cpp +++ b/src/slic3r/GUI/DeviceCore/DevManager.cpp @@ -504,6 +504,7 @@ namespace Slic3r MachineObject* DeviceManager::get_selected_machine() { + return nullptr; if (selected_machine.empty()) return nullptr; MachineObject* obj = get_user_machine(selected_machine); @@ -805,7 +806,7 @@ namespace Slic3r const std::string& /*new_dev_id*/) { if (MachineObject* obj_ = get_selected_machine()) { - GUI::wxGetApp().sidebar().update_sync_status(obj_); + //GUI::wxGetApp().sidebar().update_sync_status(obj_); GUI::wxGetApp().sidebar().load_ams_list(obj_); }; } diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index c62ac50..943eea8 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -111,11 +111,14 @@ #include "ModelMall.hpp" #include "HintNotification.hpp" #include "QDTUtil.hpp" - +#include "PrinterWebView.hpp" //#ifdef WIN32 //#include "BaseException.h" //#endif +#if QDT_RELEASE_TO_PUBLIC +#include "../QIDI/QIDINetwork.hpp" +#endif #ifdef __WXMSW__ #include @@ -3907,8 +3910,8 @@ void GUI_App::recreate_GUI(const wxString &msg_name) m_is_recreating_gui = true; update_http_extra_header(); - // y19 - mainframe->m_printer_view->StopStatusThread(); + // y74 + mainframe->m_printer_view->m_device_manager->stopAllConnection(); mainframe->shutdown(); ProgressDialog dlg(msg_name, msg_name, 100, nullptr, wxPD_AUTO_HIDE); @@ -4016,28 +4019,33 @@ void GUI_App::ShowDownNetPluginDlg(bool post_login) void GUI_App::ShowUserLogin(bool show) { - // QDS: User Login Dialog - if (show) { - try { - if (!login_dlg) - login_dlg = new ZUserLogin(); - else { - delete login_dlg; - login_dlg = new ZUserLogin(); - } - login_dlg->ShowModal(); - } catch (std::exception &) { - ; - } - } else { - if (login_dlg) - login_dlg->EndModal(wxID_OK); - } + + + if (!show) { + if (login_dlg) { + login_dlg->EndModal(wxID_OK); + } + return; + } + // QDS: User Login Dialog + try { + if (login_dlg != nullptr) { + delete login_dlg; + } + login_dlg = new ZUserLogin(); + login_dlg->ShowModal(); + } + catch (std::exception&) { + ; + } + + } // 10 void GUI_App::SetOnlineLogin(bool status) { + m_qidi_login = status; mainframe->m_printer_view->SetLoginStatus(status); } @@ -4046,6 +4054,10 @@ void GUI_App::SetPresentChange(bool status) mainframe->m_printer_view->SetPresetChanged(status); } +void GUI_App::setUserName(std::string name) +{ + m_user_name = name; +} void GUI_App::ShowOnlyFilament() { // QDS:Show NewUser Guide @@ -4320,16 +4332,20 @@ void GUI_App::get_login_info() // y15 // y16 bool m_isloginin = (wxGetApp().app_config->get("user_token") != ""); if (m_isloginin) { - if(m_user_name.empty()) - { - wxString msg; - QIDINetwork m_qidinetwork; - m_user_name = m_qidinetwork.user_info(msg); - //y33 - std::string head_name = wxGetApp().app_config->get("user_head_name"); - // y21 - if (m_user_name.empty()) - { + std::string head_name = wxGetApp().app_config->get("user_head_name"); + if(m_user_name.empty()){ + bool is_link = app_config->get("login_method") != "Maker"; + if(is_link){ + wxString msg; + QIDINetwork m_qidinetwork; + m_user_name = m_qidinetwork.user_info(msg); + } + else{ + m_user_name = MakerHttpHandle::getInstance().get_maker_user_name(); + } + head_name = wxGetApp().app_config->get("user_head_name"); + + if (m_user_name.empty()){ m_user_name = ""; wxGetApp().app_config->set("user_token", ""); wxString user_head_path = (boost::filesystem::path(Slic3r::data_dir()) / "user" / head_name).make_preferred().string(); @@ -4337,9 +4353,7 @@ void GUI_App::get_login_info() GUI::wxGetApp().run_script_left(strJS); m_qidi_login = false; } - else - { - //y34 + else{ wxString user_head_path = (boost::filesystem::path(Slic3r::data_dir()) / "user" / head_name).make_preferred().string(); if (!wxGetApp().app_config->get("user_head_name").empty()) { user_head_path = (boost::filesystem::path(Slic3r::data_dir()) / "user" / head_name).make_preferred().string(); @@ -4352,12 +4366,10 @@ void GUI_App::get_login_info() m_qidi_login = true; } } - else - { - std::string head_name = wxGetApp().app_config->get("user_head_name"); + else{ //y34 - wxString user_head_path; - if (!head_name.empty()) { + wxString user_head_path = (boost::filesystem::path(Slic3r::data_dir()) / "user" / head_name).make_preferred().string(); + if (!wxGetApp().app_config->get("user_head_name").empty()) { user_head_path = (boost::filesystem::path(Slic3r::data_dir()) / "user" / head_name).make_preferred().string(); std::replace(user_head_path.begin(), user_head_path.end(), '\\', '/'); } @@ -4513,21 +4525,31 @@ std::string GUI_App::handle_web_request(std::string cmd) // }); // return ""; //} + // + if (root.get_child_optional("makerworld_model_id") != boost::none) { + boost::optional ModelID = root.get_optional("makerworld_model_id"); + if (ModelID.has_value()) { + if (mainframe) { + if (mainframe->m_webview) + { + mainframe->m_webview->SetMakerworldModelID(ModelID.value()); + } + } + } + } + // cj_1 + CallAfter([this] { + if (mainframe && mainframe->m_webview) + { + mainframe->m_webview->SwitchWebContent("login", 1); + } + } + ); - if (root.get_child_optional("makerworld_model_id") != boost::none) { - boost::optional ModelID = root.get_optional("makerworld_model_id"); - if (ModelID.has_value()) { - if (mainframe) { - if (mainframe->m_webview) - { - mainframe->m_webview->SetMakerworldModelID(ModelID.value()); - } - } - } - } + CallAfter([this] { - this->request_login(true); + //this->request_login(true); }); } else if (command_str.compare("homepage_logout") == 0) { @@ -4680,10 +4702,14 @@ std::string GUI_App::handle_web_request(std::string cmd) if (root.get_child_optional("menu") != boost::none) { std::string strMenu = root.get_optional("menu").value(); int nRefresh = root.get_child_optional("refresh") == boost::none ? 0 : root.get_optional("refresh").value(); - + + + CallAfter([this,strMenu, nRefresh] { if (mainframe && mainframe->m_webview) { + wxString UrlRight = wxString::Format("file://%s/web/homepage3/home.html?lang=zh_CN", from_u8(resources_dir())); + mainframe->m_webview->load_url(UrlRight); mainframe->m_webview->SwitchWebContent(strMenu, nRefresh); } } diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index 4e4c5af..7395d4c 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -43,6 +43,9 @@ #include "slic3r/GUI/WebUserLoginDialog.hpp" +//y76 +#include "QDSDeviceManager.hpp" + //#define QDT_HAS_FIRST_PAGE 1 #define STUDIO_INACTIVE_TIMEOUT 15*60*1000 #define LOG_FILES_MAX_NUM 30 @@ -291,10 +294,6 @@ private: bool m_force_colors_update { false }; //#endif -#if QDT_RELEASE_TO_PUBLIC - std::vector m_devices; -#endif - std::vector m_mode_palette; wxFont m_small_font; @@ -397,6 +396,9 @@ public: bool show_3d_navigator() const { return app_config->get_bool("show_3d_navigator"); } void toggle_show_3d_navigator() const { app_config->set_bool("show_3d_navigator", !show_3d_navigator()); } + // cj_1 + bool is_link_connect() { return app_config->get("login_method") == "Link"; } + wxString get_inf_dialog_contect () {return m_info_dialog_content;}; std::vector split_str(std::string src, std::string separator); @@ -462,8 +464,9 @@ public: #if QDT_RELEASE_TO_PUBLIC - std::vector get_devices() { return m_devices; }; - void set_devices(std::vector devices) { m_devices = devices; }; +//y76 + std::vector get_devices() { return qdsdevmanager->getNetDevices(); }; + void set_devices(std::vector devices) { qdsdevmanager->setNetDevices(devices); }; #endif @@ -492,6 +495,7 @@ public: void ShowUserLogin(bool show = true); void SetOnlineLogin(bool status); void SetPresentChange(bool status); + void setUserName(std::string name); void ShowOnlyFilament(); //QDS void request_login(bool show_user_info = false); @@ -679,6 +683,9 @@ public: MainFrame* mainframe{ nullptr }; Plater* plater_{ nullptr }; + //y76 + QDSDeviceManager* qdsdevmanager { nullptr }; + PresetUpdater* get_preset_updater() { return preset_updater; } Notebook* tab_panel() const ; diff --git a/src/slic3r/GUI/Jobs/PrintJob.cpp b/src/slic3r/GUI/Jobs/PrintJob.cpp index 788912d..270e2fb 100644 --- a/src/slic3r/GUI/Jobs/PrintJob.cpp +++ b/src/slic3r/GUI/Jobs/PrintJob.cpp @@ -279,6 +279,7 @@ void PrintJob::process() params.try_emmc_print = this->could_emmc_print; //y71 params.enable_multi_box = this->enable_multi_box; + params.enable_air_condition = this->enable_air_condition; if (m_print_type == "from_sdcard_view") { params.dst_file = m_dst_path; diff --git a/src/slic3r/GUI/Jobs/PrintJob.hpp b/src/slic3r/GUI/Jobs/PrintJob.hpp index 3a4da5b..8a8c1d9 100644 --- a/src/slic3r/GUI/Jobs/PrintJob.hpp +++ b/src/slic3r/GUI/Jobs/PrintJob.hpp @@ -94,6 +94,7 @@ public: int extruder_cali_manual_mode = -1; //y71 int enable_multi_box{0}; + int enable_air_condition{0}; //y void set_print_config(std::string bed_type, bool bed_leveling, bool flow_cali, bool vabration_cali, bool record_timelapse, bool layer_inspect, bool ext_change_assist, @@ -101,7 +102,8 @@ public: int auto_enable_multi_box, int auto_flow_calit, int auto_offset_calit, - int extruder_calit_manual_mode) + int extruder_calit_manual_mode, + int auto_enable_air_condition) { task_bed_type = bed_type; task_bed_leveling = bed_leveling; @@ -116,6 +118,9 @@ public: auto_flow_cali = auto_flow_calit; auto_offset_cali = auto_offset_calit; extruder_cali_manual_mode = extruder_calit_manual_mode; + //y76 + enable_air_condition = auto_enable_air_condition; + } int status_range() const override diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index e42b58e..edaa3a6 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -1,4 +1,6 @@ #include "MainFrame.hpp" +#include "PrinterWebView.hpp" + #include "GLToolbar.hpp" #include #include @@ -76,10 +78,10 @@ #if QDT_RELEASE_TO_PUBLIC #include "../QIDI/QIDINetwork.hpp" #endif - namespace Slic3r { namespace GUI { + wxDEFINE_EVENT(EVT_SELECT_TAB, wxCommandEvent); wxDEFINE_EVENT(EVT_HTTP_ERROR, wxCommandEvent); wxDEFINE_EVENT(EVT_USER_LOGIN, wxCommandEvent); @@ -574,8 +576,8 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, BORDERLESS_FRAME_ m_plater->reset(); - //y - m_printer_view->StopStatusThread(); + //y74 + m_printer_view->m_device_manager->stopAllConnection(); this->shutdown(); // propagate event @@ -721,28 +723,30 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, BORDERLESS_FRAME_ wxGetApp().persist_window_geometry(this, true); wxGetApp().persist_window_geometry(&m_settings_dialog, true); - //53 + //y76 Bind(wxEVT_ICONIZE, [this](wxIconizeEvent& event) { - if (event.IsIconized()) { - wxString url; - if (m_printer_view->GetNetMode()) { - url = wxString::Format("file://%s/web/qidi/link_missing_connection.html", from_u8(resources_dir())); + if(is_webview){ + if (event.IsIconized()) { + wxString url; + if (m_printer_view->GetNetMode()) { + url = wxString::Format("file://%s/web/qidi/link_missing_connection.html", from_u8(resources_dir())); + } + else { + url = wxString::Format("file://%s/web/qidi/missing_connection.html", from_u8(resources_dir())); + } + m_printer_view->load_disconnect_url(url); } else { - url = wxString::Format("file://%s/web/qidi/missing_connection.html", from_u8(resources_dir())); - } - m_printer_view->load_disconnect_url(url); - } - else { - if (!printer_view_ip.empty() && new_sel == tpMonitor) { + if (!printer_view_ip.empty() && new_sel == tpMonitor) { if (is_net_url) - m_printer_view->load_net_url(printer_view_url, printer_view_ip); - else - m_printer_view->load_url(printer_view_url); + m_printer_view->load_net_url(printer_view_url, printer_view_ip); + else + m_printer_view->load_url(printer_view_url); + } + m_printer_view->Layout(); } - m_printer_view->Layout(); } - }); + }); } #ifdef __WIN32__ @@ -1156,6 +1160,8 @@ void MainFrame::init_tabpanel() int old_sel = e.GetOldSelection(); //y53 new_sel = e.GetSelection(); + //y76 + int tab_panel = m_tabpanel->GetSelection(); if (old_sel != wxNOT_FOUND && new_sel != old_sel && @@ -1206,8 +1212,8 @@ void MainFrame::init_tabpanel() // } } else if (new_sel == tpMonitor && wxGetApp().preset_bundle != nullptr) { - //y53 - if(!printer_view_ip.empty()){ + //y53 y76 + if(!printer_view_ip.empty() && is_webview){ if (is_net_url) m_printer_view->load_net_url(printer_view_url, printer_view_ip); else @@ -1221,16 +1227,20 @@ void MainFrame::init_tabpanel() m_calibration->m_filament_choice->update(); m_calibration->m_print_choice->update(); } - //y53 - if (new_sel != tpMonitor){ - wxString url; - if (m_printer_view->GetNetMode()) { - url = wxString::Format("file://%s/web/qidi/link_missing_connection.html", from_u8(resources_dir())); + //y53 //y76 + if (new_sel != tpMonitor && tab_panel != tpMonitor){ + if(is_webview){ + wxString url; + if (m_printer_view->GetNetMode()) { + url = wxString::Format("file://%s/web/qidi/link_missing_connection.html", from_u8(resources_dir())); + } + else { + url = wxString::Format("file://%s/web/qidi/missing_connection.html", from_u8(resources_dir())); + } + m_printer_view->load_disconnect_url(url); } - else { - url = wxString::Format("file://%s/web/qidi/missing_connection.html", from_u8(resources_dir())); - } - m_printer_view->load_disconnect_url(url); + else + m_printer_view->pauseCamera(); } }); @@ -1239,12 +1249,6 @@ void MainFrame::init_tabpanel() #else m_tabpanel->Bind(wxEVT_NOTEBOOK_PAGE_CHANGED, [this](wxBookCtrlEvent& e) { #endif - if (e.GetEventObject() != m_tabpanel){ - return;// The event maybe from child TabPanel - } - - // y5 - m_printer_view->SetPauseThread(true); //QDS wxWindow* panel = m_tabpanel->GetCurrentPage(); int sel = m_tabpanel->GetSelection(); @@ -1268,12 +1272,7 @@ void MainFrame::init_tabpanel() if (agent) agent->track_update_property("select_device_page", std::to_string(++select_device_page_count)); } - // y3 - else if(sel == 3) - { - // y5 - m_printer_view->SetPauseThread(false); - } + #ifndef __APPLE__ if (sel == tp3DEditor) { @@ -1334,6 +1333,9 @@ void MainFrame::init_tabpanel() // y5 // m_monitor->Show(false); + //y76 + wxGetApp().qdsdevmanager = new QDSDeviceManager(); + m_printer_view = new PrinterWebView(m_tabpanel); // y3 // y5 @@ -1386,8 +1388,8 @@ void MainFrame::init_tabpanel() // OrcaSlicer void MainFrame::show_device(bool bQDTPrinter) { - if (m_tabpanel->GetPage(tpMonitor) != m_monitor && - m_tabpanel->GetPage(tpMonitor) != m_printer_view) { + if (m_tabpanel->GetPage(tpMonitor) != m_monitor + && m_tabpanel->GetPage(tpMonitor) != m_printer_view) { BOOST_LOG_TRIVIAL(error) << "Failed to find device tab"; return; } diff --git a/src/slic3r/GUI/MainFrame.hpp b/src/slic3r/GUI/MainFrame.hpp index e995b3d..488d8fc 100644 --- a/src/slic3r/GUI/MainFrame.hpp +++ b/src/slic3r/GUI/MainFrame.hpp @@ -31,19 +31,26 @@ // QDS #include "QDTTopbar.hpp" -#include "PrinterWebView.hpp" +//#include "PrinterWebView.hpp" #include "calib_dlg.hpp" #include "MultiMachinePage.hpp" //y #include "Filament_web.hpp" + #include + + #include "OctoPrint.hpp" + + #define ENABEL_PRINT_ALL 0 class Notebook; class wxBookCtrlBase; class wxProgressDialog; +class NoteBook; + namespace Slic3r { namespace GUI @@ -54,6 +61,9 @@ class PrintHostQueueDialog; class Plater; class MainFrame; class ParamsDialog; +class PrinterWebView; + + enum QuickSlice { @@ -395,7 +405,7 @@ public: //w FilamentPanel* m_filament{nullptr}; WebViewPanel* m_webview { nullptr }; - PrinterWebView* m_printer_view{nullptr}; + PrinterWebView* m_printer_view; wxLogWindow* m_log_window { nullptr }; // QDS //wxBookCtrlBase* m_tabpanel { nullptr }; @@ -436,10 +446,11 @@ public: int select_device_page_count{ 0 }; - //y53 + //y76 wxString printer_view_url = ""; wxString printer_view_ip = ""; bool is_net_url = false; + bool is_webview = false; int new_sel; #ifdef __APPLE__ diff --git a/src/slic3r/GUI/MediaPlayCtrl.cpp b/src/slic3r/GUI/MediaPlayCtrl.cpp index 29a59c8..8d64a3f 100644 --- a/src/slic3r/GUI/MediaPlayCtrl.cpp +++ b/src/slic3r/GUI/MediaPlayCtrl.cpp @@ -30,6 +30,9 @@ #include "wx/evtloop.h" #include +//y76 +#include + static std::map error_messages = { {1, L("The device cannot handle more conversations. Please retry later.")}, {2, L("Player is malfunctioning. Please reinstall the system player.")}, @@ -44,7 +47,8 @@ namespace GUI { static int SecondsSinceLastInput(); -MediaPlayCtrl::MediaPlayCtrl(wxWindow *parent, wxMediaCtrl3 *media_ctrl, const wxPoint &pos, const wxSize &size) +//y76 +MediaPlayCtrl::MediaPlayCtrl(wxWindow *parent, VideoPanel *media_ctrl, const wxPoint &pos, const wxSize &size) : wxPanel(parent, wxID_ANY, pos, size) , m_media_ctrl(media_ctrl) { @@ -274,6 +278,12 @@ void refresh_agora_url(char const* device, char const* dev_ver, char const* chan void MediaPlayCtrl::Play() { + //y76 + load(); + m_button_play->SetIcon("media_stop"); + SetStatus(_L("Initializing...")); + return; + if (!m_next_retry.IsValid() || wxDateTime::Now() < m_next_retry) return; if (!IsShownOnScreen()) @@ -408,13 +418,17 @@ void MediaPlayCtrl::Play() } } + + + void start_ping_test(); void MediaPlayCtrl::Stop(wxString const &msg, wxString const &msg2) { int last_state = m_last_state; - if (m_last_state != MEDIASTATE_IDLE) { + //y76 + if (m_last_state != wxMEDIASTATE_STOPPED) { m_media_ctrl->InvalidateBestSize(); m_button_play->SetIcon("media_play"); boost::unique_lock lock(m_mutex); @@ -440,7 +454,7 @@ void MediaPlayCtrl::Stop(wxString const &msg, wxString const &msg2) SetStatus(msg2); } else SetStatus(_L("Video Stopped."), false); - m_last_state = MEDIASTATE_IDLE; + m_last_state = wxMEDIASTATE_STOPPED; bool auto_retry = wxGetApp().app_config->get("liveview", "auto_retry") != "false"; if (!auto_retry || m_failed_code >= 100 || m_failed_code == 1 || m_failed_code == -2) // not keep retry on local error or EOS m_next_retry = wxDateTime(); @@ -524,7 +538,11 @@ void MediaPlayCtrl::Stop(wxString const &msg, wxString const &msg2) void MediaPlayCtrl::TogglePlay() { BOOST_LOG_TRIVIAL(info) << "MediaPlayCtrl::TogglePlay"; - if (m_last_state != MEDIASTATE_IDLE) { + //y76 + auto state = m_media_ctrl->GetState(); + if (m_last_state != state) + m_last_state = state; + if (m_last_state != wxMEDIASTATE_STOPPED) { m_next_retry = wxDateTime(); Stop(); } else { @@ -681,74 +699,88 @@ void MediaPlayCtrl::jump_to_play() TogglePlay(); } +//cj_1 +void MediaPlayCtrl::stopMonitor() +{ + Stop(); +} + void MediaPlayCtrl::onStateChanged(wxMediaEvent &event) { + //y76 auto last_state = m_last_state; - auto state = m_media_ctrl->GetState(); - BOOST_LOG_TRIVIAL(info) << "MediaPlayCtrl::onStateChanged: " << state << ", last_state: " << last_state; - if ((int) state < 0) return; - { - boost::unique_lock lock(m_mutex); - if (!m_tasks.empty()) { - BOOST_LOG_TRIVIAL(info) << "MediaPlayCtrl::onStateChanged: skip when task not finished"; - return; - } - } - if ((last_state == MEDIASTATE_IDLE || last_state == MEDIASTATE_IDLE) && state == wxMEDIASTATE_STOPPED) { return; } - if ((last_state == wxMEDIASTATE_PAUSED || last_state == wxMEDIASTATE_PLAYING) && state == wxMEDIASTATE_STOPPED) { - m_failed_code = m_media_ctrl->GetLastError(); - Stop(); - return; - } - if (last_state == MEDIASTATE_IDLE && (state == wxMEDIASTATE_STOPPED || state == wxMEDIASTATE_PAUSED)) { - wxSize size = m_media_ctrl->GetVideoSize(); - BOOST_LOG_TRIVIAL(info) << "MediaPlayCtrl::onStateChanged: size: " << size.x << "x" << size.y; - m_failed_code = m_media_ctrl->GetLastError(); - if (size.GetWidth() >= 320) { - m_last_state = state; - m_failed_code = 0; - SetStatus(_L("Playing..."), false); - m_print_idle = 0; - auto now = std::chrono::system_clock::now(); - m_load_duration = std::chrono::duration_cast(now - m_play_timer).count(); - m_play_timer = now + 1min; - - // track event - json j; - j["stage"] = std::to_string(m_last_state); - //j["dev_id"] = m_machine; - j["dev_id"] = ""; - j["dev_ip"] = ""; - j["result"] = "success"; - j["code"] = 0; - auto tunnel = into_u8(wxURI(m_url).GetPath()).substr(1); - if (auto n = tunnel.find_first_of("/_"); n != std::string::npos) - tunnel = tunnel.substr(0, n); - j["tunnel"] = tunnel; - if (tunnel == "tutk") { - if (m_url.size() > 38) - j["tutk_id"] = m_url.substr(18, 20).c_str(); - j["tutk_state"] = m_tutk_state; - } - NetworkAgent *agent = wxGetApp().getAgent(); - if (agent) - agent->track_event("start_liveview", j.dump()); - - m_failed_retry = 0; - m_disable_lan = false; - boost::unique_lock lock(m_mutex); - m_tasks.push_back(""); - m_cond.notify_all(); - } else if (event.GetId()) { - if (m_failed_code == 0) - m_failed_code = 2; - else if (m_failed_code == -2) - SetStatus(_L("DLL load error")); - Stop(); - } - } else { + auto state = m_media_ctrl->GetState(); + if(state != last_state && state == wxMEDIASTATE_PLAYING){ + SetStatus(_L("Playing..."), false); m_last_state = state; } + //y76 + // auto last_state = m_last_state; + // auto state = m_media_ctrl->GetState(); + // BOOST_LOG_TRIVIAL(info) << "MediaPlayCtrl::onStateChanged: " << state << ", last_state: " << last_state; + // if ((int) state < 0) return; + // { + // boost::unique_lock lock(m_mutex); + // if (!m_tasks.empty()) { + // BOOST_LOG_TRIVIAL(info) << "MediaPlayCtrl::onStateChanged: skip when task not finished"; + // return; + // } + // } + // if ((last_state == MEDIASTATE_IDLE || last_state == MEDIASTATE_INITIALIZING) && state == wxMEDIASTATE_STOPPED) { return; } + // if ((last_state == wxMEDIASTATE_PAUSED || last_state == wxMEDIASTATE_PLAYING) && state == wxMEDIASTATE_STOPPED) { + // m_failed_code = m_media_ctrl->GetLastError(); + // Stop(); + // return; + // } + // if (last_state == MEDIASTATE_IDLE && (state == wxMEDIASTATE_STOPPED || state == wxMEDIASTATE_PAUSED)) { + // wxSize size = m_media_ctrl->GetVideoSize(); + // BOOST_LOG_TRIVIAL(info) << "MediaPlayCtrl::onStateChanged: size: " << size.x << "x" << size.y; + // m_failed_code = m_media_ctrl->GetLastError(); + // if (size.GetWidth() >= 320) { + // m_last_state = state; + // m_failed_code = 0; + // SetStatus(_L("Playing..."), false); + // m_print_idle = 0; + // auto now = std::chrono::system_clock::now(); + // m_load_duration = std::chrono::duration_cast(now - m_play_timer).count(); + // m_play_timer = now + 1min; + + // // track event + // json j; + // j["stage"] = std::to_string(m_last_state); + // //j["dev_id"] = m_machine; + // j["dev_id"] = ""; + // j["dev_ip"] = ""; + // j["result"] = "success"; + // j["code"] = 0; + // auto tunnel = into_u8(wxURI(m_url).GetPath()).substr(1); + // if (auto n = tunnel.find_first_of("/_"); n != std::string::npos) + // tunnel = tunnel.substr(0, n); + // j["tunnel"] = tunnel; + // if (tunnel == "tutk") { + // if (m_url.size() > 38) + // j["tutk_id"] = m_url.substr(18, 20).c_str(); + // j["tutk_state"] = m_tutk_state; + // } + // NetworkAgent *agent = wxGetApp().getAgent(); + // if (agent) + // agent->track_event("start_liveview", j.dump()); + + // m_failed_retry = 0; + // m_disable_lan = false; + // boost::unique_lock lock(m_mutex); + // m_tasks.push_back(""); + // m_cond.notify_all(); + // } else if (event.GetId()) { + // if (m_failed_code == 0) + // m_failed_code = 2; + // else if (m_failed_code == -2) + // SetStatus(_L("DLL load error")); + // Stop(); + // } + // } else { + // m_last_state = state; + // } } void MediaPlayCtrl::SetStatus(wxString const &msg2, bool hyperlink) @@ -795,7 +827,7 @@ bool MediaPlayCtrl::IsStreaming() const { return m_streaming; } void MediaPlayCtrl::load() { - m_last_state = MEDIASTATE_IDLE; + m_last_state = MEDIASTATE_IDLE; //y76 SetStatus(_L("Loading...")); if (wxGetApp().app_config->get("internal_developer_mode") == "true") { std::string file_h264 = data_dir() + "/video.h264"; @@ -848,14 +880,15 @@ void MediaPlayCtrl::media_proc() else if (url == "") { break; } - else if (url == "") { - BOOST_LOG_TRIVIAL(info) << "MediaPlayCtrl: start play"; - m_media_ctrl->Play(); - BOOST_LOG_TRIVIAL(info) << "MediaPlayCtrl: end play"; - } + //y76 + // else if (url == "") { + // BOOST_LOG_TRIVIAL(info) << "MediaPlayCtrl: start play"; + // m_media_ctrl->Play(); + // BOOST_LOG_TRIVIAL(info) << "MediaPlayCtrl: end play"; + // } else { BOOST_LOG_TRIVIAL(info) << "MediaPlayCtrl: start load"; - m_media_ctrl->Load(wxURI(url)); + m_media_ctrl->Load(url.ToUTF8().data()); //y76 BOOST_LOG_TRIVIAL(info) << "MediaPlayCtrl: end load"; } lock.lock(); diff --git a/src/slic3r/GUI/MediaPlayCtrl.h b/src/slic3r/GUI/MediaPlayCtrl.h index 05a5395..3f3cab4 100644 --- a/src/slic3r/GUI/MediaPlayCtrl.h +++ b/src/slic3r/GUI/MediaPlayCtrl.h @@ -38,7 +38,8 @@ namespace GUI { class MediaPlayCtrl : public wxPanel { public: - MediaPlayCtrl(wxWindow *parent, wxMediaCtrl3 *media_ctrl, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize); +//y76 + MediaPlayCtrl(wxWindow *parent, VideoPanel *media_ctrl, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize); ~MediaPlayCtrl(); @@ -52,6 +53,10 @@ public: void jump_to_play(); + void setUrl(wxString url) { m_url = url; }; + //cj_1 + void stopMonitor(); + protected: void onStateChanged(wxMediaEvent & event); @@ -76,7 +81,7 @@ private: private: static constexpr wxMediaState MEDIASTATE_IDLE = (wxMediaState) 3; - //B + // B // static constexpr wxMediaState MEDIASTATE_INITIALIZING = (wxMediaState) 4; // static constexpr wxMediaState MEDIASTATE_LOADING = (wxMediaState) 5; // static constexpr wxMediaState MEDIASTATE_BUFFERING = (wxMediaState) 6; @@ -84,8 +89,10 @@ private: // token std::shared_ptr m_token = std::make_shared(0); - wxMediaCtrl3 * m_media_ctrl; - wxMediaState m_last_state = MEDIASTATE_IDLE; + //y76 + VideoPanel * m_media_ctrl; + wxMediaState m_last_state = wxMEDIASTATE_STOPPED; + std::string m_machine; int m_lan_proto = 0; std::string m_lan_ip; diff --git a/src/slic3r/GUI/Monitor.cpp b/src/slic3r/GUI/Monitor.cpp index 09dba85..339aeb9 100644 --- a/src/slic3r/GUI/Monitor.cpp +++ b/src/slic3r/GUI/Monitor.cpp @@ -307,7 +307,7 @@ void MonitorPanel::on_select_printer(wxCommandEvent& event) obj_->reset_pa_cali_history_result(); obj_->reset_pa_cali_result(); Sidebar &sidebar = GUI::wxGetApp().sidebar(); - sidebar.update_sync_status(obj_); + //sidebar.update_sync_status(obj_); sidebar.set_need_auto_sync_after_connect_printer(sidebar.need_auto_sync_extruder_list_after_connect_priner(obj_)); } diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 43f033d..0764eba 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -669,7 +669,8 @@ struct Sidebar::priv bool sync_extruder_list(bool &only_external_material); bool switch_diameter(bool single); - void update_sync_status(const MachineObject* obj); + //y76 + void update_sync_status(std::shared_ptr obj); void adjust_filament_title_layout(); #ifdef _WIN32 @@ -1492,6 +1493,9 @@ static bool is_skip_high_flow_printer(const std::string& printer) bool Sidebar::priv::sync_extruder_list(bool &only_external_material) { + //y76 +#if 0 + wxBusyCursor busy; MachineObject *obj = wxGetApp().getDeviceManager()->get_selected_machine(); auto printer_name = plater->get_selected_printer_name_in_combox(); BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << __LINE__ << " begin sync_extruder_list"; @@ -1514,23 +1518,23 @@ bool Sidebar::priv::sync_extruder_list(bool &only_external_material) std::string target_model_id = preset_bundle->printers.get_selected_preset().get_printer_type(preset_bundle); Preset* machine_preset = get_printer_preset(obj); if (!machine_preset) { - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << __LINE__ << "check error: machine_preset empty"; - return false; + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << __LINE__ << "check error: machine_preset empty"; + return false; } if (machine_print_name != target_model_id) { - MessageDialog dlg(this->plater, _L("The currently selected machine preset is inconsistent with the connected printer type.\n" - "Are you sure to continue syncing?"), _L("Sync printer information"), wxICON_WARNING | wxYES | wxNO); - if (dlg.ShowModal() == wxID_NO) { - return false; - } + MessageDialog dlg(this->plater, _L("The currently selected machine preset is inconsistent with the connected printer type.\n" + "Are you sure to continue syncing?"), _L("Sync printer information"), wxICON_WARNING | wxYES | wxNO); + if (dlg.ShowModal() == wxID_NO) { + return false; + } - if (!this->plater) - return false; + if (!this->plater) + return false; - this->plater->update_objects_position_when_select_preset([&obj, machine_preset]() { - Tab *printer_tab = GUI::wxGetApp().get_tab(Preset::Type::TYPE_PRINTER); - printer_tab->select_preset(machine_preset->name); - }); + this->plater->update_objects_position_when_select_preset([&obj, machine_preset]() { + Tab *printer_tab = GUI::wxGetApp().get_tab(Preset::Type::TYPE_PRINTER); + printer_tab->select_preset(machine_preset->name); + }); } BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << __LINE__ << " go on sync_extruder_list"; const Preset &cur_preset = preset_bundle->printers.get_selected_preset(); @@ -1540,8 +1544,8 @@ bool Sidebar::priv::sync_extruder_list(bool &only_external_material) const ConfigOptionInts *physical_extruder_map = cur_preset.config.option("physical_extruder_map"); auto printer_model = cur_preset.config.opt_string("printer_model"); if (physical_extruder_map != nullptr) { - assert(physical_extruder_map->values.size() == extruder_nums); - extruder_map = physical_extruder_map->values; + assert(physical_extruder_map->values.size() == extruder_nums); + extruder_map = physical_extruder_map->values; } assert(obj->GetExtderSystem()->GetTotalExtderCount() == extruder_nums); auto extruder_max_nozzle_count = cur_preset.config.option("extruder_max_nozzle_count")->values; @@ -1555,86 +1559,182 @@ bool Sidebar::priv::sync_extruder_list(bool &only_external_material) std::vectortarget_types(extruder_nums, NozzleVolumeType::nvtStandard); for (size_t index = 0; index < extruder_nums; ++index) { - int extruder_id = extruder_map[index]; //physical extruder id - nozzle_diameters[extruder_id] = nozzle_option ? atof(nozzle_option->diameter.c_str()) : obj->GetExtderSystem()->GetNozzleDiameter(index); - std::optional select_type; - NozzleVolumeType target_type = NozzleVolumeType::nvtStandard; - if (nozzle_option && nozzle_option->extruder_nozzle_stats.count(index)) { - if (nozzle_option->extruder_nozzle_stats[index].size() > 1) - select_type = NozzleVolumeType::nvtHybrid; - else - select_type = nozzle_option->extruder_nozzle_stats[index].begin()->first; - } - - if (obj->is_nozzle_flow_type_supported()) { - if (obj->GetExtderSystem()->GetNozzleFlowType(index) == NozzleFlowType::NONE_FLOWTYPE) { - MessageDialog dlg(this->plater, _L("There are unset nozzle types. Please set the nozzle types of all extruders before synchronizing."), - _L("Sync extruder infomation"), wxICON_WARNING | wxOK); - dlg.ShowModal(); - continue; - } - // hack code, only use standard flow for 0.2 - if (std::fabs(nozzle_diameters[extruder_id] - 0.2) > EPSILON && !is_skip_high_flow_printer(printer_model)) - target_type = NozzleVolumeType(obj->GetExtderSystem()->GetNozzleFlowType(extruder_id) - 1); - } - if (select_type) - target_type = *select_type; - - target_types[index] = target_type; + int extruder_id = extruder_map[index]; + nozzle_diameters[extruder_id] = obj->GetExtderSystem()->GetNozzleDiameter(index); + NozzleVolumeType target_type = NozzleVolumeType::nvtStandard; + auto printer_tab = dynamic_cast(wxGetApp().get_tab(Preset::TYPE_PRINTER)); + if (obj->is_nozzle_flow_type_supported()) { + if (obj->GetExtderSystem()->GetNozzleFlowType(index) == NozzleFlowType::NONE_FLOWTYPE) { + MessageDialog dlg(this->plater, _L("There are unset nozzle types. Please set the nozzle types of all extruders before synchronizing."), + _L("Sync extruder infomation"), wxICON_WARNING | wxOK); + dlg.ShowModal(); + continue; + } + hack code, only use standard flow for 0.2 + if (std::fabs(nozzle_diameters[extruder_id] - 0.2) > EPSILON && !is_skip_high_flow_printer(printer_model)) + target_type = NozzleVolumeType(obj->GetExtderSystem()->GetNozzleFlowType(extruder_id) - 1); + } + printer_tab->set_extruder_volume_type(index, target_type); } int deputy_4 = 0, main_4 = 0, deputy_1 = 0, main_1 = 0; for (auto ams : obj->GetFilaSystem()->GetAmsList()) { - // Main (first) extruder at right - if (ams.second->GetExtruderId() == 0) { - if (ams.second->GetAmsType() == DevAms::N3S) // N3S - ++main_1; - else - ++main_4; - } else if (ams.second->GetExtruderId() == 1) { - if (ams.second->GetAmsType() == DevAms::N3S) // N3S - ++deputy_1; - else - ++deputy_4; - } + Main (first) extruder at right + if (ams.second->GetExtruderId() == 0) { + if (ams.second->GetAmsType() == DevAms::N3S) // N3S + ++main_1; + else + ++main_4; + } else if (ams.second->GetExtruderId() == 1) { + if (ams.second->GetAmsType() == DevAms::N3S) // N3S + ++deputy_1; + else + ++deputy_4; + } } only_external_material = !obj->GetFilaSystem()->HasAms(); int main_index = obj->is_main_extruder_on_left() ? 0 : 1; int deputy_index = obj->is_main_extruder_on_left() ? 1 : 0; if (extruder_nums > 1) { - int left_index = left_extruder->combo_diameter->FindString(get_diameter_string(nozzle_diameters[0])); - int right_index = left_extruder->combo_diameter->FindString(get_diameter_string(nozzle_diameters[1])); - assert(left_index != -1 && right_index != -1); - left_extruder->combo_diameter->SetSelection(left_index); - right_extruder->combo_diameter->SetSelection(right_index); - is_switching_diameter = true; - switch_diameter(false); - is_switching_diameter = false; - AMSCountPopupWindow::SetAMSCount(deputy_index, deputy_4, deputy_1); - AMSCountPopupWindow::SetAMSCount(main_index, main_4, main_1); - AMSCountPopupWindow::UpdateAMSCount(0, left_extruder); - AMSCountPopupWindow::UpdateAMSCount(1, right_extruder); + int left_index = left_extruder->combo_diameter->FindString(get_diameter_string(nozzle_diameters[0])); + int right_index = left_extruder->combo_diameter->FindString(get_diameter_string(nozzle_diameters[1])); + assert(left_index != -1 && right_index != -1); + left_extruder->combo_diameter->SetSelection(left_index); + right_extruder->combo_diameter->SetSelection(right_index); + is_switching_diameter = true; + switch_diameter(false); + is_switching_diameter = false; + AMSCountPopupWindow::SetAMSCount(deputy_index, deputy_4, deputy_1); + AMSCountPopupWindow::SetAMSCount(main_index, main_4, main_1); + AMSCountPopupWindow::UpdateAMSCount(0, left_extruder); + AMSCountPopupWindow::UpdateAMSCount(1, right_extruder); } else { - int index = single_extruder->combo_diameter->FindString(get_diameter_string(nozzle_diameters[0])); - assert(index != -1); - single_extruder->combo_diameter->SetSelection(index); - is_switching_diameter = true; - switch_diameter(true); - is_switching_diameter = false; + int index = single_extruder->combo_diameter->FindString(get_diameter_string(nozzle_diameters[0])); + assert(index != -1); + single_extruder->combo_diameter->SetSelection(index); + is_switching_diameter = true; + switch_diameter(true); + is_switching_diameter = false; } +#endif - // set nozzle volume type after switching prset, so this value can override the old value stored in conf - auto printer_tab = dynamic_cast(wxGetApp().get_tab(Preset::TYPE_PRINTER)); - for (size_t idx = 0; idx < target_types.size(); ++idx) { - printer_tab->set_extruder_volume_type(idx, target_types[idx]); + wxBusyCursor busy; + auto obj = wxGetApp().qdsdevmanager->getSelectedDevice(); + auto printer_name = plater->get_selected_printer_name_in_combox(); + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << __LINE__ << " begin sync_extruder_list"; + if (obj == nullptr || !obj->is_online()) { + plater->pop_warning_and_go_to_device_page(printer_name, Plater::PrinterWarningType::NOT_CONNECTED, _L("Sync printer information")); + return false; } + //if (obj->get_extder_system()->extders.size() != 2) {//wxString(obj->get_preset_printer_model_name(machine_print_name)) + // plater->pop_warning_and_go_to_device_page(printer_name, Plater::PrinterWarningType::INCONSISTENT, _L("Sync printer information")); + // return false; + // } + std::string machine_print_name = obj->m_type; + PresetBundle *preset_bundle = wxGetApp().preset_bundle; + std::string target_model_id = preset_bundle->printers.get_selected_preset().get_printer_type(preset_bundle); + Preset* machine_preset = get_printer_preset(obj); + if (!machine_preset) { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << __LINE__ << "check error: machine_preset empty"; + return false; + } + if (machine_print_name != target_model_id) { + MessageDialog dlg(this->plater, _L("The currently selected machine preset is inconsistent with the connected printer type.\n" + "Are you sure to continue syncing?"), _L("Sync printer information"), wxICON_WARNING | wxYES | wxNO); + if (dlg.ShowModal() == wxID_NO) { + return false; + } + + if (!this->plater) + return false; + + this->plater->update_objects_position_when_select_preset([&obj, machine_preset]() { + Tab *printer_tab = GUI::wxGetApp().get_tab(Preset::Type::TYPE_PRINTER); + printer_tab->select_preset(machine_preset->name); + }); + } + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << __LINE__ << " go on sync_extruder_list"; + const Preset &cur_preset = preset_bundle->printers.get_selected_preset(); + int extruder_nums = preset_bundle->get_printer_extruder_count(); + std::vector extruder_map(extruder_nums); + std::iota(extruder_map.begin(), extruder_map.end(), 0); + const ConfigOptionInts *physical_extruder_map = cur_preset.config.option("physical_extruder_map"); + auto printer_model = cur_preset.config.opt_string("printer_model"); + if (physical_extruder_map != nullptr) { + assert(physical_extruder_map->values.size() == extruder_nums); + extruder_map = physical_extruder_map->values; + } + assert(obj->GetExtderSystem()->GetTotalExtderCount() == extruder_nums); + + //std::vector nozzle_diameters; + //nozzle_diameters.resize(extruder_nums); + //for (size_t index = 0; index < extruder_nums; ++index) { + // int extruder_id = extruder_map[index]; + // nozzle_diameters[extruder_id] = obj->GetExtderSystem()->GetNozzleDiameter(index); + // NozzleVolumeType target_type = NozzleVolumeType::nvtStandard; + // auto printer_tab = dynamic_cast(wxGetApp().get_tab(Preset::TYPE_PRINTER)); + // if (obj->is_nozzle_flow_type_supported()) { + // if (obj->GetExtderSystem()->GetNozzleFlowType(index) == NozzleFlowType::NONE_FLOWTYPE) { + // MessageDialog dlg(this->plater, _L("There are unset nozzle types. Please set the nozzle types of all extruders before synchronizing."), + // _L("Sync extruder infomation"), wxICON_WARNING | wxOK); + // dlg.ShowModal(); + // continue; + // } + // hack code, only use standard flow for 0.2 + // if (std::fabs(nozzle_diameters[extruder_id] - 0.2) > EPSILON && !is_skip_high_flow_printer(printer_model)) + // target_type = NozzleVolumeType(obj->GetExtderSystem()->GetNozzleFlowType(extruder_id) - 1); + // } + // printer_tab->set_extruder_volume_type(index, target_type); + //} + + //int deputy_4 = 0, main_4 = 0, deputy_1 = 0, main_1 = 0; + //for (auto ams : obj->GetFilaSystem()->GetAmsList()) { + // // Main (first) extruder at right + // if (ams.second->GetExtruderId() == 0) { + // if (ams.second->GetAmsType() == DevAms::N3S) // N3S + // ++main_1; + // else + // ++main_4; + // } else if (ams.second->GetExtruderId() == 1) { + // if (ams.second->GetAmsType() == DevAms::N3S) // N3S + // ++deputy_1; + // else + // ++deputy_4; + // } + //} + //only_external_material = !obj->GetFilaSystem()->HasAms(); + //int main_index = obj->is_main_extruder_on_left() ? 0 : 1; + //int deputy_index = obj->is_main_extruder_on_left() ? 1 : 0; + + //if (extruder_nums > 1) { + // int left_index = left_extruder->combo_diameter->FindString(get_diameter_string(nozzle_diameters[0])); + // int right_index = left_extruder->combo_diameter->FindString(get_diameter_string(nozzle_diameters[1])); + // assert(left_index != -1 && right_index != -1); + // left_extruder->combo_diameter->SetSelection(left_index); + // right_extruder->combo_diameter->SetSelection(right_index); + // is_switching_diameter = true; + // switch_diameter(false); + // is_switching_diameter = false; + // AMSCountPopupWindow::SetAMSCount(deputy_index, deputy_4, deputy_1); + // AMSCountPopupWindow::SetAMSCount(main_index, main_4, main_1); + // AMSCountPopupWindow::UpdateAMSCount(0, left_extruder); + // AMSCountPopupWindow::UpdateAMSCount(1, right_extruder); + //} else { + // int index = single_extruder->combo_diameter->FindString(get_diameter_string(nozzle_diameters[0])); + // assert(index != -1); + // single_extruder->combo_diameter->SetSelection(index); + // is_switching_diameter = true; + // switch_diameter(true); + // is_switching_diameter = false; + //} BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << __LINE__ << " finish sync_extruder_list"; return true; } -void Sidebar::priv::update_sync_status(const MachineObject *obj) +//y76 +void Sidebar::priv::update_sync_status(std::shared_ptr obj) { StateColor not_synced_colour(std::pair(wxColour("#4479FB"), StateColor::Normal)); auto clear_all_sync_status = [this, ¬_synced_colour]() { @@ -1650,11 +1750,11 @@ void Sidebar::priv::update_sync_status(const MachineObject *obj) btn_sync_printer->SetIcon("printer_sync"); }; - //y59 - //if (!obj || !obj->is_info_ready()) { - // clear_all_sync_status(); - // return; - //} + //y59 y76 + if (!obj) { + clear_all_sync_status(); + return; + } PresetBundle *preset_bundle = wxGetApp().preset_bundle; if (!preset_bundle) { @@ -1668,7 +1768,7 @@ void Sidebar::priv::update_sync_status(const MachineObject *obj) //const Preset &cur_preset = wxGetApp().preset_bundle->printers.get_edited_preset(); //if (preset_bundle && preset_bundle->printers.get_edited_preset().get_printer_type(preset_bundle) == obj->get_show_printer_type()) { std::string cur_preset_name = wxGetApp().get_tab(Preset::TYPE_PRINTER)->get_presets()->get_edited_preset().name; - if (preset_bundle && cur_preset_name == wxGetApp().plater()->sidebar().box_list_preset_name) { + if (preset_bundle && cur_preset_name.find(obj->m_type) != std::string::npos) { panel_printer_preset->ShowBadge(true); printer_synced = true; @@ -1698,6 +1798,13 @@ void Sidebar::priv::update_sync_status(const MachineObject *obj) } }; + // auto is_same_nozzle_info = [obj](const ExtruderInfo &left, const ExtruderInfo &right) { + // bool is_same_nozzle_type = true; + // if (obj->is_nozzle_flow_type_supported()) + // is_same_nozzle_type = left.nozzle_volue_type == right.nozzle_volue_type; + // return abs(left.diameter - right.diameter) < EPSILON && is_same_nozzle_type; + // }; + // 2. update extruder status int extruder_nums = preset_bundle->get_printer_extruder_count(); //if (extruder_nums != obj->GetExtderSystem()->GetTotalExtderCount()) @@ -1718,72 +1825,73 @@ void Sidebar::priv::update_sync_status(const MachineObject *obj) } //y59 - // std::vector machine_extruder_infos(obj->GetExtderSystem()->GetTotalExtderCount()); + // std::vector machine_extruder_infos(obj->GetExtderSystem()->GetTotalExtderCount()); - // const auto& extruders = obj->GetExtderSystem()->GetExtruders(); - // for (const DevExtder &extruder : extruders) { - // machine_extruder_infos[extruder.GetExtId()].nozzle_volue_type = int(extruder.GetNozzleFlowType()) - 1; - // machine_extruder_infos[extruder.GetExtId()].diameter = extruder.GetNozzleDiameter(); + // const auto& extruders = obj->GetExtderSystem()->GetExtruders(); + // for (const DevExtder &extruder : extruders) { + // machine_extruder_infos[extruder.GetExtId()].nozzle_volue_type = int(extruder.GetNozzleFlowType()) - 1; + // machine_extruder_infos[extruder.GetExtId()].diameter = extruder.GetNozzleDiameter(); + // } + // for (auto &item : obj->GetFilaSystem()->GetAmsList()) { + // if (item.second->GetExtruderId() >= machine_extruder_infos.size()) + // continue; + + // if (item.second->GetAmsType() == DevAms::N3S) + // { // N3S + // machine_extruder_infos[item.second->GetExtruderId()].ams_1++; + // machine_extruder_infos[item.second->GetExtruderId()].ams_v1.push_back(item.second); + // } else { + // machine_extruder_infos[item.second->GetExtruderId()].ams_4++; + // machine_extruder_infos[item.second->GetExtruderId()].ams_v4.push_back(item.second); + // } // } - // for (auto &item : obj->GetFilaSystem()->GetAmsList()) { - // if (item.second->GetExtruderId() >= machine_extruder_infos.size()) - // continue; - // if (item.second->GetAmsType() == DevAms::N3S) - // { // N3S - // machine_extruder_infos[item.second->GetExtruderId()].ams_1++; - // machine_extruder_infos[item.second->GetExtruderId()].ams_v1.push_back(item.second); - // } else { - // machine_extruder_infos[item.second->GetExtruderId()].ams_4++; - // machine_extruder_infos[item.second->GetExtruderId()].ams_v4.push_back(item.second); - // } - //} + // std::reverse(machine_extruder_infos.begin(), machine_extruder_infos.end()); - //std::reverse(machine_extruder_infos.begin(), machine_extruder_infos.end()); + std::vector extruder_synced(extruder_nums, false); + if (extruder_nums == 1) { + //if (is_same_nozzle_info(extruder_infos[0], machine_extruder_infos[0])) + { + single_extruder->ShowBadge(true); + //single_extruder->sync_ams(obj, machine_extruder_infos[0].ams_v4, machine_extruder_infos[0].ams_v1); + extruder_synced[0] = true; + } + //else { + // single_extruder->ShowBadge(false); + // //single_extruder->sync_ams(obj, {}, {}); + //} + } + // else if (extruder_nums == 2) { + // if (extruder_infos[0] == machine_extruder_infos[0]) { + // left_extruder->ShowBadge(true); + // left_extruder->sync_ams(obj, machine_extruder_infos[0].ams_v4, machine_extruder_infos[0].ams_v1); + // extruder_synced[0] = true; + // } + // else { + // left_extruder->ShowBadge(false); + // left_extruder->sync_ams(obj, {}, {}); + // } - //std::vector extruder_synced(extruder_nums, false); - //if (extruder_nums == 1) { - // if (this->plater->is_extruder_stat_synced()) { - // single_extruder->ShowBadge(true); - // single_extruder->sync_ams(obj, machine_extruder_infos[0].ams_v4, machine_extruder_infos[0].ams_v1); - // extruder_synced[0] = true; - // } - // else { - // single_extruder->ShowBadge(false); - // single_extruder->sync_ams(obj, {}, {}); - // } - //} - //else if (extruder_nums == 2) { - // if (this->plater->is_extruder_stat_synced(0)) { - // left_extruder->ShowBadge(true); - // left_extruder->sync_ams(obj, machine_extruder_infos[0].ams_v4, machine_extruder_infos[0].ams_v1); - // extruder_synced[0] = true; - // } - // else { - // left_extruder->ShowBadge(false); - // left_extruder->sync_ams(obj, {}, {}); - // } - - // if (this->plater->is_extruder_stat_synced(1)) { - // right_extruder->ShowBadge(true); - // right_extruder->sync_ams(obj, machine_extruder_infos[1].ams_v4, machine_extruder_infos[1].ams_v1); - // extruder_synced[1] = true; - // } - // else { - // right_extruder->ShowBadge(false); - // right_extruder->sync_ams(obj, {}, {}); - // } - //} + // if (extruder_infos[1] == machine_extruder_infos[1]) { + // right_extruder->ShowBadge(true); + // right_extruder->sync_ams(obj, machine_extruder_infos[1].ams_v4, machine_extruder_infos[1].ams_v1); + // extruder_synced[1] = true; + // } + // else { + // right_extruder->ShowBadge(false); + // right_extruder->sync_ams(obj, {}, {}); + // } + // } //StateColor synced_colour(std::pair(wxColour("#CECECE"), StateColor::Normal)); //bool all_extruder_synced = std::all_of(extruder_synced.begin(), extruder_synced.end(), [](bool value) { return value; }); //if (printer_synced && all_extruder_synced) { - // btn_sync_printer->SetBorderColor(synced_colour); - // btn_sync_printer->SetIcon("ams_nozzle_sync"); + // btn_sync_printer->SetBorderColor(synced_colour); + // btn_sync_printer->SetIcon("ams_nozzle_sync"); //} //else { - // btn_sync_printer->SetBorderColor(not_synced_colour); - // btn_sync_printer->SetIcon("printer_sync"); + // btn_sync_printer->SetBorderColor(not_synced_colour); + // btn_sync_printer->SetIcon("printer_sync"); //} } @@ -2909,8 +3017,6 @@ void Sidebar::update_presets(Preset::Type preset_type) BOOST_LOG_TRIVIAL(debug) << __FUNCTION__ << boost::format(": exit."); - //y61 - GUI::wxGetApp().sidebar().update_sync_status(nullptr); } //QDS @@ -3550,7 +3656,7 @@ bool Sidebar::need_auto_sync_extruder_list_after_connect_priner(const MachineObj return true; } -void Sidebar::update_sync_status(const MachineObject *obj) +void Sidebar::update_sync_status(std::shared_ptr obj) { p->update_sync_status(obj); } @@ -3917,192 +4023,204 @@ std::map Sidebar::build_filament_box_list(std::vectorShowModal() == wxID_OK){ - load_box_list(); - auto& list = wxGetApp().preset_bundle->filament_ams_list; - if (list.empty()) { - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "list.empty()" << list.empty(); - auto printer_name = p->plater->get_selected_printer_name_in_combox(); - p->plater->pop_warning_and_go_to_device_page(printer_name, Plater::PrinterWarningType::NOT_CONNECTED, _L("Sync printer information")); - return; - } - std::vector list2; - list2 = wxGetApp().plater()->box_msg.filament_id; - wxGetApp().plater()->update_all_plate_thumbnails(true); - SyncBoxInfoDialog::SyncInfo temp_info; - temp_info.use_dialog_pos = false; - temp_info.cancel_text_to_later = false; - if (m_sync_box_dlg == nullptr) { - m_sync_box_dlg = new SyncBoxInfoDialog(this, temp_info); + //y76 + auto qdsdev = wxGetApp().qdsdevmanager; + auto obj = qdsdev->getSelectedDevice(); + std::string cur_preset_name = wxGetApp().get_tab(Preset::TYPE_PRINTER)->get_presets()->get_edited_preset().name; + if(obj && qdsdev && cur_preset_name.find(obj->m_type) != std::string::npos) + qdsdev->upBoxInfoToBoxMsg(obj); + else { + GetBoxInfoDialog* m_get_box_dlg = new GetBoxInfoDialog(wxGetApp().plater()); + if(m_get_box_dlg->ShowModal() == wxID_OK){ + load_box_list(); } else { - m_sync_box_dlg->set_info(temp_info); - } - int dlg_res{ (int)wxID_CANCEL }; - if (m_sync_box_dlg->is_need_show()) { - m_sync_box_dlg->deal_only_exist_ext_spool(); - if (m_sync_box_dlg->is_dirty_filament()) { - wxGetApp().get_tab(Preset::TYPE_FILAMENT)->select_preset(wxGetApp().preset_bundle->filament_presets[0], false, "", false, true); - wxGetApp().preset_bundle->export_selections(*wxGetApp().app_config); - dynamic_filament_list.update(); - } - m_sync_box_dlg->set_check_dirty_fialment(false); - dlg_res = m_sync_box_dlg->ShowModal(); - } - else { - dlg_res = (int)wxID_YES; - } - if (dlg_res == wxID_CANCEL) - return; - auto sync_result = m_sync_box_dlg->get_result(); - if (!sync_result.is_same_printer) { - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "check error: sync_result.is_same_printer value is false"; return; } - list2.resize(list.size()); - auto iter = list.begin(); - for (int i = 0; i < list.size(); ++i, ++iter) { - auto & ams = iter->second; - auto filament_id = ams.opt_string("filament_id", 0u); - ams.set_key_value("filament_changed", new ConfigOptionBool{dlg_res == wxID_YES || list2[i] != filament_id}); - list2[i] = filament_id; - } - - // QDS:Record consumables information before synchronization - std::vector color_before_sync; - std::vector is_support_before; - DynamicPrintConfig& project_config = wxGetApp().preset_bundle->project_config; - ConfigOptionStrings* color_opt = project_config.option("filament_colour"); - for (int i = 0; i < p->combos_filament.size(); ++i) { - is_support_before.push_back(is_support_filament(i)); - color_before_sync.push_back(color_opt->values[i]); - } - MergeFilamentInfo merge_info; - std::vector> unknowns; - auto enable_append = wxGetApp().app_config->get_bool("enable_append_color_by_sync_ams"); - auto n = wxGetApp().preset_bundle->sync_ams_list(unknowns, !sync_result.direct_sync, sync_result.sync_maps, enable_append, merge_info); - wxString detail; - for (auto & uk : unknowns) { - auto tray_name = uk.first->opt_string("tray_name", 0u); - auto filament_type = uk.first->opt_string("filament_type", 0u); - detail += from_u8("\n- " + tray_name + "(" + filament_type + ") ") + _L(uk.second); - } - if (n == 0) { - MessageDialog dlg(this, - _L("There are no compatible filaments, and sync is not performed.") + detail, - _L("Sync filaments with BOX"), wxOK); - dlg.ShowModal(); - return; - } - std::string ams_filament_ids = boost::algorithm::join(list2, ","); - wxGetApp().app_config ->set("ams_filament_ids", box_list_preset_name, ams_filament_ids); - if (!unknowns.empty()) { - MessageDialog dlg(this, - _L("There are some unknown or uncompatible filaments mapped to generic preset.\nPlease update QIDI Studio or restart QIDI Studio to check if there is an update to system presets.") + detail, - _L("Sync filaments with BOX"), wxOK); - dlg.ShowModal(); - } - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "on_filament_count_change"; - wxGetApp().plater()->on_filament_count_change(n); - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "finish on_filament_count_change"; - for (auto& c : p->combos_filament) - c->update(); - // Expand filament list - p->m_panel_filament_content->SetMaxSize({-1, FromDIP(174)}); - auto min_size = p->m_panel_filament_content->GetSizer()->GetMinSize(); - if (min_size.y > p->m_panel_filament_content->GetMaxHeight()) - min_size.y = p->m_panel_filament_content->GetMaxHeight(); - p->m_panel_filament_content->SetMinSize({-1, min_size.y}); - // QDS:Synchronized consumables information - // auto calculation of flushing volumes - for (int i = 0; i < p->combos_filament.size(); ++i) { - if (i >= color_before_sync.size()) { - auto_calc_flushing_volumes(i); - } - else if(color_before_sync[i] != color_opt->values[i] && wxGetApp().app_config->get("auto_calculate_flush") != "disabled"){ - auto_calc_flushing_volumes(i); - } - else if(is_support_filament(i) !=is_support_before[i] && wxGetApp().app_config->get("auto_calculate_flush") == "all"){ - auto_calc_flushing_volumes(i); - } - } - auto badge_combox_filament = [](PlaterPresetComboBox *c) { - auto tip = _L("Filament type and color information have been synchronized, but slot information is not included."); - c->SetToolTip(tip); - c->ShowBadge(true); - }; - { // badge ams filament - clear_combos_filament_badge(); - if (sync_result.direct_sync) { - for (auto &c : p->combos_filament) { - badge_combox_filament(c); - } - } - } - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "prepare enable_merge_color_by_sync_ams"; - if (!merge_info.is_empty() && wxGetApp().app_config->get_bool("enable_merge_color_by_sync_ams")) { // merge same color and preset filament//use same ams - auto reduce_index = [](MergeFilamentInfo &merge_info,int value) { - for (size_t i = 0; i < merge_info.merges.size(); i++) { - auto &cur = merge_info.merges[i]; - for (size_t j = 0; j < cur.size(); j++) { - if (value < cur[j]) { - cur[j] = cur[j] - 1; - } - } - } - }; - std::vector sync_ams_badges; - for (auto iter : sync_result.sync_maps) { - sync_ams_badges.push_back(false); - if (iter.second.ams_id == "" || iter.second.slot_id == "") { - continue; - } - sync_ams_badges.back() = true; - } - - for (size_t i = 0; i < merge_info.merges.size(); i++) { - auto& cur = merge_info.merges[i]; - for (int j = cur.size() -1; j >= 1 ; j--) { - auto last_index = cur[j]; - change_filament(last_index, cur[0]); - cur.erase(cur.begin() + j); - sync_ams_badges.erase(sync_ams_badges.begin() + last_index); - reduce_index(merge_info, last_index); - } - } - for (size_t i = 0; i < sync_ams_badges.size(); i++) { - if (sync_ams_badges[i] == true) { - if (i < p->combos_filament.size()) { - auto &c = p->combos_filament[i]; - badge_combox_filament(c); - } else { - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << __LINE__ << "check error: p->combos_filament array out of bound"; - } - } - } - } else { - for (auto iter : sync_result.sync_maps) { - if (iter.second.ams_id == "" || iter.second.slot_id == "") { - continue; - } - auto temp_index = iter.first; - if (temp_index < p->combos_filament.size() && temp_index >= 0) { - auto &c = p->combos_filament[temp_index]; - badge_combox_filament(c); - } - } - } - Layout(); - - wxGetApp().get_tab(Preset::TYPE_FILAMENT)->select_preset(wxGetApp().preset_bundle->filament_presets[0]); - wxGetApp().preset_bundle->export_selections(*wxGetApp().app_config); - dynamic_filament_list.update(); - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "begin pop_finsish_sync_ams_dialog"; - pop_finsish_sync_ams_dialog(); - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "finish pop_finsish_sync_ams_dialog"; } + //y76 + + auto& list = wxGetApp().preset_bundle->filament_ams_list; + if (list.empty()) { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "list.empty()" << list.empty(); + auto printer_name = p->plater->get_selected_printer_name_in_combox(); + p->plater->pop_warning_and_go_to_device_page(printer_name, Plater::PrinterWarningType::NOT_CONNECTED, _L("Sync printer information")); + return; + } + std::vector list2; + list2 = wxGetApp().plater()->box_msg.filament_id; + wxGetApp().plater()->update_all_plate_thumbnails(true); + SyncBoxInfoDialog::SyncInfo temp_info; + temp_info.use_dialog_pos = false; + temp_info.cancel_text_to_later = false; + if (m_sync_box_dlg == nullptr) { + m_sync_box_dlg = new SyncBoxInfoDialog(this, temp_info); + } else { + m_sync_box_dlg->set_info(temp_info); + } + int dlg_res{ (int)wxID_CANCEL }; + if (m_sync_box_dlg->is_need_show()) { + m_sync_box_dlg->deal_only_exist_ext_spool(); + if (m_sync_box_dlg->is_dirty_filament()) { + wxGetApp().get_tab(Preset::TYPE_FILAMENT)->select_preset(wxGetApp().preset_bundle->filament_presets[0], false, "", false, true); + wxGetApp().preset_bundle->export_selections(*wxGetApp().app_config); + dynamic_filament_list.update(); + } + m_sync_box_dlg->set_check_dirty_fialment(false); + dlg_res = m_sync_box_dlg->ShowModal(); + } + else { + dlg_res = (int)wxID_YES; + } + if (dlg_res == wxID_CANCEL) + return; + auto sync_result = m_sync_box_dlg->get_result(); + if (!sync_result.is_same_printer) { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "check error: sync_result.is_same_printer value is false"; + return; + } + list2.resize(list.size()); + auto iter = list.begin(); + for (int i = 0; i < list.size(); ++i, ++iter) { + auto & ams = iter->second; + auto filament_id = ams.opt_string("filament_id", 0u); + ams.set_key_value("filament_changed", new ConfigOptionBool{dlg_res == wxID_YES || list2[i] != filament_id}); + list2[i] = filament_id; + } + + // QDS:Record consumables information before synchronization + std::vector color_before_sync; + std::vector is_support_before; + DynamicPrintConfig& project_config = wxGetApp().preset_bundle->project_config; + ConfigOptionStrings* color_opt = project_config.option("filament_colour"); + for (int i = 0; i < p->combos_filament.size(); ++i) { + is_support_before.push_back(is_support_filament(i)); + color_before_sync.push_back(color_opt->values[i]); + } + MergeFilamentInfo merge_info; + std::vector> unknowns; + auto enable_append = wxGetApp().app_config->get_bool("enable_append_color_by_sync_ams"); + auto n = wxGetApp().preset_bundle->sync_ams_list(unknowns, !sync_result.direct_sync, sync_result.sync_maps, enable_append, merge_info); + wxString detail; + for (auto & uk : unknowns) { + auto tray_name = uk.first->opt_string("tray_name", 0u); + auto filament_type = uk.first->opt_string("filament_type", 0u); + detail += from_u8("\n- " + tray_name + "(" + filament_type + ") ") + _L(uk.second); + } + if (n == 0) { + MessageDialog dlg(this, + _L("There are no compatible filaments, and sync is not performed.") + detail, + _L("Sync filaments with BOX"), wxOK); + dlg.ShowModal(); + return; + } + std::string ams_filament_ids = boost::algorithm::join(list2, ","); + wxGetApp().app_config ->set("ams_filament_ids", box_list_preset_name, ams_filament_ids); + if (!unknowns.empty()) { + MessageDialog dlg(this, + _L("There are some unknown or uncompatible filaments mapped to generic preset.\nPlease update QIDI Studio or restart QIDI Studio to check if there is an update to system presets.") + detail, + _L("Sync filaments with BOX"), wxOK); + dlg.ShowModal(); + } + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "on_filament_count_change"; + wxGetApp().plater()->on_filament_count_change(n); + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "finish on_filament_count_change"; + for (auto& c : p->combos_filament) + c->update(); + // Expand filament list + p->m_panel_filament_content->SetMaxSize({-1, FromDIP(174)}); + auto min_size = p->m_panel_filament_content->GetSizer()->GetMinSize(); + if (min_size.y > p->m_panel_filament_content->GetMaxHeight()) + min_size.y = p->m_panel_filament_content->GetMaxHeight(); + p->m_panel_filament_content->SetMinSize({-1, min_size.y}); + // QDS:Synchronized consumables information + // auto calculation of flushing volumes + for (int i = 0; i < p->combos_filament.size(); ++i) { + if (i >= color_before_sync.size()) { + auto_calc_flushing_volumes(i); + } + else if(color_before_sync[i] != color_opt->values[i] && wxGetApp().app_config->get("auto_calculate_flush") != "disabled"){ + auto_calc_flushing_volumes(i); + } + else if(is_support_filament(i) !=is_support_before[i] && wxGetApp().app_config->get("auto_calculate_flush") == "all"){ + auto_calc_flushing_volumes(i); + } + } + auto badge_combox_filament = [](PlaterPresetComboBox *c) { + auto tip = _L("Filament type and color information have been synchronized, but slot information is not included."); + c->SetToolTip(tip); + c->ShowBadge(true); + }; + { // badge ams filament + clear_combos_filament_badge(); + if (sync_result.direct_sync) { + for (auto &c : p->combos_filament) { + badge_combox_filament(c); + } + } + } + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "prepare enable_merge_color_by_sync_ams"; + if (!merge_info.is_empty() && wxGetApp().app_config->get_bool("enable_merge_color_by_sync_ams")) { // merge same color and preset filament//use same ams + auto reduce_index = [](MergeFilamentInfo &merge_info,int value) { + for (size_t i = 0; i < merge_info.merges.size(); i++) { + auto &cur = merge_info.merges[i]; + for (size_t j = 0; j < cur.size(); j++) { + if (value < cur[j]) { + cur[j] = cur[j] - 1; + } + } + } + }; + std::vector sync_ams_badges; + for (auto iter : sync_result.sync_maps) { + sync_ams_badges.push_back(false); + if (iter.second.ams_id == "" || iter.second.slot_id == "") { + continue; + } + sync_ams_badges.back() = true; + } + + for (size_t i = 0; i < merge_info.merges.size(); i++) { + auto& cur = merge_info.merges[i]; + for (int j = cur.size() -1; j >= 1 ; j--) { + auto last_index = cur[j]; + change_filament(last_index, cur[0]); + cur.erase(cur.begin() + j); + sync_ams_badges.erase(sync_ams_badges.begin() + last_index); + reduce_index(merge_info, last_index); + } + } + for (size_t i = 0; i < sync_ams_badges.size(); i++) { + if (sync_ams_badges[i] == true) { + if (i < p->combos_filament.size()) { + auto &c = p->combos_filament[i]; + badge_combox_filament(c); + } else { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << __LINE__ << "check error: p->combos_filament array out of bound"; + } + } + } + } else { + for (auto iter : sync_result.sync_maps) { + if (iter.second.ams_id == "" || iter.second.slot_id == "") { + continue; + } + auto temp_index = iter.first; + if (temp_index < p->combos_filament.size() && temp_index >= 0) { + auto &c = p->combos_filament[temp_index]; + badge_combox_filament(c); + } + } + } + Layout(); + + wxGetApp().get_tab(Preset::TYPE_FILAMENT)->select_preset(wxGetApp().preset_bundle->filament_presets[0]); + wxGetApp().preset_bundle->export_selections(*wxGetApp().app_config); + dynamic_filament_list.update(); + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "begin pop_finsish_sync_ams_dialog"; + pop_finsish_sync_ams_dialog(); + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "finish pop_finsish_sync_ams_dialog"; } void Sidebar::load_box_list() @@ -4124,7 +4242,11 @@ void Sidebar::load_box_list() return; wxGetApp().preset_bundle->filament_ams_list = filament_ams_list; - p->combo_printer->update(); + for (auto c : p->combos_filament) { + c->update(); + } + //y76 + //p->combo_printer->update(); } @@ -4220,7 +4342,6 @@ bool Sidebar::is_multifilament() } void Sidebar::deal_btn_sync() { -#if 0 m_begin_sync_printer_status = true; bool only_external_material; auto ok = p->sync_extruder_list(only_external_material); @@ -4231,16 +4352,12 @@ void Sidebar::deal_btn_sync() { } m_begin_sync_printer_status = false; wxGetApp().plater()->update_machine_sync_status(); -#endif - - //y65 - sync_box_list(); } void Sidebar::pop_sync_nozzle_and_ams_dialog() { BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " begin pop_sync_nozzle_and_ams_dialog"; wxTheApp->CallAfter([this]() { - SyncNozzleAndAmsDialog::InputInfo temp_na_info; + SyncNozzleAndBoxDialog::InputInfo temp_na_info; wxPoint big_btn_pt; wxSize big_btn_size; wxGetApp().plater()->sidebar().get_big_btn_sync_pos_size(big_btn_pt, big_btn_size); @@ -4259,7 +4376,7 @@ void Sidebar::pop_sync_nozzle_and_ams_dialog() { m_sna_dialog->Destroy(); m_sna_dialog = nullptr; } - m_sna_dialog = new SyncNozzleAndAmsDialog(temp_na_info); + m_sna_dialog = new SyncNozzleAndBoxDialog(temp_na_info); m_sna_dialog->on_show(); }); } @@ -6694,6 +6811,17 @@ std::vector Plater::priv::load_files(const std::vector& input_ Slic3r::unescape_strings_cstyle(qdt_diff_settings, qdt_different_keys); } + //y76 + const auto &full_config = wxGetApp().preset_bundle->full_config(); + for (size_t i = 0; i < qdt_different_keys.size();) { + if(!full_config.option(qdt_different_keys[i])){ + qdt_different_keys.erase(qdt_different_keys.begin() + i); + } + else { + ++i; + } + } + if (load_config) { if (!config.empty()) { Preset::normalize(config); @@ -7423,10 +7551,6 @@ std::vector Plater::priv::load_files(const std::vector& input_ //y75 if (_3mf_type != En3mfType::From_QDS) { - qdt_different_keys.erase( - std::remove(qdt_different_keys.begin(), qdt_different_keys.end(), ""), - qdt_different_keys.end() - ); if(has_different_settings_to_system) wxGetApp().get_tab(Preset::TYPE_PRINT)->cache_config_diff(qdt_different_keys); wxGetApp().get_tab(Preset::TYPE_PRINTER)->select_preset(old_preset_name); @@ -10621,27 +10745,6 @@ void Plater::priv::on_action_print_plate(SimpleEvent&) //QDS int extruders_size = wxGetApp().plater()->get_partplate_list().get_curr_plate()->get_used_filaments().size(); std::string box_ip = wxGetApp().plater()->sidebar().box_list_printer_ip; - -// //y61 -// bool has_diff = false; -// if (!box_ip.empty()) { -// #if QDT_RELEASE_TO_PUBLIC -// QIDINetwork qidi; -// wxString msg = ""; -// GUI::Box_info filament_info; -// filament_info = qidi.get_box_info(msg, box_ip); -// GUI::Box_info cur_box_info; -// cur_box_info = q->get_cur_box_info(); - -// if (filament_info.filament_index != cur_box_info.filament_index -// || filament_info.filament_vendor != cur_box_info.filament_vendor -// || filament_info.filament_color_index != cur_box_info.filament_color_index -// || filament_info.box_count != cur_box_info.box_count -// || filament_info.auto_reload_detect != cur_box_info.auto_reload_detect) { -// has_diff = true; -// } -// #endif -// } //y65 y68 bool is_can_change_color = preview->get_canvas3d()->get_gcode_viewer().get_layers_slider()->get_is_can_change_color(); @@ -10649,25 +10752,12 @@ void Plater::priv::on_action_print_plate(SimpleEvent&) if(extruders_size > 1 && box_ip.empty() && !is_can_change_color){ wxGetApp().plater()->sidebar().sync_box_list(); } - // //y61 - // else if(has_diff){ - // MessageDialog dlg(nullptr, _L("The filament information in the BOX has changed. Please resynchronize it."), _L("BOX message has change"), wxYES); - // if (dlg.ShowModal() == wxID_YES) { - // wxGetApp().plater()->sidebar().sync_box_list(); - // } - // } //y40 SelectMachineDialog* dlg = new SelectMachineDialog(q); //y52 dlg->prepare(partplate_list.get_curr_plate_index()); dlg->ShowModal(); - - //if (!m_select_machine_dlg) m_select_machine_dlg = new SelectMachineDialog(q); - //m_select_machine_dlg->set_print_type(PrintFromType::FROM_NORMAL); - //m_select_machine_dlg->prepare(partplate_list.get_curr_plate_index()); - //m_select_machine_dlg->ShowModal(); - //record_start_print_preset("print_plate"); } //y @@ -16735,48 +16825,76 @@ Preset *get_printer_preset(const MachineObject *obj) return printer_preset; } -bool Plater::check_printer_initialized(MachineObject *obj, bool only_warning, bool popup_warning) +Preset *get_printer_preset(std::shared_ptr obj){ + if (!obj) + return nullptr; + + Preset *printer_preset = nullptr; + //获取喷嘴尺寸 目前默认为0.4 + //float machine_nozzle_diameter = obj->GetExtderSystem()->GetNozzleDiameter(0); + float machine_nozzle_diameter = 0.4; + PresetBundle *preset_bundle = wxGetApp().preset_bundle; + for (auto printer_it = preset_bundle->printers.begin(); printer_it != preset_bundle->printers.end(); printer_it++) { + // only use system printer preset + if (!printer_it->is_system) + continue; + + ConfigOption *printer_nozzle_opt = printer_it->config.option("nozzle_diameter"); + ConfigOptionFloatsNullable *printer_nozzle_vals = nullptr; + if (printer_nozzle_opt) printer_nozzle_vals = dynamic_cast(printer_nozzle_opt); + std::string model_id = printer_it->get_current_printer_type(preset_bundle); + + std::string printer_type = obj->m_type; + if (model_id.compare(printer_type) == 0 && printer_nozzle_vals && abs(printer_nozzle_vals->get_at(0) - machine_nozzle_diameter) < 1e-3) { + printer_preset = &(*printer_it); + } + } + return printer_preset; +} + +bool Plater::check_printer_initialized(std::shared_ptr obj, bool only_warning, bool popup_warning) { if (!obj) return false; bool has_been_initialized = true; - const auto& extruders = obj->GetExtderSystem()->GetExtruders(); - for (const DevExtder& extruder : extruders) { - if (obj->is_multi_extruders()) { - if (extruder.GetNozzleFlowType() == NozzleFlowType::NONE_FLOWTYPE) { - has_been_initialized = false; - break; - } - } - if (extruder.GetNozzleFlowType() == NozzleType::ntUndefine) { - has_been_initialized = false; - break; - } - } + // 判断是否多头 喷头信息是否未知 + // const auto& extruders = obj->GetExtderSystem()->GetExtruders(); + // for (const DevExtder& extruder : extruders) { + // if (obj->is_multi_extruders()) { + // if (extruder.GetNozzleFlowType() == NozzleFlowType::NONE_FLOWTYPE) { + // has_been_initialized = false; + // break; + // } + // } + // if (extruder.GetNozzleFlowType() == NozzleType::ntUndefine) { + // has_been_initialized = false; + // break; + // } + // } - if (!has_been_initialized) { - if (popup_warning) { - if (!only_warning) { - if (DevPrinterConfigUtil::get_printer_can_set_nozzle(obj->get_show_printer_type())) { - MessageDialog dlg(wxGetApp().plater(), _L("The nozzle type is not set. Please set the nozzle and try again."), _L("Warning"), wxOK | wxICON_WARNING); - dlg.ShowModal(); - } else { - MessageDialog dlg(wxGetApp().plater(), _L("The nozzle type is not set. Please check."), _L("Warning"), wxOK | wxICON_WARNING); - dlg.ShowModal(); - } + //if (!has_been_initialized) { + // if (popup_warning) { + // if (!only_warning) { + // if (DevPrinterConfigUtil::get_printer_can_set_nozzle(obj->get_show_printer_type())) { + // MessageDialog dlg(wxGetApp().plater(), _L("The nozzle type is not set. Please set the nozzle and try again."), _L("Warning"), wxOK | wxICON_WARNING); + // dlg.ShowModal(); + // } else { + // MessageDialog dlg(wxGetApp().plater(), _L("The nozzle type is not set. Please check."), _L("Warning"), wxOK | wxICON_WARNING); + // dlg.ShowModal(); + // } - PrinterPartsDialog *print_parts_dlg = new PrinterPartsDialog(nullptr); - print_parts_dlg->update_machine_obj(obj); - print_parts_dlg->ShowModal(); - } else { - auto printer_name = get_selected_printer_name_in_combox(); // wxString(obj->get_preset_printer_model_name(machine_print_name)) - pop_warning_and_go_to_device_page(printer_name, Plater::PrinterWarningType::NOT_CONNECTED, _L("Sync printer information")); - } - } - return false; - } + // PrinterPartsDialog *print_parts_dlg = new PrinterPartsDialog(nullptr); + // print_parts_dlg->update_machine_obj(obj); + // print_parts_dlg->ShowModal(); + // } else { + // auto printer_name = get_selected_printer_name_in_combox(); // wxString(obj->get_preset_printer_model_name(machine_print_name)) + // pop_warning_and_go_to_device_page(printer_name, Plater::PrinterWarningType::NOT_CONNECTED, _L("Sync printer information")); + // } + // } + // return false; + //} return true; } @@ -18928,7 +19046,7 @@ void Plater::pop_warning_and_go_to_device_page(wxString printer_name, PrinterWar printer_name.Replace("QIDI Tech", "", false); wxString content; if (type == PrinterWarningType::NOT_CONNECTED) { - content = wxString::Format(_L("Printer not connected. Please go to the device page to connect %s before syncing."), printer_name); + content = wxString::Format(_L("Printer not connected or the connected machines do not support synchronous operations. Please go to the device page to connect %s before syncing."), printer_name); } else if (type == PrinterWarningType::INCONSISTENT) { content = wxString::Format(_L("The currently connected printer on the device page is not %s. Please switch to %s before syncing."), printer_name, printer_name); } else if (type == PrinterWarningType::UNINSTALL_FILAMENT) { @@ -18945,18 +19063,15 @@ void Plater::pop_warning_and_go_to_device_page(wxString printer_name, PrinterWar bool Plater::is_same_printer_for_connected_and_selected(bool popup_warning) { - if (!wxGetApp().getDeviceManager()) { - return false; - } - MachineObject *obj = wxGetApp().getDeviceManager()->get_selected_machine(); + auto obj = wxGetApp().qdsdevmanager->getSelectedDevice(); if (obj == nullptr) { return false; } if (!check_printer_initialized(obj, true, popup_warning)) return false; - Preset * machine_preset = get_printer_preset(obj); - if (!machine_preset) - return false; + //Preset * machine_preset = get_printer_preset(obj); + //if (!machine_preset) + // return false; if (wxGetApp().is_blocking_printing()) { if (popup_warning) { @@ -20203,13 +20318,15 @@ bool Plater::check_ams_status(bool is_slice_all) void Plater::update_machine_sync_status() { - DeviceManager *dev_maneger = wxGetApp().getDeviceManager(); - if (!dev_maneger) { - GUI::wxGetApp().sidebar().update_sync_status(nullptr); - return; + //y76 + auto qdsdev = wxGetApp().qdsdevmanager; + auto obj = qdsdev->getSelectedDevice(); + std::string cur_preset_name = wxGetApp().get_tab(Preset::TYPE_PRINTER)->get_presets()->get_edited_preset().name; + if(obj && qdsdev && cur_preset_name.find(obj->m_type) != std::string::npos){ + GUI::wxGetApp().sidebar().update_sync_status(obj); + return; } - MachineObject *obj = wxGetApp().getDeviceManager()->get_selected_machine(); - GUI::wxGetApp().sidebar().update_sync_status(obj); + GUI::wxGetApp().sidebar().update_sync_status(nullptr); } void Plater::update_filament_volume_map(int extruder_id, int volume_type) diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 45fd59a..b05bf19 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -36,6 +36,8 @@ #include "../QIDI/QIDINetwork.hpp" #endif +#include "QDSDeviceManager.hpp" + #define FILAMENT_SYSTEM_COLORS_NUM 16 class wxButton; @@ -91,7 +93,7 @@ struct Camera; class GLToolbar; class PlaterPresetComboBox; class PartPlateList; -class SyncNozzleAndAmsDialog; +class SyncNozzleAndBoxDialog; class FinishSyncAmsDialog; class Bed3D; class FinishSyncBoxDialog; @@ -158,7 +160,7 @@ class Sidebar : public wxPanel Button * btn_sync{nullptr}; ScalableButton * ams_btn{nullptr}; bool m_last_slice_state = false; - SyncNozzleAndAmsDialog* m_sna_dialog{nullptr}; + SyncNozzleAndBoxDialog* m_sna_dialog{nullptr}; //y76 FinishSyncAmsDialog* m_fna_dialog{nullptr}; std::vector m_cur_combox_bed_types; std::string m_cur_image_bed_type; @@ -222,7 +224,7 @@ public: void sync_ams_list(bool is_from_big_sync_btn = false); bool sync_extruder_list(); bool need_auto_sync_extruder_list_after_connect_priner(const MachineObject* obj); - void update_sync_status(const MachineObject* obj); + void update_sync_status(std::shared_ptr obj); //y76 int get_sidebar_pos_right_x(); void on_size(SimpleEvent &e); void on_full_screen(IntEvent &); @@ -241,7 +243,7 @@ public: std::vector box_slot_id; std::string box_list_preset_name; std::string box_list_printer_ip; - void sync_box_list(); + void sync_box_list(bool is_from_big_sync_btn = false); //y76 void load_box_list(); std::map build_filament_box_list(std::vector id, std::vector color, std::vector slot_state, std::vector slot_id, std::vector type); @@ -648,7 +650,7 @@ public: EMPTY_FILAMENT }; void pop_warning_and_go_to_device_page(wxString printer_name, PrinterWarningType type, const wxString &title); - bool check_printer_initialized(MachineObject *obj, bool only_warning = false,bool popup_warning = true); + bool check_printer_initialized(std::shared_ptr obj, bool only_warning = false,bool popup_warning = true); //y76 bool is_same_printer_for_connected_and_selected(bool popup_warning = true); bool is_printer_configed_by_QDT(); // QDS @@ -1093,6 +1095,9 @@ std::vector get_min_flush_volumes(const DynamicPrintConfig &full_config, si std::string check_boolean_possible(const std::vector &volumes, csg::BooleanFailReason& fail_reason); Preset *get_printer_preset(const MachineObject *obj); +//y76 +Preset *get_printer_preset(std::shared_ptr obj); + wxArrayString get_all_camera_view_type(); diff --git a/src/slic3r/GUI/PrePrintChecker.hpp b/src/slic3r/GUI/PrePrintChecker.hpp index ee0f402..bf4a7f8 100644 --- a/src/slic3r/GUI/PrePrintChecker.hpp +++ b/src/slic3r/GUI/PrePrintChecker.hpp @@ -181,6 +181,7 @@ enum PrintDialogStatus : unsigned int { //y68 QDTBoxErrorBegin, BoxhasSomeProblem, + AirConditionSettingFailed, PrintStatusNeedUpgradingBox, PrinterNotConnectBox, QDTBoxErrorEnd, diff --git a/src/slic3r/GUI/PrinterWebView.cpp b/src/slic3r/GUI/PrinterWebView.cpp index 7032016..9d9ca72 100644 --- a/src/slic3r/GUI/PrinterWebView.cpp +++ b/src/slic3r/GUI/PrinterWebView.cpp @@ -6,9 +6,13 @@ #include "slic3r/GUI/MainFrame.hpp" #include "libslic3r_version.h" +// cj_1 +#include +#include #include #include #include +#include #include @@ -20,405 +24,320 @@ //B55 #include "../Utils/PrintHost.hpp" +#include +#include +#include +#include + +#include +#include + +#include "nlohmann/json.hpp" +#include + +#include "Tab.hpp" + namespace pt = boost::property_tree; + namespace Slic3r { namespace GUI { + // //B45 -PrinterWebView::PrinterWebView(wxWindow *parent) : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize) +PrinterWebView::PrinterWebView(wxWindow* parent) : + wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize) { - m_isSimpleMode = wxGetApp().app_config->get("machine_list_minification") == "1"; - m_isNetMode = wxGetApp().app_config->get("machine_list_net") == "1"; - // y21 - wxGetApp().get_login_info(); - m_isloginin = wxGetApp().is_QIDILogin(); - //y33 - if (m_isloginin) - m_user_head_name = wxGetApp().app_config->get("user_head_name"); - - m_select_type = "null"; - + wxPanel* line_area; + wxBoxSizer* buttonSizer; + wxBoxSizer* menuPanelSizer; + wxPanel* titlePanel; + wxPanel* menuPanel; + wxBoxSizer* menu_bar_sizer; + wxPanel* t_browser_panel; + wxPanel* t_status_panel; + wxBoxSizer* t_browser_sizer; + wxBoxSizer* t_status_sizer; + // cj_1 ui allsizer = new wxBoxSizer(wxHORIZONTAL); - devicesizer = new wxBoxSizer(wxVERTICAL); - wxBoxSizer *buttonSizer = new wxBoxSizer(wxVERTICAL); - wxBoxSizer *menuPanelSizer = new wxBoxSizer(wxVERTICAL); - leftallsizer = new wxBoxSizer(wxVERTICAL); + SetSizer(allsizer); { + leftallsizer = new wxBoxSizer(wxVERTICAL); { + titlePanel = new wxPanel(this, wxID_ANY); + titlePanel->SetBackgroundColour(wxColour(255, 255, 255)); + buttonSizer = new wxBoxSizer(wxVERTICAL); + titlePanel->SetSizer(buttonSizer); { - devicesizer->SetMinSize(wxSize(300, -1)); - devicesizer->Layout(); + wxStaticBitmap* staticBitmap = new wxStaticBitmap(titlePanel, wxID_ANY, create_scaled_bitmap("QIDIStudio_p", this, 26)); + buttonSizer->Add(staticBitmap, wxSizerFlags(0).Expand().Border(wxTOP, 10)); - devicesizer->Add(0, 3); + buttonSizer->AddSpacer(10); + line_area = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(-1, 1)); + line_area->SetBackgroundColour(wxColor(214, 214, 214)); + buttonSizer->Add(line_area, 0, wxEXPAND | wxLEFT | wxRIGHT, 5); + buttonSizer->AddSpacer(5); - init_scroll_window(this); - - wxPanel *titlePanel = new wxPanel(this, wxID_ANY); - titlePanel->SetBackgroundColour(wxColour(38, 38, 41)); - // y13 - wxPanel *menuPanel = new wxPanel(titlePanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBU_LEFT | wxTAB_TRAVERSAL | wxBU_RIGHT); - menuPanel->SetSizer(menuPanelSizer); - menuPanel->SetBackgroundColour(wxColour(51, 51, 56)); - - wxBoxSizer *loginsizer = init_login_bar(titlePanel); - - buttonSizer->Add(0, 10); - buttonSizer->Add(loginsizer, wxSizerFlags().Border(wxALL, 1).Expand()); - buttonSizer->Add(0, 10); - - wxBoxSizer *menu_bar_sizer = new wxBoxSizer(wxHORIZONTAL); - - menu_bar_sizer = init_menu_bar(menuPanel); - - titlePanel->SetSizer(buttonSizer); - - toggleBar = new DeviceSwitchButton(menuPanel); - toggleBar->SetSize(327); - toggleBar->SetMaxSize({em_unit(this) * 40, -1}); - toggleBar->SetLabels(_L("Local"), _L("Link")); - toggleBar->SetValue(m_isNetMode); - toggleBar->Bind(wxEVT_TOGGLEBUTTON, [this](wxCommandEvent &evt) { - bool is_checked = evt.GetInt(); - toggleBar->SetValue(is_checked); - - m_isNetMode = is_checked; - if (!m_isNetMode) { - wxGetApp().app_config->set("machine_list_net", "0"); - ShowLocalPrinterButton(); - //y23 //y24 - if (into_u8(m_web).find("missing_connection") != std::string::npos) - { - //y30 - wxString url = wxString::Format("file://%s/web/qidi/missing_connection.html", from_u8(resources_dir())); - wxString strlang = wxGetApp().current_language_code_safe(); - if (strlang != "") - url = wxString::Format("file://%s/web/qidi/missing_connection.html?lang=%s", from_u8(resources_dir()), strlang); - load_disconnect_url(url); - } - } else { - wxGetApp().app_config->set("machine_list_net", "1"); - ShowNetPrinterButton(); - //y23 //y24 - if (into_u8(m_web).find("missing_connection") != std::string::npos) - { - //y30 - wxString url = wxString::Format("file://%s/web/qidi/link_missing_connection.html", from_u8(resources_dir())); - wxString strlang = wxGetApp().current_language_code_safe(); - if (strlang != "") - url = wxString::Format("file://%s/web/qidi/link_missing_connection.html?lang=%s", from_u8(resources_dir()), strlang); - load_disconnect_url(url); + menuPanelSizer = new wxBoxSizer(wxVERTICAL); + menuPanel = new wxPanel(titlePanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBU_LEFT | wxTAB_TRAVERSAL | wxBU_RIGHT); + menuPanel->SetBackgroundColour(wxColour(255, 255, 255)); + menuPanel->SetSizer(menuPanelSizer); { + menu_bar_sizer = new wxBoxSizer(wxHORIZONTAL); + menu_bar_sizer = init_menu_bar(menuPanel); + menuPanelSizer->Add(menu_bar_sizer, wxSizerFlags(0).Expand().Align(wxALIGN_TOP).Border(wxALL, 0)); + menuPanelSizer->Add(0, 5); + } } + buttonSizer->Add(0, 10); + buttonSizer->Add(menuPanel, wxSizerFlags(1).Expand()); + + devicesizer = new wxBoxSizer(wxVERTICAL); + devicesizer->SetMinSize(wxSize(220, -1)); + devicesizer->Layout(); + devicesizer->Add(0, 3); + init_scroll_window(this); } - leftScrolledWindow->Scroll(0, 0); - UpdateLayout(); - UpdateState(); - }); + leftallsizer->Add(titlePanel, wxSizerFlags(0).Expand()); + leftallsizer->AddSpacer(8); + leftallsizer->Add(leftScrolledWindow, wxSizerFlags(1).Expand()); - menuPanelSizer->Add(toggleBar); + //y74 + m_status_book = new wxSimplebook(this, wxID_ANY); { + t_browser_panel = new wxPanel(m_status_book); + t_browser_sizer = new wxBoxSizer(wxHORIZONTAL); + t_browser_panel->SetSizer(t_browser_sizer); { + m_browser = WebView::CreateWebView(t_browser_panel, ""); + if (m_browser == nullptr) { + wxLogError("Could not init m_browser"); + return; + } + } + t_browser_sizer->Add(m_browser, wxSizerFlags(1).Expand()); - menuPanelSizer->Add(menu_bar_sizer, wxSizerFlags(0).Expand().Align(wxALIGN_TOP).Border(wxALL, 0)); - menuPanelSizer->Add(0, 5); + t_status_panel = new wxPanel(m_status_book); + t_status_sizer = new wxBoxSizer(wxHORIZONTAL); + t_status_panel->SetSizer(t_status_sizer); { + t_status_page = new StatusPanel(t_status_panel); + } + t_status_sizer->Add(t_status_page, wxSizerFlags(1).Expand()); - buttonSizer->Add(menuPanel, wxSizerFlags(1).Expand()); - - titlePanel->Layout(); - - - m_browser = WebView::CreateWebView(this, ""); - if (m_browser == nullptr) { - wxLogError("Could not init m_browser"); - return; + } + m_status_book->AddPage(t_browser_panel, "", false); + m_status_book->AddPage(t_status_panel, "", false); } - - SetSizer(allsizer); - - leftallsizer->Add(titlePanel, wxSizerFlags(0).Expand()); - leftallsizer->Add(leftScrolledWindow, wxSizerFlags(1).Expand()); - - // y13 - wxPanel* line_area = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(1,10)); - line_area->SetBackgroundColour(wxColor(66, 66, 69)); - + //y74 allsizer->Add(leftallsizer, wxSizerFlags(0).Expand()); - allsizer->Add(line_area, 0, wxEXPAND); - allsizer->Add(m_browser, wxSizerFlags(1).Expand().Border(wxALL, 0)); + allsizer->Add(m_status_book, wxSizerFlags(1).Expand().Border(wxALL, 0)); - // Zoom - m_zoomFactor = 100; + devicesizer->SetMinSize(wxSize(220, -1)); + devicesizer->Layout(); + leftScrolledWindow->Layout(); + buttonSizer->Layout(); + allsizer->Layout(); + + + m_status_book->ChangeSelection(0); + + //y74 + InitDeviceManager(); + initEventToTaskPath(); // B45 Bind(wxEVT_WEBVIEW_SCRIPT_MESSAGE_RECEIVED, &PrinterWebView::OnScriptMessage, this); Bind(wxEVT_CLOSE_WINDOW, &PrinterWebView::OnClose, this); - // B64 - if (m_isSimpleMode) { - arrow_button->SetBitmap(create_scaled_bitmap("arrow-right-s-line", nullptr, 25)); - devicesizer->SetMinSize(wxSize(190, -1)); - toggleBar->SetSize(237); - leftScrolledWindow->SetMinSize(wxSize(190, -1)); - devicesizer->Layout(); - leftScrolledWindow->Layout(); - buttonSizer->Layout(); - allsizer->Layout(); - } - // B64 - // SetPresetChanged(true); + bool m_isloginin = (wxGetApp().app_config->get("user_token") != ""); SetLoginStatus(m_isloginin); - // CreatThread(); + + // cj_1 + t_status_panel->Bind(EVT_SET_COLOR, &PrinterWebView::onSetBoxTask, this); + t_status_panel->Bind(EVTSET_FILAMENT_TYPE, &PrinterWebView::onSetBoxTask, this); + t_status_panel->Bind(EVTSET_FILAMENT_VENDOR, &PrinterWebView::onSetBoxTask, this); + t_status_panel->Bind(EVTSET_FILAMENT_LOAD, &PrinterWebView::onSetBoxTask, this); + t_status_panel->Bind(EVTSET_FILAMENT_UNLOAD, &PrinterWebView::onSetBoxTask, this); + t_status_panel->Bind(EVT_AMS_REFRESH_RFID, &PrinterWebView::onRefreshRfid, this); + bindTaskHandle(); + + QDSFilamentConfig::getInstance(); + + init_select_machine(); } -wxBoxSizer *PrinterWebView::init_login_bar(wxPanel *Panel) + +wxBoxSizer* PrinterWebView::init_menu_bar(wxPanel* Panel) { - wxBoxSizer *buttonsizer = new wxBoxSizer(wxHORIZONTAL); - //y33 - if (m_isSimpleMode) - staticBitmap = new wxStaticBitmap(Panel, wxID_ANY, create_scaled_bitmap_of_login(m_user_head_name, this, 40)); - else - staticBitmap = new wxStaticBitmap(Panel, wxID_ANY, create_scaled_bitmap_of_login(m_user_head_name, this, 60)); + wxBoxSizer* buttonsizer = new wxBoxSizer(wxHORIZONTAL); + StateColor add_btn_bg(std::pair(wxColour(153, 153, 153), StateColor::Disabled), + std::pair(wxColour(0, 66, 255), StateColor::Pressed), + std::pair(wxColour(116, 168, 255), StateColor::Hovered), + std::pair(wxColour(68, 121, 251), StateColor::Normal)); - StateColor text_color(std::pair(wxColour(57, 57, 61), StateColor::Disabled), - std::pair(wxColour(68, 121, 251), StateColor::Pressed), - std::pair(wxColour(68, 121, 251), StateColor::Hovered), - std::pair(wxColour(198, 198, 200), StateColor::Normal)); - - StateColor btn_bg(std::pair(wxColour(38, 38, 41), StateColor::Disabled), - std::pair(wxColour(38, 38, 41), StateColor::Pressed), - std::pair(wxColour(38, 38, 41), StateColor::Hovered), - std::pair(wxColour(38, 38, 41), StateColor::Normal)); - - login_button = new DeviceButton(Panel, _L("Login/Register"), "", wxBU_LEFT); - login_button->SetTextColor(text_color); - login_button->SetBackgroundColor(btn_bg); - login_button->SetBorderColor(btn_bg); - login_button->SetCanFocus(false); - login_button->SetIsSimpleMode(m_isSimpleMode); - login_button->Bind(wxEVT_BUTTON, &PrinterWebView::OnLoginButtonClick, this); - buttonsizer->AddSpacer(5); - buttonsizer->Add(staticBitmap); - buttonsizer->Add(login_button, wxSizerFlags().Border(wxALL, 1).Expand()); - - return buttonsizer; -} -wxBoxSizer *PrinterWebView::init_menu_bar(wxPanel *Panel) -{ - wxBoxSizer *buttonsizer = new wxBoxSizer(wxHORIZONTAL); - - StateColor add_btn_bg(std::pair(wxColour(57, 57, 61), StateColor::Disabled), - std::pair(wxColour(138, 138, 141), StateColor::Pressed), - std::pair(wxColour(85, 85, 90), StateColor::Hovered), - std::pair(wxColour(74, 74, 79), StateColor::Normal)); - - // B63 + buttonsizer->AddSpacer(16); + add_button = new DeviceButton(Panel, "add_machine_list_able", wxBU_LEFT); add_button->SetBackgroundColor(add_btn_bg); - add_button->SetBorderColor(wxColour(57, 51, 55)); add_button->SetCanFocus(false); - buttonsizer->Add(add_button, wxSizerFlags().Align(wxALIGN_LEFT).CenterVertical().Border(wxALL, 1)); + add_button->SetCornerRadius(4); + + buttonsizer->Add(add_button, 0, wxALIGN_CENTER_VERTICAL); + + buttonsizer->AddSpacer(14); + add_button->Bind(wxEVT_BUTTON, &PrinterWebView::OnAddButtonClick, this); - // B63 delete_button = new DeviceButton(Panel, "delete_machine_list_able", wxBU_LEFT); delete_button->SetBackgroundColor(add_btn_bg); - delete_button->SetBorderColor(wxColour(57, 51, 55)); delete_button->SetCanFocus(false); - buttonsizer->Add(delete_button, wxSizerFlags().Align(wxALIGN_LEFT).CenterVertical().Border(wxALL, 1)); + delete_button->SetCornerRadius(4); + + buttonsizer->Add(delete_button, 0, wxALIGN_CENTER_VERTICAL); + + buttonsizer->AddSpacer(14); + delete_button->Bind(wxEVT_BUTTON, &PrinterWebView::OnDeleteButtonClick, this); - // B63 edit_button = new DeviceButton(Panel, "edit_machine_list_able", wxBU_LEFT); edit_button->SetBackgroundColor(add_btn_bg); - edit_button->SetBorderColor(wxColour(57, 51, 55)); edit_button->SetCanFocus(false); - buttonsizer->Add(edit_button, wxSizerFlags().Align(wxALIGN_LEFT).CenterVertical().Border(wxALL, 1)); + edit_button->SetCornerRadius(4); + + buttonsizer->Add(edit_button, 0, wxALIGN_CENTER_VERTICAL); + + buttonsizer->AddSpacer(14); + edit_button->Bind(wxEVT_BUTTON, &PrinterWebView::OnEditButtonClick, this); refresh_button = new DeviceButton(Panel, "refresh_machine_list_able", wxBU_LEFT); refresh_button->SetBackgroundColor(add_btn_bg); - refresh_button->SetBorderColor(wxColour(57, 51, 55)); refresh_button->SetCanFocus(false); - buttonsizer->Add(refresh_button, wxSizerFlags().Align(wxALIGN_LEFT).CenterVertical().Border(wxALL, 1)); + refresh_button->SetCornerRadius(4); + + buttonsizer->Add(refresh_button, 0, wxALIGN_CENTER_VERTICAL); + + buttonsizer->AddSpacer(16); + refresh_button->Bind(wxEVT_BUTTON, &PrinterWebView::OnRefreshButtonClick, this); - arrow_button = new RoundButton(Panel, wxID_ANY, "", wxDefaultPosition, wxSize(35, 35)); - arrow_button->SetBackgroundColour(Panel->GetBackgroundColour()); - arrow_button->SetForegroundColour(Panel->GetBackgroundColour()); - // arrow_button->SetMinSize(wxSize(40, -1)); - if (m_isSimpleMode) - arrow_button->SetBitmap(create_scaled_bitmap("arrow-right-s-line", nullptr, 25)); - else - arrow_button->SetBitmap(create_scaled_bitmap("arrow-left-s-line", nullptr, 25)); - buttonsizer->AddStretchSpacer(1); - buttonsizer->Add(arrow_button, wxSizerFlags().Align(wxALIGN_RIGHT).CenterVertical().Border(wxALL, 1)); - arrow_button->Bind(wxEVT_BUTTON, &PrinterWebView::OnZoomButtonClick, this); - buttonsizer->Layout(); - return buttonsizer; } - void PrinterWebView::init_scroll_window(wxPanel* Panel) { - leftScrolledWindow = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL | wxVSCROLL); - leftScrolledWindow->SetBackgroundColour(wxColour(38, 38, 41)); - leftScrolledWindow->SetSizer(devicesizer); - leftScrolledWindow->SetScrollRate(10, 10); - leftScrolledWindow->SetMinSize(wxSize(300, -1)); - leftScrolledWindow->FitInside(); - leftScrolledWindow->Bind(wxEVT_SCROLLWIN_TOP, &PrinterWebView::OnScroll, this); - leftScrolledWindow->Bind(wxEVT_SCROLLWIN_BOTTOM, &PrinterWebView::OnScroll, this); - leftScrolledWindow->Bind(wxEVT_SCROLLWIN_LINEUP, &PrinterWebView::OnScroll, this); - leftScrolledWindow->Bind(wxEVT_SCROLLWIN_LINEDOWN, &PrinterWebView::OnScroll, this); - leftScrolledWindow->Bind(wxEVT_SCROLLWIN_PAGEUP, &PrinterWebView::OnScroll, this); - leftScrolledWindow->Bind(wxEVT_SCROLLWIN_PAGEDOWN, &PrinterWebView::OnScroll, this); - } - void PrinterWebView::CreatThread() { - std::thread myThread([&]() { - while (true) { - for (DeviceButton *button : m_buttons) { - if (m_stopThread) - break; - if (m_pauseThread) - break; - BOOST_LOG_TRIVIAL(error) << "machine IP: " << (button->getIPLabel()); - std::string printer_host = button->getIPLabel().ToStdString(); - DynamicPrintConfig cfg_t; - cfg_t.set_key_value("print_host", new ConfigOptionString(printer_host)); - cfg_t.set_key_value("host_type", new ConfigOptionString("ptfff")); - cfg_t.set_key_value("printhost_apikey", new ConfigOptionString(into_u8(button->GetApikey()))); - std::unique_ptr printhost(PrintHost::get_print_host(&cfg_t)); - if (!printhost) { - BOOST_LOG_TRIVIAL(error) << ("Could not get a valid Printer Host reference"); - return; - } - wxString msg; - std::string state = "standby"; - float progress = 0; - std::pair state_progress = printhost->get_status_progress(msg); - state = state_progress.first; +void PrinterWebView::init_scroll_window(wxPanel* Panel) { + leftScrolledWindow = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL | wxVSCROLL); + leftScrolledWindow->SetBackgroundColour(wxColour(255, 255, 255)); + leftScrolledWindow->SetSizer(devicesizer); + leftScrolledWindow->SetScrollRate(10, 10); + leftScrolledWindow->SetMinSize(wxSize(220, -1)); + leftScrolledWindow->FitInside(); + leftScrolledWindow->Bind(wxEVT_SCROLLWIN_TOP, &PrinterWebView::OnScroll, this); + leftScrolledWindow->Bind(wxEVT_SCROLLWIN_BOTTOM, &PrinterWebView::OnScroll, this); + leftScrolledWindow->Bind(wxEVT_SCROLLWIN_LINEUP, &PrinterWebView::OnScroll, this); + leftScrolledWindow->Bind(wxEVT_SCROLLWIN_LINEDOWN, &PrinterWebView::OnScroll, this); + leftScrolledWindow->Bind(wxEVT_SCROLLWIN_PAGEUP, &PrinterWebView::OnScroll, this); + leftScrolledWindow->Bind(wxEVT_SCROLLWIN_PAGEDOWN, &PrinterWebView::OnScroll, this); +} - if ((button->GetStateText()).ToStdString() != state) - button->SetStateText(state); - - if (state == "printing") { - progress = state_progress.second * 100; - int progressInt = static_cast(progress); - button->SetProgressText(wxString::Format(wxT("(%d%%)"), progressInt)); - } - } - #if QDT_RELEASE_TO_PUBLIC - auto m_devices = wxGetApp().get_devices(); - int count = 0; - for (const auto &device : m_devices) { - if (m_stopThread) - break; - if (m_pauseThread) - break; - if (!m_net_buttons.empty()) { - BOOST_LOG_TRIVIAL(error) << "machine IP: " << device.local_ip; - std::unique_ptr printhost(PrintHost::get_print_host_url(device.url, device.local_ip)); - if (!printhost) { - BOOST_LOG_TRIVIAL(error) << ("Could not get a valid Printer Host reference"); - return; - } - wxString msg; - std::string state = "standby"; - float progress = 0; - std::pair state_progress = printhost->get_status_progress(msg); - state = state_progress.first; - if ((m_net_buttons[count]->GetStateText()).ToStdString() != state) - m_net_buttons[count]->SetStateText(state); - - if (state == "printing") { - progress = state_progress.second * 100; - int progressInt = static_cast(progress); - m_net_buttons[count]->SetProgressText(wxString::Format(wxT("(%d%%)"), progressInt)); - } - count++; - } - } - #endif - if (m_stopThread) - break; - boost::this_thread::sleep(boost::posix_time::seconds(1)); - } - }); - m_statusThread = std::move(myThread); - } void PrinterWebView::SetPresetChanged(bool status) { if (status) { - StopStatusThread(); - m_stopThread = false; - DeleteButton(); - DeleteNetButton(); - m_machine.clear(); - m_exit_host.clear(); - //ShowLocalPrinterButton(); - PresetBundle& preset_bundle = *wxGetApp().preset_bundle; - PhysicalPrinterCollection& ph_printers = preset_bundle.physical_printers; - //y50 - std::set qidi_printers; - const auto enabled_vendors = wxGetApp().app_config->vendors(); - for (const auto vendor : enabled_vendors) { - std::map> model_map = vendor.second; - for (auto model_name : model_map) { - qidi_printers.emplace(model_name.first); + clearStatusPanelData(); + DeleteButton(); + DeleteNetButton(); + leftScrolledWindow->DestroyChildren(); + devicesizer->Clear(); + m_device_manager->stopAllConnection(); + m_device_id_to_button.clear(); + m_machine.clear(); + m_exit_host.clear(); + + + PresetBundle& preset_bundle = *wxGetApp().preset_bundle; + PhysicalPrinterCollection& ph_printers = preset_bundle.physical_printers; + + if(!ph_printers.empty()){ + wxBoxSizer* label_boxsizer = new wxBoxSizer(wxHORIZONTAL); + wxStaticText* LocalDevicesLabel = new wxStaticText(leftScrolledWindow, wxID_ANY, "Local"); + LocalDevicesLabel->SetFont(wxFont(10, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, "Microsoft YaHei")); + LocalDevicesLabel->SetForegroundColour(wxColour(74, 74, 74)); + label_boxsizer->AddSpacer(15); + //.Border(wxTOP, 3) + label_boxsizer->Add(LocalDevicesLabel, wxSizerFlags(0).CenterVertical()); + + devicesizer->Add(label_boxsizer); + + devicesizer->AddSpacer(6); + + + //y50 + std::set qidi_printers; + const auto enabled_vendors = wxGetApp().app_config->vendors(); + for (const auto vendor : enabled_vendors) { + std::map> model_map = vendor.second; + for (auto model_name : model_map) { + qidi_printers.emplace(model_name.first); + } } + std::string actice_url = ""; + for (PhysicalPrinterCollection::ConstIterator it = ph_printers.begin(); it != ph_printers.end(); ++it) { + std::string host = (it->config.opt_string("print_host")); + std::string apikey = (it->config.opt_string("printhost_apikey")); + std::string preset_name = (it->config.opt_string("preset_name")); + bool isQIDI_printer = false; + if (qidi_printers.find(preset_name) != qidi_printers.end()) + isQIDI_printer = true; + + std::string full_name = it->get_full_name(preset_name); + std::string model_id; + if (isQIDI_printer) + model_id = preset_name; + else + model_id = "my_printer"; + const DynamicPrintConfig* cfg_t = &(it->config); + + const auto opt = cfg_t->option>("host_type"); + auto host_type = opt != nullptr ? opt->value : htOctoPrint; + + // y13 + bool is_selected = false; + if (!select_machine_name.empty()) + if (select_machine_name == it->get_short_name(full_name)) + { + is_selected = true; + select_machine_name = ""; + } + + + AddButton(from_u8(it->get_short_name(full_name)), host, model_id, from_u8(full_name), is_selected, + (host_type == htOctoPrint), apikey); + m_machine.insert(std::make_pair((it->get_short_name(full_name)), *cfg_t)); + //y25 + m_exit_host.insert(host); + } + + devicesizer->AddSpacer(7); } - std::string actice_url = ""; - for (PhysicalPrinterCollection::ConstIterator it = ph_printers.begin(); it != ph_printers.end(); ++it) { - std::string host = (it->config.opt_string("print_host")); - std::string apikey = (it->config.opt_string("printhost_apikey")); - std::string preset_name = (it->config.opt_string("preset_name")); - bool isQIDI_printer = false; - if (qidi_printers.find(preset_name) != qidi_printers.end()) - isQIDI_printer = true; - std::string full_name = it->get_full_name(preset_name); - std::string model_id; - if (isQIDI_printer) - model_id = preset_name; - else - model_id = "my_printer"; - const DynamicPrintConfig* cfg_t = &(it->config); - - const auto opt = cfg_t->option>("host_type"); - auto host_type = opt != nullptr ? opt->value : htOctoPrint; - - // y13 - bool is_selected = false; - if (!select_machine_name.empty()) - if (select_machine_name == it->get_short_name(full_name)) - { - is_selected = true; - select_machine_name = ""; - } - - - //BOOST_LOG_TRIVIAL(error) << preset_name; - //BOOST_LOG_TRIVIAL(error) << full_name; - //BOOST_LOG_TRIVIAL(error) << (it->get_short_name(full_name)); - //BOOST_LOG_TRIVIAL(error) << (it->get_preset_name(full_name)); - //BOOST_LOG_TRIVIAL(error) << model_id; - AddButton(from_u8(it->get_short_name(full_name)), host, model_id, from_u8(full_name), is_selected, - (host_type == htOctoPrint), apikey); - m_machine.insert(std::make_pair((it->get_short_name(full_name)), *cfg_t)); - //y25 - m_exit_host.insert(host); - } -#if QDT_RELEASE_TO_PUBLIC - auto m_devices = wxGetApp().get_devices(); - - for (const auto& device : m_devices) { - AddNetButton(device); - } -#endif - CreatThread(); - } + //y76 + if(m_isloginin){ + wxBoxSizer* label_boxsizer_online = new wxBoxSizer(wxHORIZONTAL); + wxStaticText* NetDevicesLabel; + bool is_link = wxGetApp().is_link_connect(); + if(is_link){ + NetDevicesLabel = new wxStaticText(leftScrolledWindow, wxID_ANY, "Link"); + } else { + NetDevicesLabel = new wxStaticText(leftScrolledWindow, wxID_ANY, "QIDI Maker"); + } + NetDevicesLabel->SetFont(wxFont(10, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, "Microsoft YaHei")); + NetDevicesLabel->SetForegroundColour(wxColour(74, 74, 74)); + label_boxsizer_online->AddSpacer(15); + label_boxsizer_online->Add(NetDevicesLabel, wxSizerFlags(0).CenterVertical()); + devicesizer->Add(label_boxsizer_online); + devicesizer->AddSpacer(7); + } + m_net_devices = wxGetApp().get_devices(); + for (const auto& device : m_net_devices) { + AddNetButton(device); + } + } //y40 - if(m_isNetMode) - ShowNetPrinterButton(); - else - ShowLocalPrinterButton(); - if (webisNetMode == isNetWeb) { for (DeviceButton* button : m_net_buttons) { wxString button_ip = button->getIPLabel(); @@ -427,32 +346,71 @@ wxBoxSizer *PrinterWebView::init_menu_bar(wxPanel *Panel) if (button_ip.Lower().ends_with("10088")) button_ip.Remove(button_ip.length() - 6); if (button_ip == m_ip) { - button->SetIsSelected(true); + wxEvtHandler* handler = button->GetEventHandler(); + if (handler) + { + wxCommandEvent evt(wxEVT_BUTTON, button->GetId()); + evt.SetEventObject(button); + handler->ProcessEvent(evt); + } + //button->SetIsSelected(true); break; } } - } else if (webisNetMode == isLocalWeb) { + } + else if (webisNetMode == isLocalWeb) { for (DeviceButton* button : m_buttons) { - if (button->getIPLabel()== m_ip) { + if (button->getIPLabel() == m_ip) { + + button->SetIsSelected(true); + for (auto it = m_device_id_to_button.begin(); it != m_device_id_to_button.end(); ++it) { + if (it->second == button) { + m_cur_deviceId = it->first; + } + } + m_device_manager->setSelected(m_cur_deviceId); + + auto select_dev = m_device_manager->getSelectedDevice(); + + if(select_dev){ + m_device_manager->reconnectDevice(m_cur_deviceId); + m_status_book->ChangeSelection(1); + this->webisNetMode = isLocalWeb; + UpdateState(); + allsizer->Layout(); + if (wxGetApp().mainframe) { + wxGetApp().mainframe->is_webview = false; + } + wxGetApp().app_config->set("machine_list_net", "0"); + } else { + wxEvtHandler* handler = button->GetEventHandler(); + if (handler) + { + wxCommandEvent evt(wxEVT_BUTTON, button->GetId()); + evt.SetEventObject(button); + handler->ProcessEvent(evt); + } + } break; } } } else { + m_status_book->ChangeSelection(0); wxString strlang = wxGetApp().current_language_code_safe(); if (m_isNetMode) { - //y30 + //y30 wxString url = wxString::Format("file://%s/web/qidi/link_missing_connection.html", from_u8(resources_dir())); - if(strlang != "") + if (strlang != "") url = wxString::Format("file://%s/web/qidi/link_missing_connection.html?lang=%s", from_u8(resources_dir()), strlang); load_disconnect_url(url); } else { - //y30 + //y30 wxString url = wxString::Format("file://%s/web/qidi/missing_connection.html", from_u8(resources_dir())); if (strlang != "") url = wxString::Format("file://%s/web/qidi/missing_connection.html?lang=%s", from_u8(resources_dir()), strlang); @@ -462,51 +420,99 @@ wxBoxSizer *PrinterWebView::init_menu_bar(wxPanel *Panel) UpdateState(); UpdateLayout(); } - void PrinterWebView::SetLoginStatus(bool status) { - m_isloginin = status; - if (m_isloginin) { - /*login_button->SetLabel("123456");*/ - #if QDT_RELEASE_TO_PUBLIC - wxString msg; - QIDINetwork m_qidinetwork; - std::string name = m_qidinetwork.user_info(msg); - // y1 - wxString wxname = from_u8(name); - login_button->SetLabel(wxname); - std::vector m_devices = m_qidinetwork.get_device_list(msg); - //y33 - m_user_head_name = wxGetApp().app_config->get("user_head_name"); - SetPresetChanged(true); - #endif - m_isloginin = true; - UpdateState(); - } else { - login_button->SetLabel(_L("Login/Register")); - #if QDT_RELEASE_TO_PUBLIC - std::vector devices; - wxGetApp().set_devices(devices); - #endif - // y28 - webisNetMode = isDisconnect; - if (wxGetApp().mainframe) { - wxGetApp().mainframe->is_net_url = false; - wxGetApp().mainframe->printer_view_ip = ""; - wxGetApp().mainframe->printer_view_url = ""; +void PrinterWebView::SetLoginStatus(bool status) { + m_isloginin = status; + if (m_isloginin) { +//y76 +#if QDT_RELEASE_TO_PUBLIC + { + bool is_get_net_devices = false; + wxString msg; + bool is_link = wxGetApp().is_link_connect(); + if (is_link) + { + QIDINetwork m_qidinetwork; + std::string name = m_qidinetwork.user_info(msg); + is_get_net_devices = m_qidinetwork.get_device_list(msg); + } + else + { + is_get_net_devices = MakerHttpHandle::getInstance().get_maker_device_list(); + MakerHttpHandle::getInstance().setSSEHandle([this](const std::string& event, const std::string& data) { + this->onSSEMessageHandle(event, data); + }); + } + if (is_get_net_devices) + { + this->UpdateState(); + this->SetPresetChanged(true); + } } - m_user_head_name = ""; + + std::thread([this](){ + while(m_isloginin){ + bool is_get_net_devices = false; + wxString msg; + bool is_link = wxGetApp().is_link_connect(); + if(is_link) + { + QIDINetwork m_qidinetwork; + std::string name = m_qidinetwork.user_info(msg); + is_get_net_devices = m_qidinetwork.get_device_list(msg); + } + else + { + is_get_net_devices = MakerHttpHandle::getInstance().get_maker_device_list(); + } + + if (is_get_net_devices) + { + std::vector currentDevices = wxGetApp().get_devices(); + int currentDeviceCount = currentDevices.size(); + static int s_lastDeviceCount = 0; + + if (currentDeviceCount != s_lastDeviceCount) + { + s_lastDeviceCount = currentDeviceCount; + + // ߳иUI + GUI::wxGetApp().CallAfter([this]() { + this->UpdateState(); + this->SetPresetChanged(true); + }); + } + } + + std::this_thread::sleep_for(std::chrono::seconds(10)); + } + }).detach(); +#endif + } else { + std::vector devices; + wxGetApp().set_devices(devices); + if (!wxGetApp().is_link_connect()) // link¼ʱ˳¼Ҫرsse + { +#if QDT_RELEASE_TO_PUBLIC + MakerHttpHandle::getInstance().closeSSEClient(); +#endif + } + // y28 + if(webisNetMode == isNetWeb) + webisNetMode = isDisconnect; SetPresetChanged(true); UpdateState(); - wxGetApp().get_login_info(); } - } +} - PrinterWebView::~PrinterWebView() - { - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " Start"; - SetEvtHandlerEnabled(false); - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " End"; - } +PrinterWebView::~PrinterWebView() +{ + m_device_manager->stopAllConnection(); + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " Start"; + SetEvtHandlerEnabled(false); + + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " End"; +} // // B55 void PrinterWebView::AddButton(const wxString & device_name, @@ -517,32 +523,102 @@ wxBoxSizer *PrinterWebView::init_menu_bar(wxPanel *Panel) bool isQIDI, const wxString& apikey) { - wxString Machine_Name = Machine_Name.Format("%s%s", machine_type, "_thumbnail"); + wxString Machine_Name = Machine_Name.Format("%s%s", machine_type, "_thumbnail"); - StateColor mac_btn_bg(std::pair(wxColour(147, 147, 150), StateColor::Pressed), - std::pair(wxColour(76, 76, 80), StateColor::Hovered), - std::pair(wxColour(67, 67, 71), StateColor::Normal)); + StateColor mac_btn_bg(std::pair(wxColour(230, 237, 255), StateColor::Pressed), + std::pair(wxColour(230, 247, 255), StateColor::Hovered), + std::pair(wxColour(255, 255, 255), StateColor::Normal)); - //y50 - wxString machine_icon_path = wxString(Slic3r::resources_dir() + "/" + "profiles" + "/" + "thumbnail" + "/" + Machine_Name + ".png", wxConvUTF8); + //y50 + wxString machine_icon_path = wxString(Slic3r::resources_dir() + "/" + "profiles" + "/" + "thumbnail" + "/" + Machine_Name + ".png", wxConvUTF8); - DeviceButton *machine_button = new DeviceButton(leftScrolledWindow, fullname, machine_icon_path, wxBU_LEFT, wxSize(80, 80), device_name, ip, apikey); - machine_button->SetBackgroundColor(mac_btn_bg); - machine_button->SetBorderColor(wxColour(57, 51, 55)); - machine_button->SetCanFocus(false); - machine_button->SetIsSimpleMode(m_isSimpleMode); + DeviceButton *machine_button = new DeviceButton(leftScrolledWindow, fullname, machine_icon_path, wxBU_LEFT, wxSize(20, 20), device_name, ip, apikey); + machine_button->SetBackgroundColor(mac_btn_bg); + machine_button->SetForegroundColour(wxColor(119, 119, 119)); + //machine_button->SetBorderColor(wxColour(57, 51, 55)); + machine_button->SetCanFocus(false); + machine_button->SetCornerRadius(0); - machine_button->Bind(wxEVT_BUTTON, [this, ip](wxCommandEvent &event) { - FormatUrl(into_u8(ip)); - }); - devicesizer->Add(machine_button, wxSizerFlags().Border(wxALL, 1).Expand()); - devicesizer->Layout(); - m_buttons.push_back(machine_button); + std::thread([this, device_name, ip, machine_type, machine_button]() { + std::string t_device_id = m_device_manager->addDevice( + into_u8(device_name), + into_u8(ip), + /* dev_url */ into_u8(ip), + into_u8(machine_type) + ); + + if (!t_device_id.empty()) { + std::lock_guard lock(m_ui_map_mutex); + m_device_id_to_button[t_device_id] = machine_button; + } else { + std::cout << "Add device failed: " << into_u8(device_name) << std::endl; + } + }).detach(); - // y13 - if (isSelected) - FormatUrl(into_u8(ip)); + //y76 + machine_button->Bind(wxEVT_BUTTON, [this, ip, machine_button](wxCommandEvent &event) { + clearStatusPanelData(); + cancelAllDevButtonSelect(); + m_device_manager->unSelected(); + machine_button->SetIsSelected(true); + for (auto it = m_device_id_to_button.begin(); it != m_device_id_to_button.end(); ++it) { + if (it->second == machine_button) { + m_cur_deviceId = it->first; + } + } + this->webisNetMode = isLocalWeb; + UpdateState(); + m_status_book->ChangeSelection(0); + allsizer->Layout(); + FormatUrl(into_u8(ip)); + + wxGetApp().app_config->set("last_selected_machine", into_u8(machine_button->getIPLabel())); + wxGetApp().app_config->set_bool("last_sel_machine_is_net", false); + wxGetApp().app_config->set_bool("is_support_mqtt", false); + }); + devicesizer->Add(machine_button); + devicesizer->Layout(); + Layout(); + m_buttons.push_back(machine_button); } + +void PrinterWebView::updateDeviceConnectType(const std::string& device_id, const std::string& device_ip){ + std::lock_guard lock(m_ui_map_mutex); + auto it = m_device_id_to_button.find(device_id); + if (it != m_device_id_to_button.end()) { + DeviceButton* machine_button = it->second; + if (machine_button) { + //y76 + machine_button->Bind(wxEVT_BUTTON, [this, device_ip, machine_button, device_id](wxCommandEvent &event) { + clearStatusPanelData(); + cancelAllDevButtonSelect(); + machine_button->SetIsSelected(true); + m_device_manager->setSelected(device_id); + m_device_manager->reconnectDevice(device_id); + + for (auto it = m_device_id_to_button.begin(); it != m_device_id_to_button.end(); ++it) { + if (it->second == machine_button) { + m_cur_deviceId = it->first; + } + } + this->webisNetMode = isLocalWeb; + UpdateState(); + m_status_book->ChangeSelection(1); + allsizer->Layout(); + + if (wxGetApp().mainframe) { + wxGetApp().mainframe->is_webview = false; + } + m_ip = device_ip; + wxGetApp().app_config->set("machine_list_net", "0"); + wxGetApp().app_config->set("last_selected_machine", into_u8(machine_button->getIPLabel())); + wxGetApp().app_config->set_bool("last_sel_machine_is_net", false); + wxGetApp().app_config->set_bool("is_support_mqtt", true); + }); + } + } +} + // y22 std::string PrinterWebView::NormalizeVendor(const std::string& str) { @@ -556,7 +632,7 @@ wxBoxSizer *PrinterWebView::init_menu_bar(wxPanel *Panel) } #if QDT_RELEASE_TO_PUBLIC - void PrinterWebView::AddNetButton(const Device device) + void PrinterWebView::AddNetButton(const NetDevice device) { std::set qidi_printers; // y50 @@ -570,6 +646,7 @@ wxBoxSizer *PrinterWebView::init_menu_bar(wxPanel *Panel) wxString Machine_Name; wxString device_name; + std::string t_device_type; // y22 if (!device.machine_type.empty()) { @@ -580,6 +657,7 @@ wxBoxSizer *PrinterWebView::init_menu_bar(wxPanel *Panel) if (NormalizeVendor(machine_vendor) == NormalizeVendor(extracted)) { Machine_Name = Machine_Name.Format("%s%s", machine_vendor, "_thumbnail"); + t_device_type = machine_vendor; break; } } @@ -590,47 +668,85 @@ wxBoxSizer *PrinterWebView::init_menu_bar(wxPanel *Panel) std::size_t found = device.device_name.find('@'); if (found != std::string::npos) { - std::string extracted = device.device_name.substr(found + 1); - for (std::string machine_vendor : qidi_printers) - { - if (NormalizeVendor(machine_vendor) == NormalizeVendor(extracted)) - { - Machine_Name = Machine_Name.Format("%s%s", machine_vendor, "_thumbnail"); - break; - } - } + std::string extracted = device.device_name.substr(found + 1); + for (std::string machine_vendor : qidi_printers) + { + if (NormalizeVendor(machine_vendor) == NormalizeVendor(extracted)) + { + Machine_Name = Machine_Name.Format("%s%s", machine_vendor, "_thumbnail"); + t_device_type = machine_vendor; + break; + } + } } } - + if (Machine_Name.empty()) { Machine_Name = Machine_Name.Format("%s%s", "my_printer", "_thumbnail"); } - StateColor mac_btn_bg(std::pair(wxColour(147, 147, 150), StateColor::Pressed), - std::pair(wxColour(76, 76, 80), StateColor::Hovered), - std::pair(wxColour(67, 67, 71), StateColor::Normal)); - QIDINetwork m_qidinetwork; + StateColor mac_btn_bg(std::pair(wxColour(230, 245, 255), StateColor::Pressed), + std::pair(wxColour(230, 247, 255), StateColor::Hovered), + std::pair(wxColour(255, 255, 255), StateColor::Normal)); //y50 wxString machine_icon_path = wxString(Slic3r::resources_dir() + "/" + "profiles" + "/" + "thumbnail" + "/" + Machine_Name + ".png", wxConvUTF8); - // device_name = m_qidinetwork.UTF8ToGBK(device_name.c_str()); - DeviceButton *machine_button = new DeviceButton(leftScrolledWindow, device.device_name, machine_icon_path, wxBU_LEFT, wxSize(80, 80), + DeviceButton *machine_button = new DeviceButton(leftScrolledWindow, device.device_name, machine_icon_path, wxBU_LEFT, wxSize(20, 20), device_name, device.local_ip); machine_button->SetBackgroundColor(mac_btn_bg); - machine_button->SetBorderColor(wxColour(57, 51, 55)); - machine_button->SetCanFocus(false); - machine_button->SetIsSimpleMode(m_isSimpleMode); + machine_button->SetForegroundColour(wxColor(119, 119, 119)); + machine_button->SetFont(Label::Body_16); + //machine_button->SetBorderColor(wxColour(57, 51, 55)); + machine_button->SetCanFocus(false); + machine_button->SetCornerRadius(0); - machine_button->Bind(wxEVT_BUTTON, [this, device](wxCommandEvent &event) { - FormatNetUrl(device.link_url, device.local_ip, device.isSpecialMachine); - }); + + machine_button->Bind(wxEVT_BUTTON, [this, device, machine_button](wxCommandEvent& event) { + if (machine_button == nullptr) { + return; + } + // cj_1 лðťʾʽ + cancelAllDevButtonSelect(); + clearStatusPanelData(); + machine_button->SetIsSelected(true); - devicesizer->Add(machine_button, wxSizerFlags().Border(wxALL, 1).Expand()); + + if (wxGetApp().is_link_connect()) { + m_status_book->ChangeSelection(0); + m_device_manager->unSelected(); + allsizer->Layout(); + FormatNetUrl(device.link_url, device.local_ip, device.isSpecialMachine); + } + else { + m_status_book->ChangeSelection(1); + m_device_manager->setSelected(device.mac_address); + m_cur_deviceId = device.mac_address; + allsizer->Layout(); + if (wxGetApp().mainframe) { + wxGetApp().mainframe->is_webview = false; + } + m_ip = device.local_ip; + wxGetApp().app_config->set("machine_list_net", "1"); + } + + this->webisNetMode = isNetWeb; + UpdateState(); + + wxGetApp().app_config->set("last_selected_machine", into_u8(machine_button->getIPLabel())); + wxGetApp().app_config->set_bool("last_sel_machine_is_net", true); + }); + + devicesizer->Add(machine_button); devicesizer->Layout(); m_net_buttons.push_back(machine_button); + auto qdsDevice = std::make_shared(device.mac_address, device.device_name, "", "", t_device_type); + qdsDevice->m_frp_url = device.url;// +"/webcam/?action=snapshot"; + qdsDevice->m_ip = device.local_ip; + qdsDevice->updateFilamentConfig(); + m_device_manager->addDevice(qdsDevice); } #endif @@ -647,7 +763,6 @@ wxBoxSizer *PrinterWebView::init_menu_bar(wxPanel *Panel) delete_button->Refresh(); edit_button->Refresh(); refresh_button->Refresh(); - login_button->Refresh(); } } void PrinterWebView::UnSelectedButton() @@ -684,138 +799,68 @@ wxBoxSizer *PrinterWebView::init_menu_bar(wxPanel *Panel) } void PrinterWebView::ShowNetPrinterButton() { - if (m_buttons.empty()) { - BOOST_LOG_TRIVIAL(info) << " empty"; - } else { - for (DeviceButton *button : m_buttons) { - button->Hide(); - } - } - if (m_net_buttons.empty()) { - BOOST_LOG_TRIVIAL(info) << " empty"; - } else { - for (DeviceButton *button : m_net_buttons) { - button->Show(); - } - } + HideAllDeviceButtons(); + ShowDeviceButtons(m_net_buttons); leftScrolledWindow->Layout(); Refresh(); } void PrinterWebView::ShowLocalPrinterButton() { - if (m_net_buttons.empty()) { - BOOST_LOG_TRIVIAL(info) << " empty"; - } else { - for (DeviceButton *button : m_net_buttons) { - button->Hide(); - } - } - if (m_buttons.empty()) { - BOOST_LOG_TRIVIAL(info) << " empty"; - } else { - for (DeviceButton *button : m_buttons) { - button->Show(); - - } - } + + HideAllDeviceButtons(); + ShowDeviceButtons(m_buttons); + leftScrolledWindow->Layout(); Refresh(); } void PrinterWebView::SetButtons(std::vector buttons) { m_buttons = buttons; } - void PrinterWebView::OnZoomButtonClick(wxCommandEvent &event) - { - m_isSimpleMode = !m_isSimpleMode; - if (!m_isSimpleMode) { - //y33 - staticBitmap->SetBitmap(create_scaled_bitmap_of_login(m_user_head_name, this, 60)); - login_button->SetIsSimpleMode(m_isSimpleMode); - wxGetApp().app_config->set("machine_list_minification", "0"); - toggleBar->SetSize(327); - devicesizer->SetMinSize(wxSize(300, -1)); - leftScrolledWindow->SetMinSize(wxSize(300, -1)); - arrow_button->SetBitmap(create_scaled_bitmap("arrow-left-s-line", nullptr,25)); - for (DeviceButton *button : m_buttons) { - button->SetIsSimpleMode(m_isSimpleMode); - } - for (DeviceButton *button : m_net_buttons) { - button->SetIsSimpleMode(m_isSimpleMode); - } - } else { - //y33 - staticBitmap->SetBitmap(create_scaled_bitmap_of_login(m_user_head_name, this, 40)); - login_button->SetIsSimpleMode(m_isSimpleMode); - wxGetApp().app_config->set("machine_list_minification", "1"); - toggleBar->SetSize(237); - arrow_button->SetBitmap(create_scaled_bitmap("arrow-right-s-line", nullptr, 25)); - devicesizer->SetMinSize(wxSize(190, -1)); - leftScrolledWindow->SetMinSize(wxSize(190, -1)); - for (DeviceButton *button : m_buttons) { - button->SetIsSimpleMode(m_isSimpleMode); - } - for (DeviceButton *button : m_net_buttons) { - button->SetIsSimpleMode(m_isSimpleMode); - } - } - // y22 - devicesizer->Layout(); +void PrinterWebView::OnRefreshButtonClick(wxCommandEvent &event) +{ + PresetBundle &preset_bundle = *wxGetApp().preset_bundle; - leftScrolledWindow->Layout(); + PhysicalPrinterCollection &ph_printers = preset_bundle.physical_printers; - allsizer->Layout(); - UpdateLayout(); - } - void PrinterWebView::OnRefreshButtonClick(wxCommandEvent &event) - { - PresetBundle &preset_bundle = *wxGetApp().preset_bundle; + std::vector vec1; + std::vector vec2; + for (PhysicalPrinterCollection::ConstIterator it = ph_printers.begin(); it != ph_printers.end(); ++it) { + for (const std::string &preset_name : it->get_preset_names()) { + std::string full_name = it->get_full_name(preset_name); + vec1.push_back(full_name); + } + } - PhysicalPrinterCollection &ph_printers = preset_bundle.physical_printers; + for (DeviceButton *button : m_buttons) { + vec2.push_back(button->GetLabel().ToStdString()); + } - std::vector vec1; - std::vector vec2; - for (PhysicalPrinterCollection::ConstIterator it = ph_printers.begin(); it != ph_printers.end(); ++it) { - for (const std::string &preset_name : it->get_preset_names()) { - std::string full_name = it->get_full_name(preset_name); - vec1.push_back(full_name); - } - } - - for (DeviceButton *button : m_buttons) { - vec2.push_back(button->GetLabel().ToStdString()); - } - - bool result1 = std::equal(vec1.begin(), vec1.end(), vec2.begin(), vec2.end()); - vec1.clear(); - vec2.clear(); - bool result2 = true; + bool result1 = std::equal(vec1.begin(), vec1.end(), vec2.begin(), vec2.end()); + vec1.clear(); + vec2.clear(); + bool result2 = true; #if QDT_RELEASE_TO_PUBLIC - wxString msg; - QIDINetwork m_qidinetwork; - m_qidinetwork.get_device_list(msg); - auto m_devices = wxGetApp().get_devices(); - for (const auto &device : m_devices) { - vec1.push_back(device.device_name); - } - for (DeviceButton *button : m_net_buttons) { - vec2.push_back(button->GetLabel().ToStdString()); - } - result2 = std::equal(vec1.begin(), vec1.end(), vec2.begin(), vec2.end()); - #endif - SetPresetChanged(!result1 || !result2); - - Refresh(); - } - void PrinterWebView::OnLoginButtonClick(wxCommandEvent &event) - { - // B64 - wxGetApp().ShowUserLogin(true); - devicesizer->Layout(); - - leftScrolledWindow->Layout(); - - allsizer->Layout(); - UpdateLayout(); - } + bool is_link = wxGetApp().is_link_connect(); + if(is_link){ + wxString msg; + QIDINetwork m_qidinetwork; + m_qidinetwork.get_device_list(msg); + } + else { + MakerHttpHandle::getInstance().get_maker_device_list(); + } + m_net_devices = wxGetApp().get_devices(); + for (const auto &device : m_net_devices) { + vec1.push_back(device.device_name); + } + for (DeviceButton *button : m_net_buttons) { + vec2.push_back(button->GetLabel().ToStdString()); + } + result2 = std::equal(vec1.begin(), vec1.end(), vec2.begin(), vec2.end()); + #endif + SetPresetChanged(!result1 || !result2); + + Refresh(); +} void PrinterWebView::OnAddButtonClick(wxCommandEvent &event) { //y25 @@ -830,75 +875,96 @@ wxBoxSizer *PrinterWebView::init_menu_bar(wxPanel *Panel) Refresh(); } } - void PrinterWebView::OnDeleteButtonClick(wxCommandEvent &event) - { - if (m_select_type == "local") { - PresetBundle &preset_bundle = *wxGetApp().preset_bundle; - for (DeviceButton *button : m_buttons) { - if ((button->GetIsSelected())) { - wxString msg; +void PrinterWebView::OnDeleteButtonClick(wxCommandEvent &event) +{ + if (m_select_type == "local") { + PresetBundle &preset_bundle = *wxGetApp().preset_bundle; + for (DeviceButton *button : m_buttons) { + if ((button->GetIsSelected())) { + wxString msg; - #if defined(__WIN32__) - msg += format_wxstr(_L("Are you sure you want to delete \"%1%\" printer?"), (button->GetLabel())); - #else - msg += _L("Are you sure you want to delete ") + (button->GetLabel()) + _L("printer?"); - #endif - if (MessageDialog(this, msg, _L("Delete Physical Printer"), wxYES_NO | wxNO_DEFAULT | wxICON_QUESTION).ShowModal() != - wxID_YES) - return; - // y1 - preset_bundle.physical_printers.select_printer(into_u8(button->GetLabel())); +#if defined(__WIN32__) + msg += format_wxstr(_L("Are you sure you want to delete \"%1%\" printer?"), (button->GetLabel())); +#else + msg += _L("Are you sure you want to delete ") + (button->GetLabel()) + _L("printer?"); +#endif + if (MessageDialog(this, msg, _L("Delete Physical Printer"), wxYES_NO | wxNO_DEFAULT | wxICON_QUESTION).ShowModal() != + wxID_YES) + return; + // y1 + preset_bundle.physical_printers.select_printer(into_u8(button->GetLabel())); - preset_bundle.physical_printers.delete_selected_printer(); - webisNetMode = isDisconnect; - SetPresetChanged(true); + preset_bundle.physical_printers.delete_selected_printer(); - UpdateLayout(); - Refresh(); - break; - } - } - if (m_handlerl) { - m_handlerl(event); - } - } else if (m_select_type == "net") { - for (DeviceButton *button : m_net_buttons) { - if ((button->GetIsSelected())) { - wxString msg; + webisNetMode = isDisconnect; + SetPresetChanged(true); - #if defined(__WIN32__) - msg += format_wxstr(_L("Are you sure you want to delete \"%1%\" printer?"), (button->GetLabel())); - #else - msg += _L("Are you sure you want to delete ") + (button->GetLabel()) + _L("printer?"); - #endif - if (MessageDialog(this, msg, _L("Delete Physical Printer"), wxYES_NO | wxNO_DEFAULT | wxICON_QUESTION).ShowModal() != - wxID_YES) - return; - #if QDT_RELEASE_TO_PUBLIC + UpdateLayout(); + Refresh(); + break; + } + } + if (m_handlerl) { + m_handlerl(event); + } + } else if (m_select_type == "net") { + for (DeviceButton *button : m_net_buttons) { + if ((button->GetIsSelected())) { + wxString msg; - auto devices = wxGetApp().get_devices(); - for (const auto &device : devices) { - if (device.local_ip == (button->getIPLabel())) { - wxString msg; - QIDINetwork m_qidinetwork; - m_qidinetwork.unbind(msg, device.id); - m_qidinetwork.get_device_list(msg); - } - } - #endif - webisNetMode = isDisconnect; - SetPresetChanged(true); +#if defined(__WIN32__) + msg += format_wxstr(_L("Are you sure you want to delete \"%1%\" printer?"), (button->GetLabel())); +#else + msg += _L("Are you sure you want to delete ") + (button->GetLabel()) + _L("printer?"); +#endif + if (MessageDialog(this, msg, _L("Delete Physical Printer"), wxYES_NO | wxNO_DEFAULT | wxICON_QUESTION).ShowModal() != + wxID_YES) + return; +#if QDT_RELEASE_TO_PUBLIC - UpdateLayout(); - Refresh(); - break; - } - } - if (m_handlerl) { - m_handlerl(event); - } - } - } + if (wxGetApp().is_link_connect()){ + auto devices = wxGetApp().get_devices(); + for (const auto &device : devices) { + if (device.local_ip == (button->getIPLabel())) { + wxString msg; + QIDINetwork m_qidinetwork; + m_qidinetwork.unbind(msg, device.id); + m_qidinetwork.get_device_list(msg); + } + } + } else { + HttpData httpData; + json bodyJson; + bodyJson["serialNumber"] = m_cur_deviceId; + bodyJson["source"] = "QIDIStudio"; + httpData.body = bodyJson.dump(); + httpData.env = TESTENV; + httpData.target = DEVICE; + wxEventType curEventType = event.GetEventType(); + httpData.taskPath = "/unbind"; + + bool isSucceed = false; + std::string resultBody = MakerHttpHandle::getInstance().httpPostTask(httpData, isSucceed); + + if (!isSucceed) { + std::cout << "http error" << isSucceed << std::endl; + + } + } +#endif + webisNetMode = isDisconnect; + SetPresetChanged(true); + + UpdateLayout(); + Refresh(); + break; + } + } + if (m_handlerl) { + m_handlerl(event); + } + } +} void PrinterWebView::OnEditButtonClick(wxCommandEvent &event) { for (DeviceButton *button : m_buttons) { @@ -972,11 +1038,6 @@ wxBoxSizer *PrinterWebView::init_menu_bar(wxPanel *Panel) button->Refresh(); } } - //y33 - if (!m_isSimpleMode) - staticBitmap->SetBitmap(create_scaled_bitmap_of_login(m_user_head_name, this, 60)); - else - staticBitmap->SetBitmap(create_scaled_bitmap_of_login(m_user_head_name, this, 40)); } void PrinterWebView::OnScrollup(wxScrollWinEvent &event) { @@ -992,7 +1053,204 @@ wxBoxSizer *PrinterWebView::init_menu_bar(wxPanel *Panel) UpdateLayout(); event.Skip(); } - void PrinterWebView::OnScroll(wxScrollWinEvent &event) + +void PrinterWebView::onStatusPanelTask(wxCommandEvent& event) +{ + //y76 + if(webisNetMode == isLocalWeb){ + wxEventType curEventType = event.GetEventType(); + std::string megscript = m_localEventToTaskPath[curEventType]; + if (curEventType == EVTSET_EXTRUDER_TEMPERATURE || + curEventType == EVTSET_HEATERBED_TEMPERATURE || + curEventType == EVTSET_CHAMBER_TEMPERATURE || + curEventType == EVTSET_CASE_LIGHT || + curEventType == EVTSET_X_AXIS || + curEventType == EVTSET_Y_AXIS || + curEventType == EVTSET_Z_AXIS || + curEventType == EVTSET_INSERT_READ || + curEventType == EVTSET_BOOT_READ || + curEventType == EVTSET_AUTO_FILAMENT) { + + int value = event.GetInt(); + std::string placeholder = "%d"; + size_t pos = megscript.find(placeholder); + if (pos != std::string::npos) { + megscript.replace(pos, placeholder.length(), std::to_string(value)); + } else { + megscript += std::to_string(value); + } + + } else if (curEventType == EVTSET_RETURN_SAFEHOME) { + ; + } + else if ( + curEventType == EVTSET_COOLLINGFAN_SPEED + || curEventType == EVTSET_CHAMBERFAN_SPEED + || curEventType == EVTSET_AUXILIARYFAN_SPEED + ) { + + wxString megscriptWxStr(megscript); + megscript = wxString::Format(megscriptWxStr,float(event.GetInt()) / float(100.00)).ToStdString(); + } + else { + megscript += std::to_string(event.GetInt()); + } + m_device_manager->sendCommand(m_cur_deviceId, megscript); + + if(event.GetString() == "type"){ + int typeIndex = event.GetInt(); + std::vector types{ "pause","resume","cancel" }; + if (typeIndex > 2) { + typeIndex = 0; + } + std::string action_type = types[typeIndex]; + m_device_manager->sendActionCommand(m_cur_deviceId, action_type); + } + + } else { + HttpData httpData; + json bodyJson; + bodyJson["serialNumber"] = m_cur_deviceId; + if (event.GetString() == "value") { + bodyJson["value"] = event.GetInt(); + } + else if (event.GetString() == "enable") { + bodyJson["enable"] = bool(event.GetInt()); + } + else if (event.GetString() == "type") {// 0 :pause 1: resume 2:cancel + int typeIndex = event.GetInt(); + std::vector types{ "pause","resume","cancel" }; + if (typeIndex > 2) { + typeIndex = 0; + } + bodyJson["type"] = types[typeIndex]; + } + else if(!event.GetString().empty()){ + + } + + if (event.GetString().empty()) { + httpData.body = "{}"; + } + else { + httpData.body = bodyJson.dump(); + } + + + httpData.env = TESTENV; + httpData.target = PRINTERTYPE; + + wxEventType curEventType = event.GetEventType(); + if (m_eventToTaskPath.find(curEventType) != m_eventToTaskPath.end()) { + httpData.taskPath = m_eventToTaskPath[curEventType]; + } + + bool isSucceed = false; + std::string resultBody = MakerHttpHandle::getInstance().httpPostTask(httpData, isSucceed); + + if (!isSucceed) { + std::cout << "http error" << isSucceed << std::endl; + return; + } + } +} + +//cj_1 +void PrinterWebView::onSetBoxTask(wxCommandEvent& event) +{ + + //cj_1 + if (webisNetMode == isLocalWeb) { + wxEventType curEventType = event.GetEventType(); + std::string megscript; + if (curEventType == EVT_SET_COLOR) { + megscript = "SAVE_VARIABLE VARIABLE=color_slot" + std::to_string(event.GetInt()) + + " VALUE=\"" + event.GetString().ToStdString() + "\""; + } + if (curEventType == EVTSET_FILAMENT_VENDOR) { + megscript = "SAVE_VARIABLE VARIABLE=vendor_slot" + std::to_string(event.GetInt()) + + " VALUE=\"" + event.GetString().ToStdString() + "\""; + } + if (curEventType == EVTSET_FILAMENT_TYPE) { + megscript = "SAVE_VARIABLE VARIABLE=filament_slot" + std::to_string(event.GetInt()) + + " VALUE=\"" + event.GetString().ToStdString() + "\""; + } + if (curEventType == EVTSET_FILAMENT_LOAD) { + megscript = "E_LOAD slot=" + std::to_string(event.GetInt()); + } + if (curEventType == EVTSET_FILAMENT_UNLOAD) { + megscript = "E_UNLOAD slot=" + std::to_string(event.GetInt()); + } + + m_device_manager->sendCommand(m_cur_deviceId, megscript); + return; + } + + HttpData httpData; + json bodyJson; + bodyJson["serialNumber"] = m_cur_deviceId; + bodyJson["slotIndex"] = event.GetInt(); + long index = -1; + event.GetString().ToLong(&index); + bodyJson["idx"] = index; + httpData.body = bodyJson.dump(); + httpData.env = TESTENV; + httpData.target = PRINTERTYPE; + wxEventType curEventType = event.GetEventType(); + if (m_boxEventToTaskPath.find(curEventType) != m_boxEventToTaskPath.end()) { + httpData.taskPath = m_boxEventToTaskPath[curEventType]; + } + bool isSucceed = false; + std::string resultBody = MakerHttpHandle::getInstance().httpPostTask(httpData, isSucceed); + + if (!isSucceed) { + std::cout << "http error" << isSucceed << std::endl; + return; + } + +} + +void PrinterWebView::onRefreshRfid(wxCommandEvent& event) +{ + long canId = 0; + event.GetString().ToLong(&canId); + int slotIndex = event.GetInt() * 4 + canId; + + + if (webisNetMode == isLocalWeb) { + std::string megscript; + megscript = "RFID_READ SLOT=slot" + std::to_string(slotIndex); + + m_device_manager->sendCommand(m_cur_deviceId, megscript); + return; + } + + //RFID_READ SLOT=slot3 + HttpData httpData; + json bodyJson; + bodyJson["serialNumber"] = m_cur_deviceId; + bodyJson["slotIndex"] = slotIndex; + httpData.body = bodyJson.dump(); + httpData.env = TESTENV; + httpData.target = PRINTERTYPE; + httpData.taskPath = "/set/filament/rfid"; + + bool isSucceed = false; + std::string resultBody = MakerHttpHandle::getInstance().httpPostTask(httpData, isSucceed); + + if (!isSucceed) { + std::cout << "http error" << isSucceed << std::endl; + return; + } + + auto device = m_device_manager->getDevice(m_cur_deviceId); + return; + + + +} + +void PrinterWebView::OnScroll(wxScrollWinEvent& event) { UpdateLayout(); event.Skip(); @@ -1005,6 +1263,12 @@ wxBoxSizer *PrinterWebView::init_menu_bar(wxPanel *Panel) m_web = url; m_ip = ""; m_browser->LoadURL(url); + if (wxGetApp().mainframe) { + wxGetApp().mainframe->is_webview = true; + wxGetApp().mainframe->is_net_url = false; + wxGetApp().mainframe->printer_view_ip = ""; + wxGetApp().mainframe->printer_view_url = m_web; + } UpdateState(); } @@ -1039,6 +1303,7 @@ wxBoxSizer *PrinterWebView::init_menu_bar(wxPanel *Panel) button->SetIsSelected(false); } if (wxGetApp().mainframe) { + wxGetApp().mainframe->is_webview = true; wxGetApp().mainframe->is_net_url = false; wxGetApp().mainframe->printer_view_ip = m_ip; wxGetApp().mainframe->printer_view_url = m_web; @@ -1055,9 +1320,9 @@ wxBoxSizer *PrinterWebView::init_menu_bar(wxPanel *Panel) m_browser->LoadURL(m_web); //y28 webisNetMode = isNetWeb; - for (DeviceButton *button : m_buttons) { - button->SetIsSelected(false); - } +// for (DeviceButton *button : m_buttons) { +// button->SetIsSelected(false); +// } for (DeviceButton *button : m_net_buttons) { wxString button_ip = button->getIPLabel(); @@ -1065,12 +1330,13 @@ wxBoxSizer *PrinterWebView::init_menu_bar(wxPanel *Panel) button_ip.Remove(0, 7); if (button_ip.Lower().ends_with("10088")) button_ip.Remove(button_ip.length() - 6); - if (m_ip == button_ip) - button->SetIsSelected(true); - else - button->SetIsSelected(false); +// if (m_ip == button_ip) +// button->SetIsSelected(true); +// else +// button->SetIsSelected(false); } if (wxGetApp().mainframe) { + wxGetApp().mainframe->is_webview = true; wxGetApp().mainframe->is_net_url = true; wxGetApp().mainframe->printer_view_ip = m_ip; wxGetApp().mainframe->printer_view_url = m_web; @@ -1098,7 +1364,6 @@ wxBoxSizer *PrinterWebView::init_menu_bar(wxPanel *Panel) refresh_button->SetIcon("refresh_machine_list_able"); refresh_button->Enable(true); refresh_button->Refresh(); - login_button->Refresh(); for (DeviceButton* button : m_buttons) { if (button->GetIsSelected()) { delete_button->SetIcon("delete_machine_list_able"); @@ -1123,7 +1388,6 @@ wxBoxSizer *PrinterWebView::init_menu_bar(wxPanel *Panel) refresh_button->SetIcon("refresh_machine_list_able"); refresh_button->Enable(true); refresh_button->Refresh(); - login_button->Refresh(); for (DeviceButton* button : m_net_buttons) { if (button->GetIsSelected()) { delete_button->SetIcon("delete_machine_list_able"); @@ -1193,12 +1457,585 @@ wxBoxSizer *PrinterWebView::init_menu_bar(wxPanel *Panel) load_url(url); } - void PrinterWebView::SetToggleBar(bool is_net_mode) - { - toggleBar->SetValue(is_net_mode); - m_isNetMode = is_net_mode; - UpdateState(); + std::string extractBetweenMarkers(const std::string& path) { + // "/gcodes" λ + size_t startPos = path.find("/gcodes"); + if (startPos == std::string::npos) { + return ""; // ûҵ /gcodes + } + + // /gcodes 濪ʼϳȣ + startPos += 7; // "/gcodes" 7 + + // ".3mf" λ + size_t endPos = path.find(".3mf", startPos); + if (endPos == std::string::npos) { + return ""; // ûҵ .3mf + } + + // ȡм䲿 + return path.substr(startPos, endPos - startPos); } + void PrinterWebView::onSSEMessageHandle(const std::string& event, const std::string& data) + { + try + { + json msgJson = json::parse(data); + + if (!msgJson.contains("data") && !msgJson["data"].is_object() + && !msgJson.contains("serialNumber") && !msgJson["serialNumber"].is_string() + ) + { + + return; + } + std::string device_id = msgJson["serialNumber"]; + auto device = m_device_manager->getDevice(device_id); + if (device == nullptr) { + return; + } + string dataStr = msgJson["data"].get(); + json dataJson = json::parse(msgJson["data"].get()); + json status; + + if (dataJson.contains("result") && dataJson["result"].contains("status")) { + status = dataJson["result"]["status"]; + } + else if (dataJson.contains("status")) { + status = dataJson["status"]; + } + + { + std::string oldPrintFileName = device->m_print_filename; + device->updateByJsonData(status); + device->last_update = std::chrono::steady_clock::now(); + //cj_1 ӡļˣ´ӡ̶ϢļͼƬӡʱ + if (oldPrintFileName != device->m_print_filename) { + + std::string url = device->m_frp_url + "/api/qidiclient/files/list"; + Slic3r::Http httpPost = Slic3r::Http::get(url); + std::string resultBody; + bool su = false; + httpPost.timeout_max(5) + .header("accept", "application/json") + .header("Content-Type", "application/json") + .on_complete( + [&resultBody, &su](std::string body, unsigned status) { + + resultBody = body; + su = true; + } + ) + .on_error( + [this](std::string body, std::string error, unsigned status) { + + } + ).perform_sync(); + + try { + json bodyJson = json::parse(resultBody); + if (!bodyJson.is_object()) { + return ; + } + if (!bodyJson.contains("result")) { + return ; + } + json resultJson = bodyJson["result"]; + if (resultJson.is_array()) { + for (json printfFileData : resultJson) { + if (!printfFileData.is_object()) { + continue; + } + + //filepath + if (printfFileData.contains("filepath") && printfFileData["filepath"].is_string()) { + if (printfFileData["filepath"].get().find("/.cache/") != std::string::npos) { + continue; + } + } + else { + continue; + } + + if (printfFileData.contains("filename") && printfFileData["filename"].is_string()) { + std::string jsonFileName = from_u8(printfFileData["filename"].get()).ToStdString(); + + if (jsonFileName != device->m_print_filename) { + continue; + } + + } + else { + continue; + } + + if (printfFileData.contains("show_filament_weight") && printfFileData["show_filament_weight"].is_string()) + { + device->m_filament_weight = printfFileData["show_filament_weight"].get(); + } + + if (printfFileData.contains("show_print_time") && printfFileData["show_print_time"].is_string()) + { + device->m_print_total_time = printfFileData["show_print_time"].get(); + } + + std::string plateIndex = "1"; + if (printfFileData.contains("plates") && printfFileData["plates"].is_array()) + { + if (printfFileData["plates"].size() > 0 && printfFileData["plates"][0].contains("plate_index") + && printfFileData["plates"][0]["plate_index"].is_string()) + { + plateIndex = printfFileData["plates"][0]["plate_index"].get(); + } + } + + std::string pngUrl = ""; + pngUrl = device->m_frp_url + "/server/files/gcodes/.thumbs"; + pngUrl = pngUrl + from_u8( extractBetweenMarkers(printfFileData["filepath"].get())).ToStdString(); + pngUrl = "http://" + pngUrl + "/plate_"+ plateIndex +".png"; + device->m_print_png_url = pngUrl; + + } + } + } + catch (...) { + + } + + + + + } + } + + if (m_cur_deviceId == device_id && device->is_update) { + + GUI::wxGetApp().CallAfter([this, device_id]() { + this->updateDeviceParameter(device_id); + }); + + device->is_update = false; + + } + + } + catch (...) + { + + } + } + +//y74 +void PrinterWebView::InitDeviceManager(){ + m_device_manager = wxGetApp().qdsdevmanager; + + m_device_manager->setConnectionEventCallback([this](const std::string& device_id, std::string new_status){ + GUI::wxGetApp().CallAfter([this, device_id, new_status](){ + this->updateDeviceButton(device_id, new_status); + }); + }); + + m_device_manager->setParameterUpdateCallback([this](const std::string& device_id) { + GUI::wxGetApp().CallAfter([this, device_id]() { + this->updateDeviceParameter(device_id); + }); + }); + + m_device_manager->setDeviceConnectTypeUpdateCallback([this](const std::string& device_id, const std::string& device_ip){ + GUI::wxGetApp().CallAfter([this, device_id, device_ip](){ + this->updateDeviceConnectType(device_id, device_ip); + }); + }); + + m_device_manager->setDeleteDeviceIDCallback([this](const std::string& device_id){ + std::lock_guard lock(m_ui_map_mutex); + m_device_id_to_button.erase(device_id); + }); + + // m_device_manager->setFileInfoUpdateCallback([this](const std::string& device_id)){ + // GUI::wxGetApp().CallAfter([this, device_id]() { + // this->updateDeviceParameter(device_id); + // }); + // } +} + + +void PrinterWebView::initEventToTaskPath() +{ + m_eventToTaskPath = { + {EVTSET_EXTRUESION, "/set/extrusion"}, + {EVTSET_BACK, "/set/back"}, + {EVTSET_COOLER_SWITCH, "/set/cooler/switch"}, + {EVTSET_COOLER_ENABLE, "/set/cooler/enable"}, + {EVTSET_LEVELING_ENABLE, "/set/leveling/enable"}, + {EVTSET_AMS_ENABLE, "/set/ams/enable"}, + {EVTSET_COOLLINGFAN_SPEED, "/set/coolingFan/speed"}, + {EVTSET_CHAMBERFAN_SPEED, "/set/chamberFan/speed"}, + {EVTSET_AUXILIARYFAN_SPEED, "/set/auxiliaryFan/speed"}, + {EVTSET_CASE_LIGHT, "/set/case/light"}, + {EVTSET_BEEPER_SWITHC, "/set/beeper/switch"}, + {EVTSET_EXTRUDER_TEMPERATURE, "/set/extruder/temperature"}, + {EVTSET_HEATERBED_TEMPERATURE, "/set/heaterBed/temperature"}, + {EVTSET_CHAMBER_TEMPERATURE, "/set/chamber/temperature"}, + {EVTSET_RETURN_SAFEHOME, "/set/return/safeHome"}, + {EVTSET_X_AXIS, "/set/x/axis"}, + {EVTSET_Y_AXIS, "/set/y/axis"}, + {EVTSET_Z_AXIS, "/set/z/axis"}, + {EVTSET_PRINT_CONTROL, "/set/print/control"}, + {EVTSET_INSERT_READ, "/ams/insert/filament/read/enable"}, + {EVTSET_BOOT_READ, "/ams/boot/read/enable"}, + {EVTSET_AUTO_FILAMENT, "/ams/auto/filament/enable"} + }; + + //cj_1 + m_boxEventToTaskPath = { + {EVT_SET_COLOR,"/set/filament/color"}, + {EVTSET_FILAMENT_TYPE, "/set/filament/type"}, + {EVTSET_FILAMENT_VENDOR, "/set/filament/vendor"}, + {EVTSET_FILAMENT_LOAD, "/set/filament/load"}, + {EVTSET_FILAMENT_UNLOAD, "/set/filament/unload"} + }; + + //y76 + m_localEventToTaskPath = { + {EVTSET_EXTRUDER_TEMPERATURE, "SET_HEATER_TEMPERATURE HEATER=extruder TARGET=%d"}, + {EVTSET_HEATERBED_TEMPERATURE, "SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET=%d"}, + {EVTSET_CHAMBER_TEMPERATURE, "SET_HEATER_TEMPERATURE HEATER=chamber TARGET=%d"}, + {EVTSET_CASE_LIGHT, "SET_PIN PIN=caselight VALUE=%d"}, + {EVTSET_X_AXIS, "G91\nG1 X%d F7800\nG90"}, + {EVTSET_Y_AXIS, "G91\nG1 Y%d F7800\nG90"}, + {EVTSET_Z_AXIS, "G91\nG1 Z%d F600\nG90"}, + {EVTSET_RETURN_SAFEHOME, "G28" }, + {EVTSET_INSERT_READ, "SAVE_VARIABLE VARIABLE=auto_read_rfid VALUE=\"%d\""}, + {EVTSET_BOOT_READ, "SAVE_VARIABLE VARIABLE=auto_init_detect VALUE=\"%d\""}, + {EVTSET_AUTO_FILAMENT, "SAVE_VARIABLE VARIABLE=auto_reload_detect VALUE=\"%d\""}, + {EVTSET_COOLLINGFAN_SPEED, "SET_FAN_SPEED FAN=cooling_fan SPEED=%.2f"}, + {EVTSET_AUXILIARYFAN_SPEED, "SET_FAN_SPEED FAN=auxiliary_cooling_fan SPEED=%.2f"}, + {EVTSET_CHAMBERFAN_SPEED, "SET_FAN_SPEED FAN=chamber_circulation_fan SPEED=%.2f"} + + }; +} + +void PrinterWebView::bindTaskHandle() +{ + if (t_status_page == nullptr) { + return; + } + + // key-value + for (auto& pair : m_eventToTaskPath) { + const wxEventTypeTag< wxCommandEvent >eventType = pair.first; + t_status_page->Bind(eventType, &PrinterWebView::onStatusPanelTask, this); + + } +} + +// cj_1 +void PrinterWebView::HideDeviceButtons(std::vector& buttons) +{ + ShowDeviceButtons(buttons, false); +} + +void PrinterWebView::HideAllDeviceButtons() +{ + HideDeviceButtons(m_buttons); + HideDeviceButtons(m_net_buttons); +} + +void PrinterWebView::cancelAllDevButtonSelect() +{ + for (DeviceButton* button : m_buttons) { + button->SetIsSelected(false); + } + + for (DeviceButton* button : m_net_buttons) { + button->SetIsSelected(false); + } + +} + +// cj_1 +void PrinterWebView::clearStatusPanelData() +{ + t_status_page->update_temp_data("_", "_", "_"); + t_status_page->update_temp_target("_", "_", "_"); + t_status_page->pause_camera(); + t_status_page->update_camera_url(""); + t_status_page->set_default(); + t_status_page->update_thumbnail(""); +} + +//y76 +void PrinterWebView::pauseCamera(){ + t_status_page->pause_camera(); +} + +void PrinterWebView::ShowDeviceButtons(std::vector& buttons, bool isShow /*= true*/) +{ + if (buttons.empty()) { + BOOST_LOG_TRIVIAL(info) << " empty"; + } + else { + for (DeviceButton* button : buttons) { + if (isShow) { + button->Show(); + } + else { + button->Hide(); + } + } + } +} + +//y74 +void PrinterWebView::updateDeviceButton(const std::string& device_id, std::string new_status){ + DeviceButton* t_button = nullptr; + std::string t_printer_progress; + { + std::lock_guard lock(m_ui_map_mutex); + auto it = m_device_id_to_button.find(device_id); + if(it != m_device_id_to_button.end()){ + t_button = it->second; + if (new_status == "printing") { + t_printer_progress = " (" + m_device_manager->getDevice(device_id)->m_print_progress + "%) "; + } + } + } + + if(t_button != nullptr){ + t_button->SetStateText(new_status); + if(!t_printer_progress.empty()) + t_button->SetProgressText(t_printer_progress); + } + +} + + +//cj_1 +std::string extractEndNumbers(const std::string& str) { + size_t endPos = str.find_last_not_of("0123456789"); + + if (endPos == std::string::npos) { + // ַȫ + return str; + } + else if (endPos == str.length() - 1) { + // һַ + return ""; + } + else { + // ĩβֲ + return str.substr(endPos + 1); + } +} +void PrinterWebView::updateDeviceParameter(const std::string& device_id) { + DeviceButton* t_button = nullptr; + { + std::lock_guard lock(m_ui_map_mutex); + auto it = m_device_id_to_button.find(device_id); + if (it != m_device_id_to_button.end()) { + t_button = it->second; + } + if (m_cur_deviceId == device_id) { + t_status_page->update_temp_data( + m_device_manager->getDeviceTempNozzle(device_id), + m_device_manager->getDeviceTempBed(device_id), + m_device_manager->getDeviceTempChamber(device_id) + ); + + auto device = m_device_manager->getDevice(device_id); + if (device == nullptr) { + return; + } + t_status_page->update_temp_target(device->m_target_extruder, device->m_target_bed, device->m_target_chamber); + + t_status_page->update_temp_ctrl(device); + + int duration = 1; + if (!device->m_print_duration.empty()) { + duration = std::stoi(device->m_print_duration); + } + float progress = device->m_print_progress_float; + int totalTime = 0; + int remainTime = 0; + if (progress > 0 && progress < 1 && duration>0) { + totalTime = (double)duration / device->m_print_progress_float; + remainTime = totalTime - duration; + } + string layer = _L("Layer: N/A").ToStdString(); + if (device->m_print_total_layer != 0) { + layer = "Layer: " + std::to_string(device->m_print_cur_layer) + "/" + std::to_string(device->m_print_total_layer); + } + + std::string totalTimeStr = device->m_print_total_time; + std::string weight = device->m_filament_weight; + t_status_page->update_progress(device->m_print_filename, layer, totalTimeStr, weight, remainTime, progress); + t_status_page->update_print_status(device->m_status); + t_status_page->update_camera_url(device->m_frp_url + "/webcam/?action=snapshot"); + t_status_page->update_thumbnail(device->m_print_png_url); + t_status_page->update_light_status(device->m_case_light); + + /*FAN_COOLING_0_AIRDOOR = 1, + FAN_REMOTE_COOLING_0_IDX = 2, + FAN_CHAMBER_0_IDX = 3,*/ + + t_status_page->update_fan_speed(AIR_FUN::FAN_COOLING_0_AIRDOOR, device->m_cooling_fan_speed * 10.0); + t_status_page->update_fan_speed(AIR_FUN::FAN_REMOTE_COOLING_0_IDX, device->m_auxiliary_fan_speed * 10.0); + t_status_page->update_fan_speed(AIR_FUN::FAN_CHAMBER_0_IDX, device->m_chamber_fan_speed * 10.0); + + if(device->box_is_update){ + vector< Slic3r::GUI::Caninfo> cans(17); + for (int i = 0; i < 17; ++i) { + cans[i].can_id = std::to_string(i); + if (device->m_boxData[i].hasMaterial) { + cans[i].material_colour = wxColour(device->m_boxData[i].colorHexCode); + cans[i].material_name = device->m_boxData[i].name; + cans[i].material_state = AMSCanType::AMS_CAN_TYPE_VIRTUAL; + cans[i].ctype = device->m_boxData[i].vendor == "Generic" ? 0 : 1; + } + else { + cans[i].material_colour = *wxWHITE; + cans[i].material_state = AMSCanType::AMS_CAN_TYPE_EMPTY; + } + } + + Slic3r::GUI::AMSinfo amsExt; { + amsExt.ams_id = "11"; + amsExt.nozzle_id = 0; + amsExt.ams_type = AMSModel::EXT_AMS; + amsExt.current_step = AMSPassRoadSTEP::AMS_ROAD_STEP_NONE; + amsExt.cans = std::vector{ cans[16] }; + } + std::vector ext_info; + ext_info = std::vector{ amsExt }; + + + std::vector boxS; + for (int i = 0; i < device->m_box_count; ++i) { + AMSinfo ams; + ams.ams_id = std::to_string(i); + ams.nozzle_id = 0; + ams.humidity_raw = device->m_boxHumidity[i]; + ams.current_temperature = device->m_boxTemperature[i]; + ams.ams_type = AMSModel::N3F_AMS; + ams.current_step = AMSPassRoadSTEP::AMS_ROAD_STEP_NONE; + for (int j = i * 4; j < (i + 1) * 4; ++j) { + ams.cans.push_back(cans[j]); + } + boxS.push_back(ams); + } + + t_status_page->update_boxs(boxS, ext_info); + if(webisNetMode == isLocalWeb) + t_status_page->set_filament_config(device->m_general_filamentConfig); + else + t_status_page->set_filament_config(device->m_filamentConfig); + + + std::string slotNumSyncStr = extractEndNumbers(device->m_cur_slot); + if (slotNumSyncStr != "") { + t_status_page->update_cur_slot(std::stoi(slotNumSyncStr)); + } + t_status_page->update_AMSSettingData(device->m_auto_read_rfid, device->m_init_detect, device->m_auto_reload_detect); + + //cj_1 + t_status_page->update_homed_axes(device->m_home_axes); + + PresetBundle *preset_bundle = wxGetApp().preset_bundle; + if(preset_bundle){ + std::string cur_preset_name = wxGetApp().get_tab(Preset::TYPE_PRINTER)->get_presets()->get_edited_preset().name; + if(device->box_filament_is_update && cur_preset_name.find(device->m_type) != std::string::npos){ + wxGetApp().qdsdevmanager->upBoxInfoToBoxMsg(device); + device->box_filament_is_update = false; + } + } + device->box_is_update = false; + } + } + } +} + +void PrinterWebView::init_select_machine(){ + std::string last_select_machine = wxGetApp().app_config->get("last_selected_machine"); + if(last_select_machine.empty()) + return; + + bool is_net = wxGetApp().app_config->get_bool("last_sel_machine_is_net"); + + DeviceButton* selected_button {nullptr}; + if(is_net){ + for (DeviceButton* button : m_net_buttons){ + wxString button_name = button->getIPLabel(); + if(into_u8(button_name) == last_select_machine){ + selected_button = button; + break; + } + } + } else { + for (DeviceButton *button : m_buttons){ + wxString button_name = button->getIPLabel(); + if(into_u8(button_name) == last_select_machine){ + selected_button = button; + break; + } + } + } + + if (selected_button) { + if (is_net) { + wxEvtHandler* handler = selected_button->GetEventHandler(); + if (handler) + { + wxCommandEvent evt(wxEVT_BUTTON, selected_button->GetId()); + evt.SetEventObject(selected_button); + handler->ProcessEvent(evt); + } + } + else { + bool is_support_mqtt = wxGetApp().app_config->get_bool("is_support_mqtt"); + if (is_support_mqtt) { + clearStatusPanelData(); + cancelAllDevButtonSelect(); + selected_button->SetIsSelected(true); + for (auto it = m_device_id_to_button.begin(); it != m_device_id_to_button.end(); ++it) { + if (it->second == selected_button) { + m_cur_deviceId = it->first; + } + } + m_device_manager->setSelected(m_cur_deviceId); + m_device_manager->reconnectDevice(m_cur_deviceId); + this->webisNetMode = isLocalWeb; + UpdateState(); + m_status_book->ChangeSelection(1); + allsizer->Layout(); + if (wxGetApp().mainframe) { + wxGetApp().mainframe->is_webview = false; + } + m_ip = selected_button->getIPLabel(); + wxGetApp().app_config->set("machine_list_net", "0"); + } + else { + clearStatusPanelData(); + cancelAllDevButtonSelect(); + m_device_manager->unSelected(); + selected_button->SetIsSelected(true); + for (auto it = m_device_id_to_button.begin(); it != m_device_id_to_button.end(); ++it) { + if (it->second == selected_button) { + m_cur_deviceId = it->first; + } + } + this->webisNetMode = isLocalWeb; + UpdateState(); + m_status_book->ChangeSelection(0); + allsizer->Layout(); + FormatUrl(into_u8(last_select_machine)); + } + } + + } + +} + } // GUI } // Slic3r diff --git a/src/slic3r/GUI/PrinterWebView.hpp b/src/slic3r/GUI/PrinterWebView.hpp index 9b8fad4..d5943ca 100644 --- a/src/slic3r/GUI/PrinterWebView.hpp +++ b/src/slic3r/GUI/PrinterWebView.hpp @@ -42,12 +42,19 @@ #if QDT_RELEASE_TO_PUBLIC #include "../QIDI/QIDINetwork.hpp" #endif + #include + + +#include #include "./Widgets/SwitchButton.hpp" #include "./Widgets/DeviceButton.hpp" #include "OctoPrint.hpp" +#include "StatusPanel.hpp" +#include "QDSDeviceManager.hpp" + namespace Slic3r { namespace GUI { @@ -59,14 +66,12 @@ enum WebState isNetWeb }; - class PrinterWebView : public wxPanel { public: PrinterWebView(wxWindow *parent); virtual ~PrinterWebView(); wxBoxSizer *init_menu_bar(wxPanel *Panel); - wxBoxSizer *init_login_bar(wxPanel *Panel); void init_scroll_window(wxPanel *Panel); void CreatThread(); void load_url(wxString& url); @@ -74,13 +79,11 @@ public: void UpdateState(); void OnClose(wxCloseEvent& evt); - void OnZoomButtonClick(wxCommandEvent &event); void OnRefreshButtonClick(wxCommandEvent &event); void OnAddButtonClick(wxCommandEvent &event); void OnDeleteButtonClick(wxCommandEvent &event); void OnEditButtonClick(wxCommandEvent &event); - void OnLoginButtonClick(wxCommandEvent &event); void RunScript(const wxString &javascript); //void OnScriptMessageReceived(wxWebViewEvent &event); void OnScriptMessage(wxWebViewEvent &evt); @@ -88,6 +91,12 @@ public: void OnScroll(wxScrollWinEvent &event); void OnScrollup(wxScrollWinEvent &event); void OnScrolldown(wxScrollWinEvent &event); + + void onStatusPanelTask(wxCommandEvent& event); + //cj_1 + void onSetBoxTask(wxCommandEvent& event); + //cj_1 + void onRefreshRfid(wxCommandEvent& event); //void SendRecentList(int images); void SetButtons(std::vector buttons); void AddButton(const wxString & device_name, @@ -102,23 +111,12 @@ public: void ShowNetPrinterButton(); void ShowLocalPrinterButton(); #if QDT_RELEASE_TO_PUBLIC - void AddNetButton(const Device device); + void AddNetButton(const NetDevice device); #endif void DeleteNetButton(); void RefreshButton(); void SetUpdateHandler(const std::function &handler) { m_handlerl = handler; } - void StopStatusThread() - { - m_stopThread = true; - //y36 - OctoPrint::SetStop(true); - if (m_statusThread.joinable()) { - m_statusThread.join(); - } - OctoPrint::SetStop(false); - }; - void SetPauseThread(bool status) { m_pauseThread = status; }; void SetPresetChanged(bool status); void SetLoginStatus(bool status); std::string NormalizeVendor(const std::string& str); @@ -135,16 +133,43 @@ public: void load_disconnect_url(wxString& url); void FormatNetUrl(std::string link_url, std::string local_ip, bool isSpecialMachine); void FormatUrl(std::string link_url); - void SetToggleBar(bool is_net_mode); + + //y74 + QDSDeviceManager* m_device_manager; + + void onSSEMessageHandle(const std::string& event, const std::string& data); + + //y76 + void pauseCamera(); + +private: + // cj_1 + void HideDeviceButtons(std::vector& buttons); + void HideAllDeviceButtons(); + + // cj_1 + void cancelAllDevButtonSelect(); + + // cj_1 + void clearStatusPanelData(); + + void ShowDeviceButtons(std::vector& buttons, bool isShow = true); + + + void updateDeviceButton(const std::string& device_id, std::string new_status); + void updateDeviceParameter(const std::string& device_id); + void updateDeviceConnectType(const std::string& device_id, const std::string& device_ip); + void InitDeviceManager(); + void initEventToTaskPath(); + void bindTaskHandle(); + void init_select_machine(); private: wxBoxSizer *leftallsizer; wxBoxSizer * devicesizer; wxBoxSizer * allsizer; - bool m_isSimpleMode = false; bool m_isNetMode = false; - wxButton *arrow_button; int height = 0; wxString m_web; @@ -155,13 +180,12 @@ private: wxScrolledWindow * leftScrolledWindow; wxPanel * leftPanel; - + StatusPanel* t_status_page; std::vector m_buttons; std::vector m_net_buttons; + + std::string m_select_type; - std::thread m_statusThread; - std::atomic m_stopThread{false}; - std::atomic m_pauseThread{true}; wxWebView* m_browser; long m_zoomFactor; @@ -170,17 +194,29 @@ private: DeviceButton * delete_button; DeviceButton * edit_button; DeviceButton * refresh_button; - DeviceButton * login_button; bool m_isloginin; - DeviceSwitchButton* toggleBar; wxStaticBitmap * staticBitmap; std::map m_machine; - std::string select_machine_name; + std::string select_machine_name{ "" }; + //std::string m_teststr; + std::string m_cur_deviceId{ "" }; WebState webisNetMode = isDisconnect; std::set m_exit_host; - std::string m_user_head_name; //y33 bool m_isfluidd_1; //y35 + + //y74 + wxSimplebook* m_status_book; + std::mutex m_ui_map_mutex; + std::unordered_map m_device_id_to_button; + + std::map m_eventToTaskPath; + std::map m_boxEventToTaskPath; + std::map m_localEventToTaskPath; + std::string m_userInfo; + + std::vector m_net_devices; + }; // y13 diff --git a/src/slic3r/GUI/QDSDeviceManager.cpp b/src/slic3r/GUI/QDSDeviceManager.cpp new file mode 100644 index 0000000..460795a --- /dev/null +++ b/src/slic3r/GUI/QDSDeviceManager.cpp @@ -0,0 +1,1907 @@ +#include "QDSDeviceManager.hpp" +#include +#include +#include +#include "libslic3r/Utils.hpp" +#include "GUI_App.hpp" + +namespace Slic3r { +namespace GUI { + +std::string UrlEncodeForFilename(const std::string& input) { + std::ostringstream escaped; + escaped.fill('0'); + escaped << std::hex << std::uppercase; + + for (char c : input) { + unsigned char uc = static_cast(c); + + if ((uc >= 32 && uc <= 126) && + uc != '%' && + uc != '+' && + uc != ' ') { + escaped << c; + } + else if (c == '/') { + escaped << c; + } + else { + escaped << '%' << std::setw(2) << static_cast(uc); + } + } + return escaped.str(); +} + +namespace pt = boost::property_tree; +std::vector QDSDevice::m_general_filamentConfig; +bool QDSDevice::m_is_init_general = false; +std::mutex QDSDevice::m_general_mtx; + + +template +bool is_json_type(const json& j) +{ + if constexpr (std::is_same_v || + std::is_same_v || + std::is_same_v) { + return j.is_number_integer(); + } + else if constexpr (std::is_same_v || + std::is_same_v) { + return j.is_number_float(); + } + else if constexpr (std::is_same_v) { + return j.is_boolean(); + } + else if constexpr (std::is_same_v || + std::is_same_v) { + return j.is_string(); + } + else if constexpr (std::is_same_v) { + return true; + } + else { + return false; + } +} + +template +void twoStageParse1(const json& status, T& target, std::string first, std::string second, bool& is_update) +{ + if (status.contains(first) && status[first].is_object() + && status[first].contains(second) && is_json_type(status[first][second])) { + if (target != status[first][second].get()) { + target = status[first][second].get(); + is_update = true; + } + } +} + +//cj_1 +QDSFilamentConfig::QDSFilamentConfig() +{ + init(); +} + +QDSFilamentConfig::~QDSFilamentConfig() +{ + +} + + +std::string QDSFilamentConfig::getHexCode(int index) +{ + return getData(m_colorHexCode, index); +} + +int QDSFilamentConfig::getColorIndex(std::string hexCode) +{ + return getIndex(m_colorHexCode, hexCode) + 1; +} + +std::string QDSFilamentConfig::getcolorDes(int index) +{ + return getData(m_colorDes, index); +} + +std::string QDSFilamentConfig::getTypeName(int index) +{ + return getData(m_typeName, index); +} + +int QDSFilamentConfig::getTypeNameIndex(std::string typeName) +{ + return getIndex(m_typeName, typeName); +} + +std::string QDSFilamentConfig::getVendor(int index) +{ + return getData(m_vendor, index); +} + +int QDSFilamentConfig::getVendorIndex(std::string vendor) +{ + return getIndex(m_vendor, vendor); + +} + +std::string QDSFilamentConfig::getFilamentType(int index){ + return getData(m_filament_type, index); +} + +void QDSFilamentConfig::init() +{ + std::async(std::launch::async, [this]() { + initFilamentData(m_colorHexCode); + initFilamentData(m_colorDes); + initTypeName(); + initFilamentData(m_vendor); + initFilamentData(m_filament_type); + }); +} + + +void QDSFilamentConfig::initTypeName() +{ + std::string resultBody = MakerHttpHandle::getInstance().httpGetTask(Environment::TESTENV, m_typeName.path); + if (resultBody == "") { + return; + } + m_typeName.data.resize(100); + try { + json bodyJson = json::parse(resultBody); + if (!bodyJson.contains("data") || !bodyJson["data"].is_array()) { + return; + } + for (json data : bodyJson["data"]) { + if (!data.contains(m_typeName.name) + || !data[m_typeName.name].is_string()) { + continue; + } + if (!data.contains("filamentTypeId") + || !data["filamentTypeId"].is_number_integer()) { + continue; + } + int filamentTypeId = data["filamentTypeId"].get(); + if (filamentTypeId > 0) { + m_typeName.data[filamentTypeId] = data[m_typeName.name].get(); + } + } + + } + catch (...) { + + } +} + +void QDSFilamentConfig::initFilamentData(FilamentData& filamentData) +{ + std::string resultBody = MakerHttpHandle::getInstance().httpGetTask(Environment::TESTENV, filamentData.path); + if (resultBody == "") { + return; + } + try { + json bodyJson = json::parse(resultBody); + if (!bodyJson.contains("data") || !bodyJson["data"].is_array()) { + return; + } + for (json data : bodyJson["data"]) { + if (!data.contains(filamentData.name) + || !data[filamentData.name].is_string()) { + continue; + } + filamentData.data.push_back(data[filamentData.name].get()); + } + + } + catch (...) { + + } + +} + +std::string QDSFilamentConfig::getData(FilamentData filamentData, int index) +{ + if (index <0 ||index >= filamentData.data.size()) { + return ""; + } + return filamentData.data[index]; +} + +int QDSFilamentConfig::getIndex(FilamentData filementData, std::string name) +{ + int index = 0; + for (std::string data : filementData.data) { + if (name == data) { + return index; + } + ++index; + } + return -1; +} + +QDSDevice::QDSDevice(const std::string dev_id, const std::string& dev_name, const std::string& dev_ip, const std::string& dev_url, const std::string& dev_type) + : m_id(dev_id), m_name(dev_name), m_ip(dev_ip), m_type(dev_type) + , m_boxData(17), m_boxTemperature(4, 0.0), m_boxHumidity(4, 0) +{ + m_url = "ws://" + dev_ip + ":7125/websocket"; + last_update = std::chrono::steady_clock::now(); + + QDSDevice::initGeneralData(); + m_filamentConfig = m_general_filamentConfig; +} + +void QDSDevice::updateByJsonData(json& status) +{ + if (status.contains("print_stats") && status["print_stats"].contains("state")) { + + if (m_status != status["print_stats"]["state"].get()) { + is_update = true; + m_status = status["print_stats"]["state"].get(); + + // 处于未打印状态需要自己将打印信息恢复默认值 + if (m_status == "standby") { + m_print_progress = "N/A"; + m_print_filename = ""; + m_print_png_url = ""; + m_print_cur_layer = 0; + m_print_total_layer = 0; + m_print_progress_float = 0.0; + } + } + + } + if (status.contains("print_stats") && status["print_stats"].contains("info") + && status["print_stats"]["info"].contains("total_layer") && status["print_stats"]["info"]["total_layer"].is_number_integer()) + { + if (m_print_total_layer != status["print_stats"]["info"]["total_layer"].get()) { + is_update = true; + m_print_total_layer = status["print_stats"]["info"]["total_layer"].get(); + } + } + if (status.contains("print_stats") && status["print_stats"].contains("info") + && status["print_stats"]["info"].contains("current_layer") && status["print_stats"]["info"]["current_layer"].is_number_integer()) + { + if (m_print_cur_layer != status["print_stats"]["info"]["current_layer"].get()) { + is_update = true; + m_print_cur_layer = status["print_stats"]["info"]["current_layer"].get(); + } + } + + + twoStageParseIntToString(status, m_print_total_duration, "print_stats", "total_duration"); + twoStageParseIntToString(status, m_print_duration, "print_stats", "print_duration"); + twoStageParseIntToString(status, m_bed_temperature, "heater_bed", "temperature"); + twoStageParseIntToString(status, m_target_bed, "heater_bed", "target"); + twoStageParseIntToString(status, m_extruder_temperature, "extruder", "temperature"); + twoStageParseIntToString(status, m_target_extruder, "extruder", "target"); + twoStageParseIntToString(status, m_chamber_temperature, "heater_generic chamber", "temperature"); + twoStageParseIntToString(status, m_target_chamber, "heater_generic chamber", "target"); + + + if (status.contains("print_stats") && status["print_stats"].contains("filename")) { + + if (m_print_filename != status["print_stats"]["filename"].get()) { + is_update = true; + m_print_filename = status["print_stats"]["filename"].get(); + m_print_filename = wxString::FromUTF8(m_print_filename.c_str()).ToStdString(); + + } + + } + + if (status.contains("display_status") && status["display_status"].contains("progress")) { + + if (m_print_progress_float != status["display_status"]["progress"].get()) { + is_update = true; + m_print_progress_float = status["display_status"]["progress"].get(); + } + } + + if (status.contains("save_variables") && status["save_variables"].is_object()) { + updateBoxDataByJson(status); + } + + if (status.contains("output_pin caselight") && status["output_pin caselight"].contains("value")) { + + if (m_case_light != bool(status["output_pin caselight"]["value"].get())) { + is_update = true; + m_case_light = bool(status["output_pin caselight"]["value"].get()); + } + } + + + twoStageParse(status, m_auxiliary_fan_speed, "fan_generic auxiliary_cooling_fan", "speed"); + twoStageParse(status, m_chamber_fan_speed, "fan_generic chamber_circulation_fan", "speed"); + twoStageParse(status, m_cooling_fan_speed, "fan_generic cooling_fan", "speed"); + twoStageParse(status, m_home_axes, "toolhead", "homed_axes"); + + if (status.contains("output_pin Polar_cooler") && status["output_pin Polar_cooler"].contains("value")) { + + if (m_case_light != bool(status["output_pin Polar_cooler"]["value"].get())) { + is_update = true; + m_polar_cooler = bool(status["output_pin Polar_cooler"]["value"].get()); + } + } + + for (int i = 0; i < 4; ++i) { + std::string key = "aht20_f heater_box" + std::to_string(i + 1); + if (status.contains(key) ) { + if (status[key].contains("temperature")) { + if (m_boxTemperature[i] != int(status[key]["temperature"].get())) { + box_is_update = true; + m_boxTemperature[i] = int(status[key]["temperature"].get()); + } + } + if (status[key].contains("humidity")) { + if (m_boxHumidity[i] != status[key]["humidity"].get()) { + box_is_update = true; + m_boxHumidity[i] = status[key]["humidity"].get(); + + } + } + } + } + + +} + +void QDSDevice::updateBoxDataByJson(const json status) +{ + json saveVariables = status["save_variables"]; + for (int i = 0; i < 17; ++i) { + std::string serial = "slot" + std::to_string(i); + int filamentIndex = getJsonCurStageToInt(saveVariables, "filament_" + serial); + if (filamentIndex != -1) { + m_boxData[i].filament_idex = filamentIndex; + m_boxData[i].name = m_filamentConfig[filamentIndex].name; + m_boxData[i].type = m_filamentConfig[filamentIndex].type; + } + int vendorIndx = getJsonCurStageToInt(saveVariables, "vendor_" + serial); + if (vendorIndx != -1) { + m_boxData[i].vendor = m_filamentConfig[vendorIndx].vendor; + } + + int colorIndex = getJsonCurStageToInt(saveVariables, "color_" + serial); + if (colorIndex != -1) { + m_boxData[i].colorHexCode = m_filamentConfig[colorIndex].colorHexCode; + + } + if (i < 16) { + std::string box_stepper = "box_stepper " + serial; + if(status.contains(box_stepper)){ + if(status[box_stepper].contains("runout_button")){ + if(!status[box_stepper]["runout_button"].is_null()){ + int runout_value = status[box_stepper]["runout_button"].get(); + m_boxData[i].hasMaterial = (runout_value == 0) ? 1 : 0; + box_filament_is_update = true; + + } + else { + //m_boxData[i].hasMaterial = false; + } + } + else { + //m_boxData[i].hasMaterial = false; + } + } + else { + //m_boxData[i].hasMaterial = false; + } + } + } + + + + int isExit = getJsonCurStageToInt(saveVariables, "enable_box"); + if (isExit != -1) { + m_boxData[16].hasMaterial = bool(isExit); + } + int count = getJsonCurStageToInt(saveVariables, "box_count"); + if (count != -1) { + m_box_count = count; + } + + if (saveVariables.contains("slot_sync") && saveVariables["slot_sync"].is_string()) { + m_cur_slot = saveVariables["slot_sync"].get(); + } + + int autoReadInt = getJsonCurStageToInt(saveVariables, "auto_read_rfid"); + if (autoReadInt != -1) { + m_auto_read_rfid = bool(autoReadInt); + } + + int initDetctInt = getJsonCurStageToInt(saveVariables, "auto_init_detect"); + if (initDetctInt != -1) { + m_init_detect = bool(initDetctInt); + } + + int autoReloadInt = getJsonCurStageToInt(saveVariables, "auto_reload_detect"); + if (autoReloadInt != -1) { + m_auto_reload_detect = bool(autoReloadInt); + } + box_is_update = true; +} + +void QDSDevice::updateFilamentConfig() +{ + if (!m_is_init_filamentConfig) { + + std::lock_guard lock(m_config_mtx); + if (m_is_init_filamentConfig) { + return; + } + } + + auto future1 = std::async(std::launch::async, [this]() { + std::lock_guard lock(m_config_mtx); + std::string url = m_frp_url + "/api/qidiclient/config/offical_filament_list"; + Slic3r::Http httpPost = Slic3r::Http::get(url); + std::string resultBody; + httpPost.timeout_max(5) + .header("accept", "application/json") + .header("Content-Type", "application/json") + .on_complete( + [&resultBody](std::string body, unsigned status) { + resultBody = body; + } + ) + .on_error( + [this](std::string body, std::string error, unsigned status) { + + } + ).perform_sync(); + try { + json bodyJson = json::parse(resultBody); + if (!bodyJson.is_object()) { + return; + } + if (!bodyJson.contains("result")) { + return; + } + json resultJson = bodyJson["result"]; + if (!resultJson.is_object()) { + return; + } + auto parseToString = [&resultJson](std::string name, std::vector& data) { + if (!resultJson.contains(name) || !resultJson[name].is_object()) { + return; + } + data.resize(100); + for (auto& element : resultJson[name].items()) { + std::string key = element.key(); + int index = std::stoi(key); + data[index] = element.value().get(); + } + }; + auto parseToInt = [&resultJson](std::string name, std::vector& data) { + if (!resultJson.contains(name) || !resultJson[name].is_object()) { + return; + } + data.resize(100); + for (auto& element : resultJson[name].items()) { + std::string key = element.key(); + int index = std::stoi(key); + data[index] = element.value().get(); + } + }; + + std::vector names; + std::vector types; + std::vector colorHexCodes; + std::vector vendors; + parseToString("filament", names); + parseToString("type", types); + parseToString("colordict", colorHexCodes); + parseToString("vendor_list", vendors); + std::vector minTemps; + std::vector maxTemps; + std::vector boxMinTemps; + std::vector boxMaxTemps; + parseToInt("min_temp", minTemps); + parseToInt("max_temp", maxTemps); + parseToInt("box_min_temp", boxMinTemps); + parseToInt("box_max_temp", boxMaxTemps); + + if(minTemps.size() != m_filamentConfig.size() || maxTemps.size() != m_filamentConfig.size() || boxMinTemps.size() != m_filamentConfig.size() || boxMaxTemps.size() != m_filamentConfig.size()) + return; + for (int i = 1; i < m_filamentConfig.size(); ++i) { + m_filamentConfig[i].name = names[i]; + m_filamentConfig[i].type = types[i]; + m_filamentConfig[i].minTemp = minTemps[i]; + m_filamentConfig[i].maxTemp = maxTemps[i]; + m_filamentConfig[i].boxMinTemp = boxMinTemps[i]; + m_filamentConfig[i].boxMaxTemp = boxMaxTemps[i]; + + m_filamentConfig[i].vendor = vendors[i]; + m_filamentConfig[i].colorHexCode = colorHexCodes[i]; + } + m_is_init_filamentConfig = true; + + } + catch (...) { + + } + + + }); + + + +} + +bool QDSDevice::is_online(){ + return m_status!= "offline"; +} + +void QDSDevice::twoStageParseIntToString(const json& status, std::string& target, std::string first, std::string second) +{ + + if (status.contains(first) && status[first].contains(second)) { + if (target != std::to_string(status[first][second].get())) { + target = std::to_string(status[first][second].get()); + is_update = true; + } + } +} + +void QDSDevice::twoStageParseStringToString(const json& status, std::string& target, std::string first, std::string second) +{ + if (status.contains(first) && status[first].contains(second)) { + if (target != std::to_string(status[first][second].get())) { + target = status[first][second].get(); + is_update = true; + } + } +} + +template +void QDSDevice::twoStageParse(const json& status, T& target, std::string first, std::string second) +{ + bool temp_is_update = false; + twoStageParse1(status, target, first, second, temp_is_update); + if (temp_is_update) { + is_update = temp_is_update; + } +} + + + +int QDSDevice::getJsonCurStageToInt(const json& jsonData, std::string jsonName) +{ + if (!jsonData.contains(jsonName) || !jsonData[jsonName].is_number_integer()) { + return -1; + } + return jsonData[jsonName].get(); +} + +bool extractNumberWithSscanf(const std::string& str, int& result) { + return (sscanf(str.c_str(), "fila%d", &result) == 1); +} + +void QDSDevice::initGeneralData() +{ + if (QDSDevice::m_is_init_general) { + return; + } + std::lock_guard lock(QDSDevice::m_general_mtx); + if (QDSDevice::m_is_init_general) { + return; + } + + QDSDevice::m_general_filamentConfig.resize(100); + std::string cfg_path = Slic3r::resources_dir() + "/profiles/officiall_filas_list.cfg"; + pt::ptree pt; + try { + pt::ini_parser::read_ini(cfg_path, pt); + } + catch (const std::exception& e) { + std::cerr << "Error reading config file: " << e.what() << std::endl; + return ; + } + for (const auto& section : pt) { + std::string sectionName = section.first; + if (sectionName == "colordict") { + for (const auto& item : section.second) { + int index = std::stoi(item.first); + m_general_filamentConfig[index].colorHexCode = item.second.data(); + } + } + if (sectionName == "vendor_list") { + for (const auto& item : section.second) { + int index = std::stoi(item.first); + m_general_filamentConfig[index].vendor = item.second.data(); + } + } + + int filaIndex = 0; + if (!extractNumberWithSscanf(sectionName,filaIndex)) { + continue; + } + for (const auto& item : section.second) { + if (item.first == "filament") { + m_general_filamentConfig[filaIndex].name = item.second.data(); + } + if (item.first == "type") { + m_general_filamentConfig[filaIndex].type = item.second.data(); + + } + if (item.first == "min_temp") { + m_general_filamentConfig[filaIndex].minTemp = item.second.get_value(0); + } + if (item.first == "max_temp") { + m_general_filamentConfig[filaIndex].maxTemp = item.second.get_value(0); + + } + if (item.first == "box_min_temp") { + m_general_filamentConfig[filaIndex].boxMinTemp = item.second.get_value(0); + + } + if (item.first == "box_max_temp") { + m_general_filamentConfig[filaIndex].boxMaxTemp = item.second.get_value(0); + + } + } + } + + + QDSDevice::m_is_init_general = true; +} + +QDSDeviceManager::QDSDeviceManager() { + health_check_running_ = true; + health_check_thread_ = std::thread(&QDSDeviceManager::healthCheckLoop, this); +} + +QDSDeviceManager::~QDSDeviceManager() { + + health_check_running_ = false; + if (health_check_thread_.joinable()) { + health_check_thread_.join(); + } + stopAllConnection(); +} + +void QDSDeviceManager::healthCheckLoop() { + while (health_check_running_) { + std::this_thread::sleep_for(health_check_interval_); + + if (!health_check_running_) break; + + performHealthCheck(); + } +} + +void QDSDeviceManager::performHealthCheck() { + std::vector devices_to_reconnect; + + { + std::lock_guard lock(manager_mutex_); + auto now = std::chrono::steady_clock::now(); + + for (const auto& [device_id, device] : devices_) { + bool needs_reconnect = false; + std::string reason; + + if (device->is_selected.load()) { + if (device->m_status == "Unauthorized") + continue; + if (device->m_status == "offline" || device->m_status == "error") { + needs_reconnect = true; + reason = "status is " + device->m_status; + } + else if (std::chrono::duration_cast(now - device->last_update).count() > 60) { + needs_reconnect = true; + reason = "no update for " + + std::to_string(std::chrono::duration_cast(now - device->last_update).count()) + " seconds"; + std::cout << "device last update : " << (device->last_update).time_since_epoch().count() << std::endl; + std::cout << "now time is : " << now.time_since_epoch().count() << std::endl; + } + } + + if (needs_reconnect) { + std::cout << "[HealthCheck] Device " << device_id << "device name is " << device->m_name << " needs reconnect: " << reason << std::endl; + devices_to_reconnect.push_back(device_id); + } + } + } + + for (const auto& device_id : devices_to_reconnect) { + reconnectDevice(device_id); + } +} + +void QDSDeviceManager::reconnectDevice(const std::string& device_id) { + std::cout << "[HealthCheck] Reconnecting device " << device_id << "..." << std::endl; + + stopConnection(device_id); + + std::this_thread::sleep_for(std::chrono::milliseconds(500)); + + connectDevice(device_id); +} + +int QDSDeviceManager::generateDeviceID() { + static std::random_device rd; + static std::mt19937 gen(rd()); + static std::uniform_int_distribution<> distrib(1000, 9999); + return distrib(gen); +} + +std::shared_ptr QDSDeviceManager::getDevice(const std::string& device_id) { + std::lock_guard lock(manager_mutex_); + auto it = devices_.find(device_id); + return (it != devices_.end()) ? it->second : nullptr; +} + +std::shared_ptr QDSDeviceManager::getSelectedDevice(){ + std::lock_guard lock(manager_mutex_); + for(const auto& [device_id, device] : devices_){ + if(device->is_selected) + return device; + } + return nullptr; +} + +void QDSDeviceManager::stopConnection(const std::string& device_id) { + std::shared_ptr conn = nullptr; + { + std::lock_guard lock(manager_mutex_); + auto conn_it = connections_.find(device_id); + if (conn_it == connections_.end()) return; + conn = conn_it->second; + conn->stopping = true; + } + + int wait_count = 0; + while (conn && conn->processing_message && wait_count < 10) { + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + wait_count++; + } + + safeStopConnection(device_id); + + cleanupConnection(device_id); +} + +void QDSDeviceManager::safeStopConnection(const std::string& device_id) { + std::shared_ptr conn = nullptr; + + { + std::lock_guard lock(manager_mutex_); + auto conn_it = connections_.find(device_id); + if (conn_it == connections_.end()) return; + conn = conn_it->second; + } + + if (!conn || !conn->running) return; + + try { + websocketpp::lib::error_code ec; + + auto con = conn->client.get_con_from_hdl(conn->connection_hdl); + if (con && con->get_state() == websocketpp::session::state::open) { + conn->client.close(conn->connection_hdl, + websocketpp::close::status::going_away, + "Connection stopped by manager", ec); + if (ec) { + std::cout << "[Stop] Warning closing connection for device " + << device_id << ": " << ec.message() << std::endl; + } + } + + conn->client.stop(); + conn->running = false; + + } catch (const std::exception& e) { + std::cout << "[Stop] Exception while stopping client for device " + << device_id << ": " << e.what() << std::endl; + if (conn) { + conn->running = false; + } + } +} + +void QDSDeviceManager::cleanupConnection(const std::string& device_id) { + std::shared_ptr conn = nullptr; + + { + std::lock_guard lock(manager_mutex_); + auto conn_it = connections_.find(device_id); + if (conn_it == connections_.end()) return; + conn = conn_it->second; + connections_.erase(conn_it); + } + + std::cout << "[Manager] Starting cleanup for device " << device_id << std::endl; + + if (conn) { + std::thread& client_thread = conn->client_thread; + + if (client_thread.joinable()) { + try { + if (client_thread.joinable()) { + client_thread.join(); + } + } + catch (const std::system_error& e) { + std::cout << "[Cleanup] System error joining thread for device " + << device_id << ": " << e.what() + << " (code: " << e.code() << ")" << std::endl; + if (e.code() == std::errc::no_such_process || + e.code() == std::errc::invalid_argument) { + try { + if (client_thread.joinable()) { + client_thread.detach(); + } + } + catch (...) { + std::cout << "[Cleanup] Failed to detach thread for device " + << device_id << std::endl; + } + } + } + catch (const std::exception& e) { + std::cout << "[Cleanup] Error joining thread for device " + << device_id << ": " << e.what() << std::endl; + } + } + } + + std::cout << "[Manager] Device " << device_id << " connection cleaned up." << std::endl; +} + +std::string QDSDeviceManager::addDevice(const std::string& dev_name, const std::string& dev_ip, const std::string& dev_url, const std::string& dev_type) { + std::string device_id; + bool id_is_unique = false; + + { + std::lock_guard lock(manager_mutex_); + while (!id_is_unique) { + device_id = std::to_string(generateDeviceID()); + if (devices_.find(device_id) == devices_.end()) { + id_is_unique = true; + } + else { + std::cerr << "[Manager] Warning: Device ID " << device_id << " conflict, retrying." << std::endl; + } + } + + auto device = std::make_shared(device_id, dev_name, dev_ip, dev_url, dev_type); + device->m_frp_url = "http://" + dev_ip ; + + + + + devices_[device_id] = device; + + + std::cout << "[Manager] Device added: " << device_id << std::endl; + } + + std::thread([this, device_id]() { + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + connectDevice(device_id); + }).detach(); + + return device_id; +} + +bool QDSDeviceManager::addDevice(std::shared_ptr device) +{ + std::string device_id = device->m_id; + std::lock_guard lock(manager_mutex_); + if (devices_.find(device_id) != devices_.end()) { + std::cout << "device :" << device << "exit" << std::endl; + return false; + } + + devices_[device_id] = device; + return true; +} + +bool QDSDeviceManager::removeDevice(const std::string& device_id) { + bool removed = false; + disconnectDevice(device_id); + { + std::lock_guard lock(manager_mutex_); + removed = devices_.erase(device_id) > 0; + } + if (removed) { + auto callback = getDeleteDeviceIDCallback(); + if (callback) { + callback(device_id); + } + } + return removed; +} + +bool QDSDeviceManager::connectDevice(const std::string device_id) { + std::shared_ptr dev = getDevice(device_id); + if (!dev) { + std::cout << "[Connect] Error: Device " << device_id << " not found." << std::endl; + return false; + } + + disconnectDevice(device_id); + + std::shared_ptr connection = nullptr; + { + std::lock_guard lock(manager_mutex_); + connection = std::make_shared(); + connection->info = dev; + connections_[device_id] = connection; + } + + connection->client.init_asio(); + connection->client.clear_access_channels(websocketpp::log::alevel::all); + connection->client.clear_error_channels(websocketpp::log::elevel::all); + + std::weak_ptr weak_conn = connection; + + connection->client.set_open_handler([this, device_id, weak_conn](auto hdl) { + auto conn = weak_conn.lock(); + if (conn) { + conn->last_activity = std::chrono::steady_clock::now(); + } + onOpen(device_id, hdl); + }); + + connection->client.set_message_handler([this, device_id, weak_conn](auto hdl, auto msg) { + auto conn = weak_conn.lock(); + if (conn && !conn->stopping) { + conn->processing_message = true; + conn->message_processing_count++; + conn->last_activity = std::chrono::steady_clock::now(); + + try { + onMessage(device_id, hdl, msg); + } catch (...) { + } + + conn->message_processing_count--; + if (conn->message_processing_count == 0) { + conn->processing_message = false; + } + } + }); + + connection->client.set_close_handler([this, device_id, weak_conn](auto hdl) { + auto conn = weak_conn.lock(); + if (conn) { + conn->last_activity = std::chrono::steady_clock::now(); + } + std::cout << "[DEBUG] WebSocket closed for device: " << device_id << std::endl; + std::cout << "[DEBUG] Close code: " << conn->client.get_con_from_hdl(hdl)->get_remote_close_code() << std::endl; + std::cout << "[DEBUG] Close reason: " << conn->client.get_con_from_hdl(hdl)->get_remote_close_reason() << std::endl; + + onClose(device_id, hdl); + }); + + connection->client.set_fail_handler([this, device_id, weak_conn](auto hdl) { + auto conn = weak_conn.lock(); + if (conn) { + conn->last_activity = std::chrono::steady_clock::now(); + } + onFail(device_id, hdl); + }); + + try { + websocketpp::lib::error_code ec; + auto con = connection->client.get_connection(dev->m_url, ec); + if (ec) { + std::cout << "[Connect] Connection error for device " << device_id + << ": " << ec.message() << std::endl; + updateDeviceStatus(device_id, "offline"); + + std::lock_guard lock(manager_mutex_); + connections_.erase(device_id); + return false; + } + + connection->connection_hdl = con->get_handle(); + connection->running = true; + + connection->client.connect(con); + + connection->client_thread = std::thread([connection]() { + try { + connection->client.run(); + } catch (const websocketpp::exception& e) { + std::cout << "[WebSocket] Exception in client thread: " + << e.what() << std::endl; + } catch (const std::exception& e) { + std::cout << "[WebSocket] Exception in client thread: " + << e.what() << std::endl; + } + connection->running = false; + }); + + std::cout << "[Connect] Connecting to device " << device_id + << " (" << dev->m_name << ")..." << std::endl; + return true; + + } catch (const std::exception& e) { + std::cout << "[Connect] Exception while connecting to device " << device_id + << ": " << e.what() << std::endl; + updateDeviceStatus(device_id, "error"); + + std::lock_guard lock(manager_mutex_); + connections_.erase(device_id); + return false; + } +} + +bool QDSDeviceManager::disconnectDevice(const std::string& device_id) { + stopConnection(device_id); + return true; +} + +void QDSDeviceManager::onOpen(const std::string& device_id, websocketpp::connection_hdl hdl) { + std::cout << "[WS] Device " << device_id << " connected." << std::endl; + processConnectionStatus(device_id, "connected"); + + std::thread([this, device_id]() { + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + sendSubscribeMessage(device_id); + }).detach(); +} +void QDSDeviceManager::onMessage(const std::string& device_id, websocketpp::connection_hdl hdl, WebSocketClient::message_ptr msg) { + std::string msg_str; + try { + msg_str = msg->get_payload(); + + std::shared_ptr conn; + { + std::lock_guard lock(manager_mutex_); + auto conn_it = connections_.find(device_id); + if (conn_it == connections_.end() || conn_it->second->stopping) { + return; + } + } + + json message_json; + try { + message_json = json::parse(msg_str); + } catch (const json::parse_error& e) { + std::cout << "[Message] JSON parse error for device " << device_id + << ": " << e.what() << std::endl; + return; + } + + handleDeviceMessage(device_id, message_json); + + } catch (const std::exception& e) { +// std::cout << "[Message] Error in onMessage for device " << device_id +// << ": " << e.what() +// << ", message length: " << msg_str.length() << std::endl; + } +} + +void QDSDeviceManager::onClose(const std::string& device_id, websocketpp::connection_hdl hdl) { + std::cout << "[WS] Device " << device_id << " disconnected." << std::endl; + processConnectionStatus(device_id, "offline"); +} + +void QDSDeviceManager::onFail(const std::string& device_id, websocketpp::connection_hdl hdl) { + std::cout << "[WS] Device " << device_id << " connection failed." << std::endl; + processConnectionStatus(device_id, "offline"); +} + +void QDSDeviceManager::sendSubscribeMessage(const std::string& device_id) { + std::shared_ptr conn = nullptr; + { + std::lock_guard lock(manager_mutex_); + auto conn_it = connections_.find(device_id); + if (conn_it == connections_.end() || conn_it->second->stopping) { + return; + } + conn = conn_it->second; + } + + if (!conn) return; + + json subscribe_msg = { + {"id", std::atoi(device_id.c_str())}, + {"method", "printer.objects.subscribe"}, + {"jsonrpc", "2.0"}, + {"params", { + {"objects", { + // {"gcode", nullptr}, + // {"configfile", nullptr}, + // {"mcu", nullptr}, + // {"mcu mcu_box1", nullptr}, + // {"mcu THR", nullptr}, + // {"gcode_macro _KAMP_Settings", nullptr}, + // {"gcode_macro BED_MESH_CALIBRATE", nullptr}, + // {"gcode_macro PRINTER_PARAM", nullptr}, + // {"gcode_macro _CG28", nullptr}, + // {"gcode_macro save_zoffset", nullptr}, + // {"gcode_macro set_zoffset", nullptr}, + // {"gcode_macro CLEAR_NOZZLE_PLR", nullptr}, + // {"gcode_macro CLEAR_NOZZLE", nullptr}, + // {"gcode_macro SHAKE_OOZE", nullptr}, + // {"gcode_macro MOVE_TO_TRASH", nullptr}, + // {"gcode_macro EXTRUSION_AND_FLUSH", nullptr}, + // {"gcode_macro PRINT_START", nullptr}, + // {"gcode_macro ENABLE_ALL_SENSOR", nullptr}, + // {"gcode_macro DISABLE_ALL_SENSOR", nullptr}, + // {"gcode_macro AUTOTUNE_SHAPERS", nullptr}, + // {"gcode_macro M84", nullptr}, + // {"gcode_macro DETECT_INTERRUPTION", nullptr}, + // {"gcode_macro _HOME_X", nullptr}, + // {"gcode_macro _HOME_Y", nullptr}, + // {"gcode_macro _HOME_XY", nullptr}, + // {"gcode_macro SHAPER_CALIBRATE", nullptr}, + // {"gcode_macro PRINT_END", nullptr}, + // {"gcode_macro CANCEL_PRINT", nullptr}, + // {"gcode_macro PAUSE", nullptr}, + // {"gcode_macro RESUME_PRINT", nullptr}, + // {"gcode_macro RESUME", nullptr}, + // {"gcode_macro RESUME_1", nullptr}, + // {"gcode_macro M141", nullptr}, + // {"gcode_macro M191", nullptr}, + // {"gcode_macro M106", nullptr}, + // {"gcode_macro M107", nullptr}, + // {"gcode_macro M303", nullptr}, + // {"gcode_macro M900", nullptr}, + // {"gcode_macro M290", nullptr}, + // {"gcode_macro M901", nullptr}, + // {"gcode_macro M0", nullptr}, + // {"gcode_macro M25", nullptr}, + // {"gcode_macro M4029", nullptr}, + // {"gcode_macro move_screw1", nullptr}, + // {"gcode_macro move_screw2", nullptr}, + // {"gcode_macro move_screw3", nullptr}, + // {"gcode_macro move_screw4", nullptr}, + // {"gcode_macro M4030", nullptr}, + // {"gcode_macro M4031", nullptr}, + // {"gcode_macro CUT_FILAMENT_1", nullptr}, + // {"gcode_macro M603", nullptr}, + // {"gcode_macro M604", nullptr}, + // {"gcode_move", nullptr}, + // {"gcode_macro M109", nullptr}, + // {"exclude_object", nullptr}, + // {"gcode_macro G31", nullptr}, + // {"gcode_macro G32", nullptr}, + // {"gcode_macro G29", nullptr}, + // {"gcode_macro M204", nullptr}, + // {"gcode_macro BEEP", nullptr}, + // {"gcode_macro beep_on", nullptr}, + // {"gcode_macro beep_off", nullptr}, + // {"gcode_macro LED_ON", nullptr}, + // {"gcode_macro LED_OFF", nullptr}, + // {"gcode_macro GET_TIMELAPSE_SETUP", nullptr}, + // {"gcode_macro _SET_TIMELAPSE_SETUP", nullptr}, + // {"gcode_macro TIMELAPSE_TAKE_FRAME", nullptr}, + // {"gcode_macro _TIMELAPSE_NEW_FRAME", nullptr}, + // {"gcode_macro HYPERLAPSE", nullptr}, + // {"gcode_macro TIMELAPSE_RENDER", nullptr}, + // {"gcode_macro TEST_STREAM_DELAY", nullptr}, + // {"gcode_macro save_last_file", nullptr}, + // {"gcode_macro CLEAR_LAST_FILE", nullptr}, + // {"gcode_macro LOG_Z", nullptr}, + // {"gcode_macro RESUME_INTERRUPTED", nullptr}, + // {"stepper_enable", nullptr}, + // {"motion_report", nullptr}, + // {"query_endstops", nullptr}, + // {"box_extras", nullptr}, + // {"box_stepper slot0", nullptr}, + // {"box_stepper slot1", nullptr}, + // {"box_stepper slot2", nullptr}, + // {"box_stepper slot3", nullptr}, + // {"aht20_f heater_box1", nullptr}, + // {"heater_generic heater_box1", nullptr}, + // {"temperature_sensor heater_temp_a_box1", nullptr}, + // {"temperature_sensor heater_temp_b_box1", nullptr}, + // {"box_heater_fan heater_fan_a_box1", nullptr}, + // {"box_heater_fan heater_fan_b_box1", nullptr}, + // {"controller_fan board_fan_box1", nullptr}, + // {"heaters", nullptr}, + // {"heater_air", nullptr}, + // {"gcode_macro T0", nullptr}, + // {"gcode_macro T1", nullptr}, + // {"gcode_macro T2", nullptr}, + // {"gcode_macro T3", nullptr}, + // {"gcode_macro UNLOAD_T0", nullptr}, + // {"gcode_macro UNLOAD_T1", nullptr}, + // {"gcode_macro UNLOAD_T2", nullptr}, + // {"gcode_macro UNLOAD_T3", nullptr}, + // {"gcode_macro T4", nullptr}, + // {"gcode_macro T5", nullptr}, + // {"gcode_macro T6", nullptr}, + // {"gcode_macro T7", nullptr}, + // {"gcode_macro UNLOAD_T4", nullptr}, + // {"gcode_macro UNLOAD_T5", nullptr}, + // {"gcode_macro UNLOAD_T6", nullptr}, + // {"gcode_macro UNLOAD_T7", nullptr}, + // {"gcode_macro T8", nullptr}, + // {"gcode_macro T9", nullptr}, + // {"gcode_macro T10", nullptr}, + // {"gcode_macro T11", nullptr}, + // {"gcode_macro UNLOAD_T8", nullptr}, + // {"gcode_macro UNLOAD_T9", nullptr}, + // {"gcode_macro UNLOAD_T10", nullptr}, + // {"gcode_macro UNLOAD_T11", nullptr}, + // {"gcode_macro T12", nullptr}, + // {"gcode_macro T13", nullptr}, + // {"gcode_macro T14", nullptr}, + // {"gcode_macro T15", nullptr}, + // {"gcode_macro UNLOAD_T12", nullptr}, + // {"gcode_macro UNLOAD_T13", nullptr}, + // {"gcode_macro UNLOAD_T14", nullptr}, + // {"gcode_macro UNLOAD_T15", nullptr}, + // {"gcode_macro UNLOAD_FILAMENT", nullptr}, + // {"pause_resume", nullptr}, + // {"filament_switch_sensor filament_switch_sensor", nullptr}, + // {"bed_screws", nullptr}, + // {"tmc2209 extruder", nullptr}, + // {"z_tilt", nullptr}, + // {"tmc2240 stepper_x", nullptr}, + // {"tmc2240 stepper_y", nullptr}, + // {"tmc2209 stepper_z1", nullptr}, + // {"tmc2209 stepper_z", nullptr}, + // {"temperature_sensor Chamber_Thermal_Protection_Sensor", nullptr}, + {"fan_generic chamber_circulation_fan", nullptr}, + // {"controller_fan chamber_fan", nullptr}, + // {"heater_fan hotend_fan", nullptr}, + {"fan_generic cooling_fan", nullptr}, + // {"controller_fan board_fan", nullptr}, + {"fan_generic auxiliary_cooling_fan", nullptr}, + {"output_pin Polar_cooler", nullptr}, + // {"output_pin beeper", nullptr}, + // {"probe", nullptr}, + // {"probe_air", nullptr}, + // {"bed_mesh", nullptr}, + // {"idle_timeout", nullptr}, + // {"system_stats", nullptr}, + // {"manual_probe", nullptr}, + {"print_stats", nullptr}, + {"display_status", nullptr}, + // {"webhooks", nullptr}, + // {"virtual_sdcard", nullptr}, + // {"toolhead", nullptr}, + {"heater_bed", nullptr}, + {"extruder", nullptr}, + {"heater_generic chamber", nullptr}, + {"output_pin caselight", nullptr}, + {"save_variables", nullptr}, + { "aht20_f heater_box1",nullptr }, + { "aht20_f heater_box2",nullptr }, + { "aht20_f heater_box3",nullptr }, + { "aht20_f heater_box4",nullptr }, + {"box_stepper slot0", nullptr}, + {"box_stepper slot1", nullptr}, + {"box_stepper slot2", nullptr}, + {"box_stepper slot3", nullptr}, + {"box_stepper slot4", nullptr}, + {"box_stepper slot5", nullptr}, + {"box_stepper slot6", nullptr}, + {"box_stepper slot7", nullptr}, + {"box_stepper slot8", nullptr}, + {"box_stepper slot9", nullptr}, + {"box_stepper slot10", nullptr}, + {"box_stepper slot11", nullptr}, + {"box_stepper slot12", nullptr}, + {"box_stepper slot13", nullptr}, + {"box_stepper slot14", nullptr}, + {"box_stepper slot15", nullptr}, + {"box_stepper slot16", nullptr} + }} + }} + }; + + + + try { + websocketpp::lib::error_code ec; + conn->client.send(conn->connection_hdl, + subscribe_msg.dump(), + websocketpp::frame::opcode::text, + ec); + if (ec) { + std::cout << "[Send] Error sending subscribe to " << device_id + << ": " << ec.message() << std::endl; + } else { + std::cout << "[Send] Sent subscribe message to " << device_id << std::endl; + } + } catch (const std::exception& e) { + std::cout << "[Send] Exception sending to device " << device_id + << ": " << e.what() << std::endl; + } + + + subscribe_msg = { + {"id", std::atoi(device_id.c_str())}, + {"method", "server.files.get_directory"}, + {"jsonrpc", "2.0"}, + {"params", { + {"root", "gcodes"}, + {"path", "gcodes"}, + {"extended", true} + }} + }; + + + try { + websocketpp::lib::error_code ec; + conn->client.send(conn->connection_hdl, + subscribe_msg.dump(), + websocketpp::frame::opcode::text, + ec); + if (ec) { + std::cout << "[Send] Error sending subscribe to " << device_id + << ": " << ec.message() << std::endl; + } else { + std::cout << "[Send] Sent subscribe message to " << device_id << std::endl; + } + } catch (const std::exception& e) { + std::cout << "[Send] Exception sending to device " << device_id + << ": " << e.what() << std::endl; + } + +} + +void QDSDeviceManager::sendCommand(const std::string& device_id, const std::string& script){ + std::shared_ptr conn = nullptr; + { + std::lock_guard lock(manager_mutex_); + auto conn_it = connections_.find(device_id); + if (conn_it == connections_.end() || conn_it->second->stopping) { + return; + } + conn = conn_it->second; + } + + if (!conn) return; + + json subscribe_msg = { + {"id", std::atoi(device_id.c_str())}, + {"method", "printer.gcode.script"}, + {"jsonrpc", "2.0"}, + {"params", { + {"script", script} + }} + }; + + try { + websocketpp::lib::error_code ec; + conn->client.send(conn->connection_hdl, + subscribe_msg.dump(), + websocketpp::frame::opcode::text, + ec); + if (ec) { + std::cout << "[Send] Error sending subscribe to " << device_id + << ": " << ec.message() << std::endl; + } else { + std::cout << "[Send] Sent subscribe message to " << device_id << std::endl; + } + } catch (const std::exception& e) { + std::cout << "[Send] Exception sending to device " << device_id + << ": " << e.what() << std::endl; + } +} + +void QDSDeviceManager::sendActionCommand(const std::string& device_id, const std::string& action_type){ + std::shared_ptr conn = nullptr; + { + std::lock_guard lock(manager_mutex_); + auto conn_it = connections_.find(device_id); + if (conn_it == connections_.end() || conn_it->second->stopping) { + return; + } + conn = conn_it->second; + } + + if (!conn) return; + + std::string script = "printer.print."; + json subscribe_msg = { + {"id", std::atoi(device_id.c_str())}, + {"method", script + action_type}, + {"jsonrpc", "2.0"} + }; + + try { + websocketpp::lib::error_code ec; + conn->client.send(conn->connection_hdl, + subscribe_msg.dump(), + websocketpp::frame::opcode::text, + ec); + if (ec) { + std::cout << "[Send] Error sending subscribe to " << device_id + << ": " << ec.message() << std::endl; + } else { + std::cout << "[Send] Sent subscribe message to " << device_id << std::endl; + } + } catch (const std::exception& e) { + std::cout << "[Send] Exception sending to device " << device_id + << ": " << e.what() << std::endl; + } +} + +void QDSDeviceManager::handleDeviceMessage(const std::string& device_id, const json& message) { + std::shared_ptr device = getDevice(device_id); + if (!device) { + return; + } + + if (device->should_stop.load()) { + std::thread([this, device_id]() { + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + removeDevice(device_id); + }).detach(); + return; + } else if(!device->is_first_connect.load() && !device->is_selected.load()){ + std::thread([this, device_id]() { + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + stopConnection(device_id); + }).detach(); + } + + updateDeviceMsg(device_id, message); +} + +void QDSDeviceManager::updateDeviceMsg(const std::string& device_id, const json& message) { + std::string new_status; + bool is_update = false; + bool is_file_info_update = false; + std::shared_ptr device = nullptr; + + { + std::lock_guard lock(manager_mutex_); + auto dev_it = devices_.find(device_id); + if (dev_it == devices_.end()) { + return; + } + device = dev_it->second; + + if(!device->is_first_connect.load() && !device->is_selected.load()) + return; + + if (message.contains("method") && message.contains("params")) { + if (message.at("method").get() == "notify_proc_stat_update" && + device->is_first_connect && + message.at("params").is_array()) { + + const json& result = message.at("params").at(0); + + if(result.contains("config_items")){ + device->m_polar_cooler = result["config_items"]["printing.polar_cooler"].get() == "1" ? true : false; + } + + if (result.contains("mqtt_state")) { + device->is_first_connect = false; + device->is_support_mqtt = true; + auto callback = getDeviceConnectTypeUpdateCallback(); + if (callback) { + callback(device_id, device->m_ip); + } + } else { + device->is_first_connect = false; + device->is_support_mqtt = false; + } + } + } + + if (message.contains("result")) { + if(message.at("result").contains("files")){ + const json& result = message.at("result"); + updateDeviceFileInfo(device, result); + //is_file_info_update = true; + } + if(message.at("result").contains("status")){ + const json& result = message.at("result").at("status"); + updateDeviceData(device, result, new_status, is_update); + } + } + + + if(message.contains("method")){ + if(message.at("method").get() == "notify_history_changed"){ + updatePrintThumbUrl(device, message); + } + } + + // if(message.contains("method")){ + // if(message.at("method").get() == "notify_filelist_changed"){ + + // } + // } + + if (message.contains("method") && + message.at("method").get() == "notify_status_update" && + message.at("params").is_array() && + !message.at("params").empty()) { + + const json& result = message.at("params").at(0); + updateDeviceData(device, result, new_status, is_update); + } + + if (message.contains("error") && + message["error"].contains("message") && + message["error"]["message"] == "Unauthorized") { + device->m_status = "Unauthorized"; + new_status = "Unauthorized"; + } + + if (is_update) { + device->last_update = std::chrono::steady_clock::now(); + } + } + + if (!new_status.empty()) { + updateDeviceStatus(device_id, new_status); + } + + if (is_update) { + auto callback = getParameterUpdateCallback(); + if (callback) { + callback(device_id); + } + } + + if(is_file_info_update){ + auto callback = getFileInfoUpdateCallback(); + if(callback) + callback(device_id); + } + + if (device && !device->is_first_connect && !device->is_support_mqtt) { + device->should_stop = true; + } +} + +void QDSDeviceManager::updateDeviceData(std::shared_ptr& device, + const json& result, + std::string& new_status, + bool& is_update) { + if (result.contains("print_stats") && + result["print_stats"].contains("state")) { + std::string status = result["print_stats"]["state"].get(); + if (status != device->m_status) { + device->m_status = status; + new_status = status; + } + } + + if(result.contains("save_variables")){ + device->updateBoxDataByJson(result); + } + + if (result.contains("heater_bed")){ + if(result["heater_bed"].contains("temperature")) { + device->m_bed_temperature = std::to_string( + result["heater_bed"]["temperature"].get()); + is_update = true; + } + if(result["heater_bed"].contains("target")) { + device->m_target_bed = std::to_string( + result["heater_bed"]["target"].get()); + is_update = true; + } + } + + if (result.contains("extruder")){ + if(result["extruder"].contains("temperature")) { + device->m_extruder_temperature = std::to_string( + result["extruder"]["temperature"].get()); + is_update = true; + } + if(result["extruder"].contains("target")) { + device->m_target_extruder = std::to_string( + result["extruder"]["target"].get()); + is_update = true; + } + } + + if (result.contains("heater_generic chamber")){ + if(result["heater_generic chamber"].contains("temperature")) { + device->m_chamber_temperature = std::to_string( + result["heater_generic chamber"]["temperature"].get()); + is_update = true; + } + if(result["heater_generic chamber"].contains("target")) { + device->m_target_chamber = std::to_string( + result["heater_generic chamber"]["target"].get()); + is_update = true; + } + } + + if (result.contains("display_status") && + result["display_status"].contains("progress")) { + device->m_print_progress = std::to_string( + result["display_status"]["progress"].get()); + is_update = true; + } + + if(result.contains("output_pin caselight")){ + device->m_case_light = result["output_pin caselight"]["value"].get() > 0 ? true : false; + is_update = true; + } + + for (int i = 0; i < 4; ++i) { + std::string key = "aht20_f heater_box" + std::to_string(i + 1); + if (result.contains(key)) { + if (result[key].contains("temperature")) { + + if (device->m_boxTemperature[i] != int(result[key]["temperature"].get())) { + device->box_is_update = true; + device->m_boxTemperature[i] = int(result[key]["temperature"].get()); + } + } + if (result[key].contains("humidity")) { + if (device->m_boxHumidity[i] != result[key]["humidity"].get()) { + device->box_is_update = true; + device->m_boxHumidity[i] = result[key]["humidity"].get(); + + } + } + } + } + + twoStageParse1(result, device->m_auxiliary_fan_speed, "fan_generic auxiliary_cooling_fan", "speed",is_update); + twoStageParse1(result, device->m_chamber_fan_speed, "fan_generic chamber_circulation_fan", "speed", is_update); + twoStageParse1(result, device->m_cooling_fan_speed, "fan_generic cooling_fan", "speed", is_update); + + if (result.contains("print_stats")){ + if(result["print_stats"].contains("filename")) { + if (device->m_print_filename != result["print_stats"]["filename"].get()) { + is_update = true; + device->m_print_filename = result["print_stats"]["filename"].get(); + } + } + } + + if (result.contains("display_status")){ + if(result["display_status"].contains("progress")) { + if (device->m_print_progress_float != result["display_status"]["progress"].get()) { + is_update = true; + device->m_print_progress_float = result["display_status"]["progress"].get(); + } + } + } + + if (result.contains("print_stats")){ + if (result["print_stats"].contains("info")) { + if (result["print_stats"]["info"].contains("total_layer") && result["print_stats"]["info"]["total_layer"].is_number_integer()) { + if (device->m_print_total_layer != result["print_stats"]["info"]["total_layer"].get()) { + is_update = true; + device->m_print_total_layer = result["print_stats"]["info"]["total_layer"].get(); + } + } + } + } + + if (result.contains("print_stats")){ + if(result["print_stats"].contains("info") + && result["print_stats"]["info"].contains("current_layer")){ + if (device->m_print_cur_layer != result["print_stats"]["info"]["current_layer"].get()) { + is_update = true; + device->m_print_cur_layer = result["print_stats"]["info"]["current_layer"].get(); + } + } + } + + if(result.contains("print_stats")){ + if(result["print_stats"].contains("print_duration")) { + if (device->m_print_duration != std::to_string(result["print_stats"]["print_duration"].get())) { + is_update = true; + device->m_print_duration = std::to_string(result["print_stats"]["print_duration"].get()); + if(device->m_print_png_url.empty()) + updatePrintThumbUrlWithOutMsg(device); + } + } + } + + if(result.contains("print_stats")){ + if(result["print_stats"].contains("total_duration")) { + if (device->m_print_total_duration != std::to_string(result["print_stats"]["total_duration"].get())) { + is_update = true; + device->m_print_total_duration = std::to_string(result["print_stats"]["total_duration"].get()); + } + } + } + + +} + +void QDSDeviceManager::updateDeviceFileInfo(std::shared_ptr& device, const json& result){ + device->file_info.clear(); + auto files = result.at("files"); + for(auto file : files){ + FileInfo file_info; + file_info.file_name = file["filename"]; + file_info.filament_weight = std::to_string(file["filament_weight_total"].get()); + file_info.print_time = get_qdt_monitor_time_dhm(file["estimated_time"].get()); + file_info.modified_time = file["modified"]; + file_info.thumb_url = UrlEncodeForFilename(file["thumbnails"][0]["relative_path"]); + device->file_info.emplace_back(file_info); + } +} + +void QDSDeviceManager::updatePrintThumbUrl(std::shared_ptr& device, const json& message){ + const json& result = message.at("params")[0]; + if(result["action"] == "added"){ + device->m_print_filename = result["job"]["filename"]; + std::string thumb_path = result["job"]["metadata"]["thumbnails"]["relative_path"]; + device->m_print_png_url = device->m_frp_url + "/server/files/gcodes/" + thumb_path; + } else if(result["action"] == "finished"){ + device->m_print_filename = ""; + device->m_print_png_url = ""; + } +} + +void QDSDeviceManager::updatePrintThumbUrlWithOutMsg(std::shared_ptr& device){ + if(!device->file_info.empty() && device->m_print_png_url.empty()){ + std::string print_file_name = device->m_print_filename; + std::vector files_info = device->file_info; + for(auto file_ : files_info){ + if(file_.file_name == print_file_name) + device->m_print_png_url = device->m_frp_url + "/server/files/gcodes/" + file_.thumb_url; + } + } +} + +void QDSDeviceManager::updateDeviceStatus(const std::string& device_id, std::string new_status) { + bool should_callback = false; + + { + std::lock_guard lock(manager_mutex_); + auto dev_it = devices_.find(device_id); + if (dev_it != devices_.end()) { + if (!new_status.empty()) { + dev_it->second->m_status = new_status; + should_callback = true; + } + } + } + + if (should_callback) { + auto callback = getConnectionEventCallback(); + if (callback) { + callback(device_id, new_status); + } + } +} + +void QDSDeviceManager::processConnectionStatus(const std::string& device_id, + const std::string& status) { + updateDeviceStatus(device_id, status); +} + +void QDSDeviceManager::stopAllConnection() { + std::vector device_ids; + + { + std::lock_guard lock(manager_mutex_); + if (connections_.empty()) return; + + for (const auto& pair : connections_) { + device_ids.push_back(pair.first); + } + } + + for (const auto& device_id : device_ids) { + disconnectDevice(device_id); + } + + { + std::lock_guard lock(manager_mutex_); + devices_.clear(); + } +} + +std::string QDSDeviceManager::getDeviceTempNozzle(const std::string& deviceId) +{ + std::lock_guard lock(manager_mutex_); + auto dev_it = devices_.find(deviceId); + return (dev_it != devices_.end()) ? dev_it->second->m_extruder_temperature : "0.0"; +} + +std::string QDSDeviceManager::getDeviceTempBed(const std::string& deviceId) +{ + std::lock_guard lock(manager_mutex_); + auto dev_it = devices_.find(deviceId); + return (dev_it != devices_.end()) ? dev_it->second->m_bed_temperature : "0.0"; +} + +std::string QDSDeviceManager::getDeviceTempChamber(const std::string& deviceId) +{ + std::lock_guard lock(manager_mutex_); + auto dev_it = devices_.find(deviceId); + return (dev_it != devices_.end()) ? dev_it->second->m_chamber_temperature : "0.0"; +} + +void QDSDeviceManager::setSelected(const std::string& device_id){ + std::shared_ptr device = nullptr; + { + std::lock_guard lock(manager_mutex_); + for (auto [device_id, device] : devices_) { + device->is_selected = false; + } + + auto dev_it = devices_.find(device_id); + if (dev_it == devices_.end()) { + return; + } + device = dev_it->second; + device->is_selected = true; + } +} + +void QDSDeviceManager::unSelected(){ + std::lock_guard lock(manager_mutex_); + for (auto [device_id, device] : devices_) { + device->is_selected = false; + } +} + +//y76 +void QDSDeviceManager::setNetDevices(std::vector devices){ + std::lock_guard lock(manager_mutex_); + net_devices = devices; +} + +std::vector QDSDeviceManager::getNetDevices(){ + std::lock_guard lock(manager_mutex_); + return net_devices; +} + +void QDSDeviceManager::upBoxInfoToBoxMsg(std::shared_ptr& device){ + std::vector slot_state(17); + std::vector slot_id(17); + std::vector filament_id(17); + std::vector filament_colors(17); + std::vector filament_type(17); + std::string box_list_preset_name; + int box_count = 0; + int auto_reload_detect = 0; + + if(device == nullptr) + return; + + std::unordered_map mapping = { + {"X-Plus 4", "0"}, + {"Q2", "1"}, + {"Q2C", "2"}, + {"X-Max 4", "3"} + }; + { + std::lock_guard lock(manager_mutex_); + GUI::wxGetApp().sidebar().update_sync_status(device); + for(int i = 0; i < 17; ++i){ + if(device->m_boxData[i].hasMaterial){ + slot_state[i] = device->m_boxData[i].hasMaterial; + slot_id[i] = i; + filament_type[i] = device->m_boxData[i].type; + filament_colors[i] = device->m_boxData[i].colorHexCode; + + std::string slot_vendor = device->m_boxData[i].vendor; + + std::string test_type = mapping[device->m_type]; + std::string test_vendor = slot_vendor == "QIDI" ? "1" : "0"; + std::string tset_idx = std::to_string(device->m_boxData[i].filament_idex); + std::string test_id = "QD_" + test_type + "_" + test_vendor + "_" + tset_idx; + filament_id[i] = test_id; + } + } + box_count = device->m_box_count; + auto_reload_detect = device->m_auto_reload_detect; + box_list_preset_name = device->m_type; + wxGetApp().plater()->sidebar().box_list_printer_ip = device->m_ip; + } + + wxGetApp().plater()->box_msg.slot_state = slot_state; + wxGetApp().plater()->box_msg.filament_id = filament_id; + wxGetApp().plater()->box_msg.filament_colors = filament_colors; + wxGetApp().plater()->box_msg.box_count = box_count; + wxGetApp().plater()->box_msg.filament_type = filament_type; + wxGetApp().plater()->box_msg.slot_id = slot_id; + wxGetApp().plater()->box_msg.auto_reload_detect = auto_reload_detect; + wxGetApp().plater()->box_msg.box_list_preset_name = box_list_preset_name; + + GUI::wxGetApp().sidebar().load_box_list(); +} + +}} \ No newline at end of file diff --git a/src/slic3r/GUI/QDSDeviceManager.hpp b/src/slic3r/GUI/QDSDeviceManager.hpp new file mode 100644 index 0000000..da202e6 --- /dev/null +++ b/src/slic3r/GUI/QDSDeviceManager.hpp @@ -0,0 +1,346 @@ +#ifndef QDSDEVICEMANAGER_H +#define QDSDEVICEMANAGER_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if QDT_RELEASE_TO_PUBLIC +#include "../QIDI/QIDINetwork.hpp" +#endif + +#include "nlohmann/json.hpp" + +using namespace nlohmann; + +namespace Slic3r { +namespace GUI{ + + +struct FileInfo { + std::string file_name; + std::string filament_weight; + std::string print_time; + double modified_time; + std::string thumb_url; +}; + + +// cj_1 +class QDSFilamentConfig +{ +private: + struct FilamentData + { + std::string path; + std::string name; + std::vector data; + }; +public: + static QDSFilamentConfig& getInstance() { + static QDSFilamentConfig instance; + return instance; + } + + std::string getHexCode(int index); + int getColorIndex(std::string hexCode); + + std::string getcolorDes(int index); + std::string getTypeName(int index); + std::string getFilamentType(int index); + int getTypeNameIndex(std::string typeName); + + std::string getVendor(int index); + int getVendorIndex(std::string vendor); + +private: + void init(); + void initTypeName(); + void initFilamentData(FilamentData& filamentData); + + std::string getData(FilamentData filamentData, int index); + int getIndex(FilamentData filementData, std::string name); + +public: + FilamentData m_colorHexCode{ "/backend/v1/setting/filament/color/all","hexCode" }; + FilamentData m_colorDes{ "/backend/v1/setting/filament/color/all","description" }; + FilamentData m_typeName{ "/backend/v1/setting/filament/material/all","filamentTypeName" }; + FilamentData m_vendor{ "/backend/v1/setting/filament/vendor/all","vendor" }; + FilamentData m_filament_type{ "/backend/v1/setting/filament/vendor/all", "type"}; + +private: + QDSFilamentConfig(); + ~QDSFilamentConfig(); + + QDSFilamentConfig(const QDSFilamentConfig&) = delete; + QDSFilamentConfig& operator=(const QDSFilamentConfig&) = delete; + QDSFilamentConfig(QDSFilamentConfig&&) = delete; + QDSFilamentConfig& operator=(QDSFilamentConfig&&) = delete; + +}; + + + +class QDSDevice{ +public: + struct Filament { + bool hasMaterial{ false }; + int filament_idex; + std::string name; + std::string vendor; + std::string colorHexCode; + int minTemp; + int maxTemp; + int boxMinTemp; + int boxMaxTemp; + std::string type; + }; +public: + QDSDevice(const std::string dev_id, const std::string& dev_name, const std::string& dev_ip, const std::string& dev_url, const std::string& dev_type); + ~QDSDevice() {}; + + // cj_1 + void updateByJsonData(json& status); + bool is_online(); + void updateFilamentConfig(); + + void updateBoxDataByJson(const json status); +private: + void twoStageParseIntToString(const json& status, std::string& target, std::string first, std::string second); + void twoStageParseStringToString(const json& status, std::string& target, std::string first, std::string second); + + template + void twoStageParse(const json& status, T& target, std::string first, std::string second); + + // cj_1 + int getJsonCurStageToInt(const json& jsonData, std::string jsonName); + static void initGeneralData(); + +public: + std::string m_name; + std::string m_id; + std::string m_ip; + std::string m_url; + std::string m_type; + std::string m_frp_url; + json parameters; + std::string m_chamber_temperature{ "0" }; + std::string m_extruder_temperature{ "0" }; + std::string m_bed_temperature{ "0" }; + std::string m_target_chamber{ "0" }; + std::string m_target_extruder{ "0" }; + std::string m_target_bed{ "0" }; + std::atomic m_case_light{ false }; + + std::string m_home_axes; + + bool m_polar_cooler{ false }; + float m_auxiliary_fan_speed{ 0.0 }; + float m_chamber_fan_speed{ 0.0 }; + float m_cooling_fan_speed{ 0.0 }; + + std::string m_print_total_duration; // cj_1 + std::string m_print_duration; // cj_1 + std::string m_print_filename; + std::string m_print_progress{ "N/A" }; + std::string m_filament_weight{ "0g" }; + std::string m_print_total_time{ "0m" }; + std::string m_print_png_url{ "" }; + std::string m_status{ "standby" }; + std::string m_print_state; + int m_print_cur_layer{ 0 }; + int m_print_total_layer{ 0 }; + double m_print_progress_float{ 0 }; // cj_1 + + std::vector m_boxData; + std::vector m_boxTemperature; + std::vector m_boxHumidity; + bool box_is_update; + bool box_filament_is_update; + bool m_is_auto_reload{ false }; + std::string m_cur_slot; + int m_box_count{ 0 }; + std::vector m_filamentConfig; + static std::vector m_general_filamentConfig; + bool m_auto_read_rfid{ false }; + bool m_init_detect{ false }; + bool m_auto_reload_detect{ false }; + + + std::atomic has_box{false}; + std::atomic is_selected{ false }; + std::atomic is_update{ false }; + std::atomic is_support_mqtt{ false }; + std::atomic is_first_connect{ true }; + std::atomic should_stop{ false }; + std::chrono::steady_clock::time_point last_update = std::chrono::steady_clock::now(); + + std::vector file_info {}; + + bool m_is_init_filamentConfig{ false }; + static bool m_is_init_general; + static std::mutex m_general_mtx; + std::mutex m_config_mtx; +}; + + +using ParameterUpdateCallback = std::function; +using ConnectionEventCallback = std::function; +using DeviceConnectTypeUpdateCallback = std::function; +using DeleteDeviceIDCallback = std::function; +using FileInfoUpdateCallback = std::function; + +class QDSDeviceManager { +public: + QDSDeviceManager(); + ~QDSDeviceManager(); + std::string addDevice(const std::string& dev_name, const std::string& dev_ip, const std::string& dev_url, const std::string& dev_type); + bool addDevice(std::shared_ptr device); + bool removeDevice(const std::string& device_id); + bool connectDevice(const std::string device_id); + bool disconnectDevice(const std::string& device_id); + void reconnectDevice(const std::string& device_id); + std::shared_ptr getDevice(const std::string& device_id); + + void setConnectionEventCallback(ConnectionEventCallback cb) { + std::lock_guard lock(callback_mutex_); + connection_event_callback_ = std::move(cb); + } + void setParameterUpdateCallback(ParameterUpdateCallback cb) { + std::lock_guard lock(callback_mutex_); + parameter_update_callback_ = std::move(cb); + } + void setDeviceConnectTypeUpdateCallback(DeviceConnectTypeUpdateCallback cb) { + std::lock_guard lock(callback_mutex_); + device_connect_type_update_callback_ = std::move(cb); + } + void setDeleteDeviceIDCallback(DeleteDeviceIDCallback cb) { + std::lock_guard lock(callback_mutex_); + delete_device_id_callback_ = std::move(cb); + } + void setFileInfoUpdateCallback(FileInfoUpdateCallback cb){ + std::lock_guard lock(callback_mutex_); + file_info_update_callback_ = std::move(cb); + } + + void stopAllConnection(); + + + std::string getDeviceTempNozzle(const std::string& deviceId); + std::string getDeviceTempBed(const std::string& deviceId); + std::string getDeviceTempChamber(const std::string& deviceId); + bool getDeviceCaseLight(const std::string& deviceId); + + void sendCommand(const std::string& device_id, const std::string& script); + void sendActionCommand(const std::string& device_id, const std::string& action_type); + + void setSelected(const std::string& device_id); + std::shared_ptr getSelectedDevice(); + void unSelected(); + void setNetDevices(std::vector devices); + std::vector getNetDevices(); + void upBoxInfoToBoxMsg(std::shared_ptr& device); + +private: + using WebSocketClient = websocketpp::client; + + struct WebSocketConnect { + std::shared_ptr info; + WebSocketClient client; + websocketpp::connection_hdl connection_hdl; + std::thread client_thread; + std::atomic running{false}; + std::atomic stopping{false}; + std::atomic processing_message{false}; + std::atomic message_processing_count{0}; + std::chrono::steady_clock::time_point last_activity; + WebSocketConnect() : last_activity(std::chrono::steady_clock::now()) {} + }; + + std::mutex manager_mutex_; + std::mutex callback_mutex_; + std::unordered_map> devices_; + std::unordered_map> connections_; + std::vector net_devices; + + + // WebSocket + void onOpen(const std::string& device_id, websocketpp::connection_hdl hdl); + void onMessage(const std::string& device_id, websocketpp::connection_hdl hdl, + WebSocketClient::message_ptr msg); + void onClose(const std::string& device_id, websocketpp::connection_hdl hdl); + void onFail(const std::string& device_id, websocketpp::connection_hdl hdl); + + void sendSubscribeMessage(const std::string& device_id); + void handleDeviceMessage(const std::string& device_id, const json& message); + void updateDeviceMsg(const std::string& device_id, const json& message); + void updateDeviceStatus(const std::string& device_id, std::string new_status); + void updatePrintThumbUrl(std::shared_ptr& device, const json& message); + void updatePrintThumbUrlWithOutMsg(std::shared_ptr& device); + + int generateDeviceID(); + void stopConnection(const std::string& device_id); + void safeStopConnection(const std::string& device_id); + void cleanupConnection(const std::string& device_id); + + ConnectionEventCallback connection_event_callback_; + ParameterUpdateCallback parameter_update_callback_; + DeviceConnectTypeUpdateCallback device_connect_type_update_callback_; + DeleteDeviceIDCallback delete_device_id_callback_; + FileInfoUpdateCallback file_info_update_callback_; + + + std::thread health_check_thread_; + std::atomic health_check_running_{false}; + std::chrono::seconds health_check_interval_{5}; + + void healthCheckLoop(); + void performHealthCheck(); + + void updateDeviceData(std::shared_ptr& device, const json& result, + std::string& new_status, bool& is_update); + void processConnectionStatus(const std::string& device_id, const std::string& status); + void safeCallbackInvoke(); + void updateDeviceFileInfo(std::shared_ptr& device, const json& result); + + ConnectionEventCallback getConnectionEventCallback() { + std::lock_guard lock(callback_mutex_); + return connection_event_callback_; + } + + ParameterUpdateCallback getParameterUpdateCallback() { + std::lock_guard lock(callback_mutex_); + return parameter_update_callback_; + } + + DeviceConnectTypeUpdateCallback getDeviceConnectTypeUpdateCallback() { + std::lock_guard lock(callback_mutex_); + return device_connect_type_update_callback_; + } + + DeleteDeviceIDCallback getDeleteDeviceIDCallback() { + std::lock_guard lock(callback_mutex_); + return delete_device_id_callback_; + } + + FileInfoUpdateCallback getFileInfoUpdateCallback(){ + std::lock_guard lock(callback_mutex_); + return file_info_update_callback_; + } +}; + + + + +} +} + +#endif //QDSDEVICEMANAGER_H \ No newline at end of file diff --git a/src/slic3r/GUI/SelectMachine.cpp b/src/slic3r/GUI/SelectMachine.cpp index c9231f8..266684b 100644 --- a/src/slic3r/GUI/SelectMachine.cpp +++ b/src/slic3r/GUI/SelectMachine.cpp @@ -46,6 +46,7 @@ #include "Notebook.hpp" #include "BitmapCache.hpp" #include "BindDialog.hpp" +#include "PrinterWebView.hpp" // definitions #define S_RACK_NOZZLE_OFFSET_CALI_WARNING _L(\ @@ -361,7 +362,7 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater) switch_button_panel->SetBackgroundColour(StateColor::darkModeColorFor(wxColour("#FFFFFF"))); m_switch_button = new SwitchButton(switch_button_panel); m_switch_button->SetMaxSize(wxSize(100, 100)); - m_switch_button->SetLabels(_L("Local"), _L("Link")); + m_switch_button->SetLabels(_L("Local"), _L("Net")); m_switch_button->SetValue(m_isNetMode); m_switch_button->Bind(wxEVT_TOGGLEBUTTON, [this](wxCommandEvent& evt) { bool is_checked = evt.GetInt(); @@ -640,6 +641,12 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater) _L("Activate the multi-color box for multi-color printing with multiple filaments."), ops_no_auto, "enable_multi_box"); +//y76 + auto option_enable_air_condition = new PrintOption( + m_options_other, _L("Enable Air Condition"), + _L("Turn on the air conditioner for better cooling effect."), + ops_no_auto, "enable_air_condition"); + auto option_flow_dynamics_cali = new PrintOption(m_options_other, _L("Flow Dynamics Calibration"), _L("This process determines the dynamic flow values to improve overall print quality.\n*Automatic mode: Skip if the filament was calibrated recently."), @@ -696,12 +703,14 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater) m_sizer_options->Add(option_timelapse, 0, wxEXPAND); m_sizer_options->Add(option_auto_bed_level, 0, wxEXPAND); m_sizer_options->Add(option_enable_multi_box, 0, wxEXPAND); + m_sizer_options->Add(option_enable_air_condition, 0, wxEXPAND); m_sizer_options->Add(option_flow_dynamics_cali, 0, wxEXPAND); m_sizer_options->Add(option_nozzle_offset_cali_cali, 0, wxEXPAND); m_checkbox_list_order.push_back(option_timelapse); m_checkbox_list_order.push_back(option_auto_bed_level); m_checkbox_list_order.push_back(option_enable_multi_box); + m_checkbox_list_order.push_back(option_enable_air_condition); m_checkbox_list_order.push_back(option_flow_dynamics_cali); m_checkbox_list_order.push_back(option_nozzle_offset_cali_cali); @@ -716,6 +725,7 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater) m_checkbox_list["timelapse"] = option_timelapse; m_checkbox_list["bed_leveling"] = option_auto_bed_level; m_checkbox_list["enable_multi_box"] = option_enable_multi_box; + m_checkbox_list["enable_air_condition"] = option_enable_air_condition; m_checkbox_list["flow_cali"] = option_flow_dynamics_cali; m_checkbox_list["nozzle_offset_cali"] = option_nozzle_offset_cali_cali; for (auto print_opt : m_checkbox_list_order) { @@ -724,6 +734,7 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater) option_auto_bed_level->Hide(); option_enable_multi_box->Hide(); + option_enable_air_condition->Hide(); option_flow_dynamics_cali->Hide(); option_nozzle_offset_cali_cali->Hide(); //y59 @@ -1864,6 +1875,11 @@ void SelectMachineDialog::show_status(PrintDialogStatus status, std::vectorgetParam() == "enable_air_condition" && select_machine.enable_air_condition){ + bool open_air_condition; + wxString msg = _L("Set air condition.."); + m_status_bar->update_status(msg, m_is_canceled, 10, true); + if(item.second->getValue() == "on"){ + command = "SAVE_VARIABLE VARIABLE=enable_polar_cooler VALUE=1"; + } + else { + command = "SAVE_VARIABLE VARIABLE=enable_polar_cooler VALUE=0"; + } + success &= upload_job.printhost->send_command_to_printer(check_status_msg, command); + if(!success){ + show_status(PrintDialogStatus::AirConditionSettingFailed); + return; + } } } @@ -2484,18 +2516,6 @@ void SelectMachineDialog::start_to_send(PrintHostJob upload_job) { m_status_bar->update_status(msg, m_is_canceled, 100, true); std::this_thread::sleep_for(std::chrono::seconds(1)); } - if (m_isNetMode) { - wxGetApp().mainframe->m_printer_view->FormatNetUrl(machine_link_url, machine_ip, machine_is_special); - wxGetApp().mainframe->m_printer_view->SetToggleBar(m_isNetMode); - wxGetApp().app_config->set("machine_list_net", "1"); - wxGetApp().mainframe->m_printer_view->ShowNetPrinterButton(); - } - else { - wxGetApp().mainframe->m_printer_view->FormatUrl(machine_url); - wxGetApp().mainframe->m_printer_view->SetToggleBar(m_isNetMode); - wxGetApp().app_config->set("machine_list_net", "0"); - wxGetApp().mainframe->m_printer_view->ShowLocalPrinterButton(); - } wxGetApp().mainframe->select_tab(size_t(3)); } else{ @@ -2616,6 +2636,7 @@ void SelectMachineDialog::update_option_opts(MachineObject *obj) std::string type = preset_config.opt_string("printer_model"); if (NormalizeVendor(type).find(NormalizeVendor(select_machine.type)) != std::string::npos) { select_machine.timelapse = preset_config.opt_bool("is_support_timelapse"); + select_machine.enable_air_condition = preset_config.opt_bool("is_support_air_condition"); break; } } @@ -2635,6 +2656,12 @@ void SelectMachineDialog::update_option_opts(MachineObject *obj) m_checkbox_list["timelapse"]->update_options(ops_no_auto, _L("This enables timelapse mode. It will take a picture every 5 seconds during printing.\n*Automatic mode: Skip if timelapse is not supported.")); } +//y76 + if(select_machine.enable_air_condition){ + m_checkbox_list["enable_air_condition"]->Show(); + m_checkbox_list["enable_air_condition"]->update_options(ops_no_auto, _L("Turn on the air conditioner for better cooling effect.")); + } + // if (!obj) // { // for (auto opt : m_checkbox_list) { opt.second->Hide(); } @@ -2715,7 +2742,7 @@ void SelectMachineDialog::load_option_vals(MachineObject *obj) } } - //y71 + //y71 y76 if(has_box_machine){ m_checkbox_list["enable_multi_box"]->enable(true); m_checkbox_list["enable_multi_box"]->update_tooltip(wxEmptyString); @@ -2723,13 +2750,21 @@ void SelectMachineDialog::load_option_vals(MachineObject *obj) //y75 if (useExt && !m_ams_mapping_result.empty()) { m_checkbox_list["enable_multi_box"]->setValue("off"); - save_option_vals(); + } else { + m_checkbox_list["enable_multi_box"]->setValue("on"); } } else { m_checkbox_list["enable_multi_box"]->enable(false); m_checkbox_list["enable_multi_box"]->update_tooltip(_L("The machine is not synchronized with the box, so the box cannot be activated.")); } +//y76 + auto sel_obj = wxGetApp().qdsdevmanager->getSelectedDevice(); + if(sel_obj && sel_obj->m_polar_cooler){ + m_checkbox_list["enable_air_condition"]->enable(true); + } else { + m_checkbox_list["enable_air_condition"]->enable(false); + } ///*STUDIO-9197*/ //wxString error_messgae; @@ -2969,7 +3004,8 @@ void SelectMachineDialog::on_send_print() m_checkbox_list["enable_multi_box"]->getValueInt(), m_checkbox_list["flow_cali"]->getValueInt(), m_checkbox_list["nozzle_offset_cali"]->getValueInt(), - (m_pa_value_switch->GetValue() ? 0 : 1) + (m_pa_value_switch->GetValue() ? 0 : 1), + m_checkbox_list["enable_air_condition"]->getValueInt() ); if (obj_->HasAms()) { @@ -3557,7 +3593,7 @@ void SelectMachineDialog::on_selection_changed(wxCommandEvent &event) else { select_machine = machine; select_machine_type = machine.type; - select_printer_ip = machine.url; + select_printer_ip = machine.ip; if (preset_typename_normalized.find(NormalizeVendor(machine.type)) != std::string::npos) { Enable_Refresh_Button(true); @@ -3583,7 +3619,7 @@ void SelectMachineDialog::on_selection_changed(wxCommandEvent &event) else { select_machine = machine; select_machine_type = machine.type; - select_printer_ip = machine.url; + select_printer_ip = machine.ip; if (preset_typename_normalized.find(NormalizeVendor(machine.type)) != std::string::npos) { Enable_Refresh_Button(true); diff --git a/src/slic3r/GUI/SelectMachine.hpp b/src/slic3r/GUI/SelectMachine.hpp index f805951..eeff007 100644 --- a/src/slic3r/GUI/SelectMachine.hpp +++ b/src/slic3r/GUI/SelectMachine.hpp @@ -152,6 +152,7 @@ struct Machine_info { bool bed_leveling = true; bool enable_multi_box = false; bool timelapse = true; + bool enable_air_condition = false; }; #define PRINT_OPT_WIDTH FromDIP(44) diff --git a/src/slic3r/GUI/SendMultiMachinePage.cpp b/src/slic3r/GUI/SendMultiMachinePage.cpp index d410df9..6367730 100644 --- a/src/slic3r/GUI/SendMultiMachinePage.cpp +++ b/src/slic3r/GUI/SendMultiMachinePage.cpp @@ -1411,7 +1411,7 @@ wxPanel* SendMultiMachinePage::create_page() m_switch_button = new SwitchButton(m_table_head_panel); m_switch_button->SetMaxSize(wxSize(100, 100)); - m_switch_button->SetLabels(_L("Local"), _L("Link")); + m_switch_button->SetLabels(_L("Local"), _L("Net")); m_switch_button->SetValue(m_isNetMode); m_switch_button->Bind(wxEVT_TOGGLEBUTTON, [this](wxCommandEvent& evt) { bool is_checked = evt.GetInt(); diff --git a/src/slic3r/GUI/SendToPrinter.cpp b/src/slic3r/GUI/SendToPrinter.cpp index f2067bd..2f00daf 100644 --- a/src/slic3r/GUI/SendToPrinter.cpp +++ b/src/slic3r/GUI/SendToPrinter.cpp @@ -25,7 +25,8 @@ #include "DeviceCore/DevManager.h" #include "DeviceCore/DevStorage.h" #include "slic3r/Utils/FileTransferUtils.hpp" - +#include "PrinterWebView.hpp" +#include "OctoPrint.hpp" namespace Slic3r { namespace GUI { @@ -314,7 +315,7 @@ SendToPrinterDialog::SendToPrinterDialog(Plater *plater) switch_button_panel->SetBackgroundColour(StateColor::darkModeColorFor(wxColour("#FFFFFF"))); m_switch_button = new SwitchButton(switch_button_panel); m_switch_button->SetMaxSize(wxSize(100, 100)); - m_switch_button->SetLabels(_L("Local"), _L("Link")); + m_switch_button->SetLabels(_L("Local"), _L("Net")); m_switch_button->SetValue(m_isNetMode); m_switch_button->Bind(wxEVT_TOGGLEBUTTON, [this](wxCommandEvent& evt) { bool is_checked = evt.GetInt(); @@ -1283,18 +1284,6 @@ void SendToPrinterDialog::start_to_send(PrintHostJob upload_job) { } wxString msg = _L("Switch to device tab..."); m_status_bar->update_status(msg, m_is_canceled, 100, true); - if (m_isNetMode) { - wxGetApp().mainframe->m_printer_view->FormatNetUrl(machine_link_url, machine_ip, machine_is_special); - wxGetApp().mainframe->m_printer_view->SetToggleBar(m_isNetMode); - wxGetApp().app_config->set("machine_list_net", "1"); - wxGetApp().mainframe->m_printer_view->ShowNetPrinterButton(); - } - else { - wxGetApp().mainframe->m_printer_view->FormatUrl(machine_url); - wxGetApp().mainframe->m_printer_view->SetToggleBar(m_isNetMode); - wxGetApp().app_config->set("machine_list_net", "0"); - wxGetApp().mainframe->m_printer_view->ShowLocalPrinterButton(); - } wxGetApp().mainframe->select_tab(size_t(3)); } else{ diff --git a/src/slic3r/GUI/StatusPanel.cpp b/src/slic3r/GUI/StatusPanel.cpp index 51cd2db..294af74 100644 --- a/src/slic3r/GUI/StatusPanel.cpp +++ b/src/slic3r/GUI/StatusPanel.cpp @@ -22,6 +22,9 @@ #include #include #include +#include +#include +#include #include "DeviceCore/DevAxis.h" #include "DeviceCore/DevBed.h" @@ -46,12 +49,34 @@ #include "SafetyOptionsDialog.hpp" #include "ThermalPreconditioningDialog.hpp" - +#include namespace Slic3r { namespace GUI { #define TEMP_THRESHOLD_VAL 2 #define TEMP_THRESHOLD_ALLOW_E_CTRL 170.0f +//cj1 + wxDEFINE_EVENT(EVTSET_EXTRUESION, wxCommandEvent); + wxDEFINE_EVENT(EVTSET_BACK, wxCommandEvent); + wxDEFINE_EVENT(EVTSET_COOLER_SWITCH, wxCommandEvent); + wxDEFINE_EVENT(EVTSET_COOLER_ENABLE, wxCommandEvent); + wxDEFINE_EVENT(EVTSET_LEVELING_ENABLE, wxCommandEvent); + wxDEFINE_EVENT(EVTSET_AMS_ENABLE, wxCommandEvent); + wxDEFINE_EVENT(EVTSET_CASE_LIGHT, wxCommandEvent); + wxDEFINE_EVENT(EVTSET_BEEPER_SWITHC, wxCommandEvent); + wxDEFINE_EVENT(EVTSET_EXTRUDER_TEMPERATURE, wxCommandEvent); + wxDEFINE_EVENT(EVTSET_HEATERBED_TEMPERATURE, wxCommandEvent); + wxDEFINE_EVENT(EVTSET_CHAMBER_TEMPERATURE, wxCommandEvent); + wxDEFINE_EVENT(EVTSET_RETURN_SAFEHOME, wxCommandEvent); + wxDEFINE_EVENT(EVTSET_X_AXIS, wxCommandEvent); + wxDEFINE_EVENT(EVTSET_Y_AXIS, wxCommandEvent); + wxDEFINE_EVENT(EVTSET_Z_AXIS, wxCommandEvent); + wxDEFINE_EVENT(EVTSET_PRINT_CONTROL, wxCommandEvent); + wxDEFINE_EVENT(EVTSET_FILAMENT_TYPE, wxCommandEvent); + wxDEFINE_EVENT(EVTSET_FILAMENT_VENDOR, wxCommandEvent); + wxDEFINE_EVENT(EVTSET_FILAMENT_LOAD, wxCommandEvent); ///set/filament/load + wxDEFINE_EVENT(EVTSET_FILAMENT_UNLOAD, wxCommandEvent); ///set/filament/unload + /* const strings */ static const wxString NA_STR = _L("N/A"); static const wxString TEMP_BLANK_STR = wxString("_"); @@ -493,6 +518,8 @@ void PrintingTaskPanel::create_panel(wxWindow *parent) { wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer *bSizer_printing_title = new wxBoxSizer(wxHORIZONTAL); + //cj1 + init_bitmaps(); m_panel_printing_title = new wxPanel(parent, wxID_ANY, wxDefaultPosition, wxSize(-1, PAGE_TITLE_HEIGHT), wxTAB_TRAVERSAL); m_panel_printing_title->SetBackgroundColour(STATUS_TITLE_BG); @@ -513,8 +540,11 @@ void PrintingTaskPanel::create_panel(wxWindow *parent) m_bitmap_thumbnail->SetMaxSize(TASK_THUMBNAIL_SIZE); m_bitmap_thumbnail->SetMinSize(TASK_THUMBNAIL_SIZE); - wxBoxSizer *bSizer_subtask_info = new wxBoxSizer(wxVERTICAL); - wxBoxSizer *bSizer_task_name = new wxBoxSizer(wxVERTICAL); +//cj1 + //m_bitmap_thumbnail->SetBitmap(); + + wxBoxSizer *bSizer_subtask_info = new wxBoxSizer(wxVERTICAL); + wxBoxSizer *bSizer_task_name = new wxBoxSizer(wxVERTICAL); wxBoxSizer *bSizer_task_name_hor = new wxBoxSizer(wxHORIZONTAL); wxPanel *task_name_panel = new wxPanel(parent); @@ -536,6 +566,8 @@ void PrintingTaskPanel::create_panel(wxWindow *parent) m_staticText_consumption_of_time->Wrap(-1); m_bitmap_static_use_weight = new wxStaticBitmap(task_name_panel, wxID_ANY, m_bitmap_use_weight.bmp(), wxDefaultPosition, wxSize(FromDIP(16), FromDIP(16))); + //cj1 + m_bitmap_static_use_weight->Hide(); m_staticText_consumption_of_weight = new wxStaticText(task_name_panel, wxID_ANY, "0g", wxDefaultPosition, wxDefaultSize, 0); m_staticText_consumption_of_weight->SetFont(::Label::Body_12); @@ -945,7 +977,8 @@ void PrintingTaskPanel::create_panel(wxWindow *parent) if (m_type == CALIBRATION) { m_panel_printing_title->Hide(); - m_bitmap_thumbnail->Hide(); + //cj1 + //m_bitmap_thumbnail->Hide(); task_name_panel->Hide(); m_staticText_profile_value->Hide(); } @@ -1221,13 +1254,15 @@ void PrintingTaskPanel::show_priting_use_info(bool show, wxString time /*= wxEmp { if (show) { if (!m_staticText_consumption_of_time->IsShown()) { - m_bitmap_static_use_time->Show(); - m_staticText_consumption_of_time->Show(); + //cj1 + //m_bitmap_static_use_time->Show(); + //m_staticText_consumption_of_time->Show(); } if (!m_staticText_consumption_of_weight->IsShown()) { - m_bitmap_static_use_weight->Show(); - m_staticText_consumption_of_weight->Show(); + //cj1 + //m_bitmap_static_use_weight->Show(); + //m_staticText_consumption_of_weight->Show(); } m_staticText_consumption_of_time->SetLabelText(time); @@ -1352,6 +1387,9 @@ StatusBasePanel::StatusBasePanel(wxWindow *parent, wxWindowID id, const wxPoint bSizer_status_below->Add(m_panel_separator_middle, 0, wxEXPAND | wxALL, 0); +//y76 + wxBoxSizer *bSizer_right_vertical = new wxBoxSizer(wxVERTICAL); + m_machine_ctrl_panel = new wxPanel(this); m_machine_ctrl_panel->SetBackgroundColour(*wxWHITE); m_machine_ctrl_panel->SetDoubleBuffered(true); @@ -1360,7 +1398,20 @@ StatusBasePanel::StatusBasePanel(wxWindow *parent, wxWindowID id, const wxPoint m_machine_ctrl_panel->Layout(); m_machine_control->Fit(m_machine_ctrl_panel); - bSizer_status_below->Add(m_machine_ctrl_panel, 0, wxALL, 0); +//y76 + bSizer_right_vertical->Add(m_machine_ctrl_panel, 0, wxEXPAND | wxALL, 0); + // //y76 + // m_task_list_panel = new wxPanel(this); + // m_task_list_panel->SetBackgroundColour(*wxWHITE); + // m_task_list_panel->SetDoubleBuffered(true); + // auto task_list_group = create_task_list_group(m_task_list_panel); + // m_task_list_panel->SetSizer(task_list_group); + // m_task_list_panel->Layout(); + // task_list_group->Fit(m_task_list_panel); + + // bSizer_right_vertical->Add(m_task_list_panel, 1, wxEXPAND | wxTOP, FromDIP(10)); + bSizer_status_below->Add(bSizer_right_vertical, 0, wxALL, 0); +//y76 m_panel_separator_right = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(PAGE_SPACING, -1), wxTAB_TRAVERSAL); m_panel_separator_right->SetBackgroundColour(STATUS_PANEL_BG); @@ -1377,6 +1428,213 @@ StatusBasePanel::StatusBasePanel(wxWindow *parent, wxWindowID id, const wxPoint this->Layout(); } +//y76 +wxBoxSizer *StatusBasePanel::create_task_list_group(wxWindow *parent) +{ + auto sizer = new wxBoxSizer(wxVERTICAL); + + StaticBox* task_panel = new StaticBox(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); + StateColor box_colour(std::pair(*wxWHITE, StateColor::Normal)); + StateColor box_border_colour(std::pair(STATUS_PANEL_BG, StateColor::Normal)); + + task_panel->SetBackgroundColor(box_colour); + task_panel->SetBorderColor(box_border_colour); + task_panel->SetCornerRadius(5); + task_panel->SetMinSize(wxSize(FromDIP(586), -1)); + task_panel->SetMaxSize(wxSize(FromDIP(586), -1)); + + wxBoxSizer* bSizer_task_title; + wxBoxSizer* bSizer_task_content; + wxBoxSizer* file_list_sizer; + + wxBoxSizer* content_sizer = new wxBoxSizer(wxVERTICAL); + { + m_panel_task_title = new wxPanel(task_panel, wxID_ANY, wxDefaultPosition, wxSize(-1, FromDIP(50)), wxTAB_TRAVERSAL); + m_panel_task_title->SetBackgroundColour(STATUS_TITLE_BG); + bSizer_task_title = new wxBoxSizer(wxHORIZONTAL); + { + m_staticText_task = new Label(m_panel_task_title, _L("б")); + m_staticText_task->Wrap(-1); + m_staticText_task->SetForegroundColour(PAGE_TITLE_FONT_COL); + + bSizer_task_title->Add(m_staticText_task, 1, wxALIGN_CENTER_VERTICAL | wxLEFT, PAGE_TITLE_LEFT_MARGIN); + //bSizer_task_title->AddStretchSpacer(1); + + // m_refresh_btn = new wxButton(m_panel_task_title, wxID_ANY, _L("ˢ"), + // wxDefaultPosition, wxSize(FromDIP(60), FromDIP(25))); + // m_refresh_btn->SetBackgroundColour(wxColour(0x1E, 0x90, 0xFF)); // DodgerBlue + // m_refresh_btn->SetForegroundColour(*wxWHITE); + // m_refresh_btn->SetFont(wxFont(FromDIP(9), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false)); + + // bSizer_task_title->Add(m_refresh_btn, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, FromDIP(10)); + } + m_panel_task_title->SetSizer(bSizer_task_title); + m_panel_task_title->Layout(); + + content_sizer->Add(m_panel_task_title, 0, wxEXPAND); + + m_scroll_files = new wxScrolledWindow(task_panel, wxID_ANY, + wxDefaultPosition, wxSize(-1, FromDIP(300)), + wxVSCROLL | wxBORDER_NONE); + m_scroll_files->SetScrollRate(0, FromDIP(5)); + m_scroll_files->SetBackgroundColour(*wxWHITE); + m_scroll_files->SetDoubleBuffered(true); + + m_file_list_sizer = new wxBoxSizer(wxVERTICAL); + wxPanel* header_panel = new wxPanel(m_scroll_files, wxID_ANY); + header_panel->SetBackgroundColour(STATUS_TITLE_BG); + header_panel->SetMinSize(wxSize(-1, FromDIP(35))); + + wxBoxSizer* header_sizer = new wxBoxSizer(wxHORIZONTAL); + { + wxStaticText* header_name = new wxStaticText(header_panel, wxID_ANY, _L(""), + wxDefaultPosition, wxDefaultSize, wxST_ELLIPSIZE_END); + header_name->SetFont(wxFont(FromDIP(9), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false)); + header_name->SetForegroundColour(wxColour(0x66, 0x66, 0x66)); + header_sizer->Add(header_name, 1, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(15)); + + wxStaticText* header_weight = new wxStaticText(header_panel, wxID_ANY, _L("IJ"), + wxDefaultPosition, wxSize(FromDIP(80), -1), wxALIGN_RIGHT); + header_weight->SetFont(wxFont(FromDIP(9), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false)); + header_weight->SetForegroundColour(wxColour(0x66, 0x66, 0x66)); + header_sizer->Add(header_weight, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, FromDIP(15)); + + wxStaticText* header_time = new wxStaticText(header_panel, wxID_ANY, _L("Ԥʱ"), + wxDefaultPosition, wxSize(FromDIP(80), -1), wxALIGN_RIGHT); + header_time->SetFont(wxFont(FromDIP(9), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false)); + header_time->SetForegroundColour(wxColour(0x66, 0x66, 0x66)); + header_sizer->Add(header_time, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, FromDIP(15)); + } + header_panel->SetSizer(header_sizer); + m_file_list_sizer->Add(header_panel, 0, wxEXPAND); + + init_empty_task_list(); + + m_scroll_files->SetSizer(m_file_list_sizer); + m_scroll_files->FitInside(); + m_scroll_files->SetScrollbars(0, FromDIP(20), 0, 0); + + content_sizer->Add(m_scroll_files, 1, wxEXPAND | wxTOP, FromDIP(5)); + } + + task_panel->SetSizer(content_sizer); + sizer->Add(task_panel, 0, wxEXPAND | wxALL, FromDIP(0)); + + return sizer; +} + +void StatusBasePanel::init_empty_task_list() +{ + // if (!m_scroll_files || !m_file_list_sizer) return; + + // while (m_file_list_sizer->GetItemCount() > 1) { + // m_file_list_sizer->Remove(1); + // } + + // wxPanel* empty_item = new wxPanel(m_scroll_files, wxID_ANY); + // empty_item->SetBackgroundColour(*wxWHITE); + // empty_item->SetMinSize(wxSize(-1, FromDIP(40))); + + // wxBoxSizer* item_sizer = new wxBoxSizer(wxHORIZONTAL); + // { + // wxStaticText* label_name = new wxStaticText(empty_item, wxID_ANY, _L("-"), + // wxDefaultPosition, wxDefaultSize, wxST_ELLIPSIZE_END); + // label_name->SetFont(wxFont(FromDIP(9), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false)); + // label_name->SetForegroundColour(wxColour(0x99, 0x99, 0x99)); + // item_sizer->Add(label_name, 1, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(15)); + + // wxStaticText* label_weight = new wxStaticText(empty_item, wxID_ANY, _L("-"), + // wxDefaultPosition, wxSize(FromDIP(80), -1), wxALIGN_RIGHT); + // label_weight->SetFont(wxFont(FromDIP(9), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false)); + // label_weight->SetForegroundColour(wxColour(0x99, 0x99, 0x99)); + // item_sizer->Add(label_weight, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, FromDIP(15)); + + // wxStaticText* label_time = new wxStaticText(empty_item, wxID_ANY, _L("-"), + // wxDefaultPosition, wxSize(FromDIP(80), -1), wxALIGN_RIGHT); + // label_time->SetFont(wxFont(FromDIP(9), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false)); + // label_time->SetForegroundColour(wxColour(0x99, 0x99, 0x99)); + // item_sizer->Add(label_time, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, FromDIP(15)); + // } + // empty_item->SetSizer(item_sizer); + // m_file_list_sizer->Add(empty_item, 0, wxEXPAND); + + // update_task_list_layout(); +} + +void StatusBasePanel::clear_task_list() +{ + // if (!m_file_list_sizer) return; + + // while (m_file_list_sizer->GetItemCount() > 1) { + // m_file_list_sizer->Remove(1); + // } +} + +void StatusBasePanel::update_task_list(const std::vector& files) +{ + + // if (!m_scroll_files || !m_file_list_sizer) return; + + // clear_task_list(); + + // if (files.empty()) { + // init_empty_task_list(); + // return; + // } + + // const int left_padding = FromDIP(15); + // const int col_spacing = FromDIP(20); + + // for (size_t i = 0; i < files.size(); ++i) { + // const auto& file = files[i]; + + // wxPanel* file_item = new wxPanel(m_scroll_files, wxID_ANY); + // file_item->SetBackgroundColour(i % 2 == 0 ? *wxWHITE : wxColour(0xFA, 0xFA, 0xFA)); + // file_item->SetMinSize(wxSize(-1, FromDIP(40))); + + // wxBoxSizer* item_sizer = new wxBoxSizer(wxHORIZONTAL); + // { + // wxStaticText* label_name = new wxStaticText(file_item, wxID_ANY, file.name, + // wxDefaultPosition, wxDefaultSize, wxST_ELLIPSIZE_END); + // label_name->SetFont(wxFont(FromDIP(9), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false)); + // label_name->SetForegroundColour(wxColour(0x26, 0x26, 0x26)); + // label_name->SetToolTip(file.name); + // item_sizer->Add(label_name, 1, wxALIGN_CENTER_VERTICAL | wxLEFT, left_padding); + + // wxStaticText* label_weight = new wxStaticText(file_item, wxID_ANY, file.weight); + // label_weight->SetFont(wxFont(FromDIP(9), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false)); + // label_weight->SetForegroundColour(wxColour(0x26, 0x26, 0x26)); + // item_sizer->Add(label_weight, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT, col_spacing); + + // wxStaticText* label_time = new wxStaticText(file_item, wxID_ANY, file.time); + // label_time->SetFont(wxFont(FromDIP(9), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false)); + // label_time->SetForegroundColour(wxColour(0x26, 0x26, 0x26)); + // item_sizer->Add(label_time, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT, col_spacing); + // } + // file_item->SetSizer(item_sizer); + // m_file_list_sizer->Add(file_item, 0, wxEXPAND); + // } + + // update_task_list_layout(); +} + +void StatusBasePanel::update_task_list_layout() +{ + // if (m_scroll_files && m_file_list_sizer) { + // m_scroll_files->FitInside(); + // m_scroll_files->SetScrollbars(0, FromDIP(20), 0, 0); + + // if (m_scroll_files->GetSizer()) { + // m_scroll_files->GetSizer()->Layout(); + // } + + // if (m_task_list_panel) { + // m_task_list_panel->Layout(); + // } + // } +} +//y76 + StatusBasePanel::~StatusBasePanel() { delete m_media_play_ctrl; } void StatusBasePanel::init_bitmaps() @@ -1474,6 +1732,8 @@ wxBoxSizer *StatusBasePanel::create_monitoring_page() m_bitmap_recording_img->SetToolTip(_L("Video")); m_bitmap_vcamera_img->SetToolTip(_L("Go Live")); m_setting_button->SetToolTip(_L("Camera Setting")); + //cj + m_setting_button->Hide(); bSizer_monitoring_title->Add(m_bitmap_sdcard_img, 0, wxALIGN_CENTER_VERTICAL | wxALL, FromDIP(5)); bSizer_monitoring_title->Add(m_bitmap_timelapse_img, 0, wxALIGN_CENTER_VERTICAL | wxALL, FromDIP(5)); @@ -1491,12 +1751,25 @@ wxBoxSizer *StatusBasePanel::create_monitoring_page() // media_ctrl_panel = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize); // media_ctrl_panel->SetBackgroundColour(*wxBLACK); // wxBoxSizer *bSizer_monitoring = new wxBoxSizer(wxVERTICAL); - m_media_ctrl = new wxMediaCtrl3(this); - m_media_ctrl->SetMinSize(wxSize(PAGE_MIN_WIDTH, FromDIP(288))); - m_media_play_ctrl = new MediaPlayCtrl(this, m_media_ctrl, wxDefaultPosition, wxSize(-1, FromDIP(40))); + //y76 + // m_media_ctrl = new wxMediaCtrl3(this); + // m_media_ctrl->SetMinSize(wxSize(PAGE_MIN_WIDTH, FromDIP(288))); - sizer->Add(m_media_ctrl, 1, wxEXPAND | wxALL, 0); + VideoPanel* test_panel = new VideoPanel(this); + m_media_play_ctrl = new MediaPlayCtrl(this, test_panel, wxDefaultPosition, wxSize(-1, FromDIP(40))); + + // test_panel->SetStreamUrl("http://192.168.110.17/webcam/?action=snapshot"); + // test_panel->Play(); +// if (!m_media_ctrl->Create(this, wxID_ANY)) // Windows Ƽʹ WMP10 +// { +// wxLogError("޷ýؼ"); +// } +// +// m_media_ctrl->Load(wxURI("http://2k2m4y94k1bwd4d3mf86.aliyun.qidi3dprinter.com:7680/webcam")); +// + + sizer->Add(test_panel, 1, wxEXPAND | wxALL, 0); sizer->Add(m_media_play_ctrl, 0, wxEXPAND | wxALL, 0); // media_ctrl_panel->SetSizer(bSizer_monitoring); // media_ctrl_panel->Layout(); @@ -1517,10 +1790,11 @@ wxBoxSizer *StatusBasePanel::create_machine_control_page(wxWindow *parent) m_staticText_control->Wrap(-1); // m_staticText_control->SetFont(PAGE_TITLE_FONT); m_staticText_control->SetForegroundColour(PAGE_TITLE_FONT_COL); - // y96 - StateColor btn_bg_blue(std::pair(AMS_CONTROL_DISABLE_COLOUR, StateColor::Disabled), std::pair(wxColour(95, 82, 253), StateColor::Pressed), - std::pair(wxColour(129, 150, 255), StateColor::Hovered), std::pair(AMS_CONTROL_BRAND_COLOUR, StateColor::Normal)); - StateColor btn_bd_blue(std::pair(AMS_CONTROL_WHITE_COLOUR, StateColor::Disabled), std::pair(AMS_CONTROL_BRAND_COLOUR, StateColor::Enabled)); + + //y76 + StateColor btn_bg_blue(std::pair(AMS_CONTROL_DISABLE_COLOUR, StateColor::Disabled), std::pair(wxColour(95, 82, 253), StateColor::Pressed), + std::pair(wxColour(129, 150, 255), StateColor::Hovered), std::pair(AMS_CONTROL_BRAND_COLOUR, StateColor::Normal)); + StateColor btn_bd_blue(std::pair(AMS_CONTROL_WHITE_COLOUR, StateColor::Disabled), std::pair(AMS_CONTROL_BRAND_COLOUR, StateColor::Enabled)); m_parts_btn = new Button(m_panel_control_title, _L("Printer Parts")); m_parts_btn->SetBackgroundColor(btn_bg_blue); @@ -1538,7 +1812,7 @@ wxBoxSizer *StatusBasePanel::create_machine_control_page(wxWindow *parent) m_safety_btn = new Button(m_panel_control_title, _L("Safety Options")); m_safety_btn->SetBackgroundColor(btn_bg_blue); - m_safety_btn->SetBorderColor(btn_bg_blue); + m_safety_btn->SetBorderColor(btn_bd_blue); m_safety_btn->SetTextColor(wxColour("#FFFFFE")); m_safety_btn->SetSize(wxSize(FromDIP(128), FromDIP(26))); m_safety_btn->SetMinSize(wxSize(-1, FromDIP(26))); @@ -1550,7 +1824,7 @@ wxBoxSizer *StatusBasePanel::create_machine_control_page(wxWindow *parent) m_calibration_btn->SetSize(wxSize(FromDIP(128), FromDIP(26))); m_calibration_btn->SetMinSize(wxSize(-1, FromDIP(26))); m_calibration_btn->EnableTooltipEvenDisabled(); - + m_calibration_btn->Hide(); m_options_btn->Hide(); m_safety_btn->Hide(); @@ -1737,7 +2011,7 @@ wxBoxSizer *StatusBasePanel::create_misc_control(wxWindow *parent) m_switch_speed->SetFont(Label::Head_13); m_switch_speed->SetTextColor(StateColor(std::make_pair(DISCONNECT_TEXT_COL, (int) StateColor::Disabled), std::make_pair(NORMAL_TEXT_COL, (int) StateColor::Normal))); m_switch_speed->SetValue(false); - + m_switch_speed->Hide(); line_sizer->Add(m_switch_speed, 1, wxALIGN_CENTER | wxALL, 0); auto line = new StaticLine(parent, true); @@ -1779,7 +2053,7 @@ wxBoxSizer *StatusBasePanel::create_misc_control(wxWindow *parent) m_switch_fan->UseTextFan(); m_switch_fan->SetTextColor(StateColor(std::make_pair(DISCONNECT_TEXT_COL, (int) StateColor::Disabled), std::make_pair(NORMAL_FAN_TEXT_COL, (int) StateColor::Normal))); - m_switch_fan->Bind(wxEVT_ENTER_WINDOW, [this](auto &e) { m_fan_panel->SetBackgroundColor(wxColour(0, 174, 66)); }); + m_switch_fan->Bind(wxEVT_ENTER_WINDOW, [this](auto &e) { m_fan_panel->SetBackgroundColor(wxColour(68, 121, 251)); }); m_switch_fan->Bind(wxEVT_LEAVE_WINDOW, [this, parent](auto &e) { m_fan_panel->SetBackgroundColor(parent->GetBackgroundColour()); }); @@ -1929,7 +2203,7 @@ wxBoxSizer *StatusBasePanel::create_extruder_control(wxWindow *parent) m_nozzle_btn_panel = new SwitchBoard(panel, _L("Left"), _L("Right"), wxSize(FromDIP(126), FromDIP(26))); m_nozzle_btn_panel->SetAutoDisableWhenSwitch(); - + m_nozzle_btn_panel->Hide(); m_bpButton_e_10 = new Button(panel, "", "monitor_extruder_up", 0, FromDIP(22)); m_bpButton_e_10->SetBorderWidth(2); m_bpButton_e_10->SetBackgroundColor(e_ctrl_bg); @@ -1938,7 +2212,9 @@ wxBoxSizer *StatusBasePanel::create_extruder_control(wxWindow *parent) m_extruder_book = new wxSimplebook(panel, wxID_ANY, wxDefaultPosition, wxSize(FromDIP(45), FromDIP(112)), 0); - m_extruder_book->InsertPage(0, new wxPanel(panel), ""); + //cj_1 + auto extruder_img = new ExtruderImage(m_extruder_book, wxID_ANY, 1); + m_extruder_book->InsertPage(0, extruder_img , ""); for (int nozzle_num = 1; nozzle_num <= 2; nozzle_num++) { auto extruder_img = new ExtruderImage(m_extruder_book, wxID_ANY, nozzle_num); m_extruder_book->InsertPage(nozzle_num, extruder_img, ""); @@ -1954,7 +2230,7 @@ wxBoxSizer *StatusBasePanel::create_extruder_control(wxWindow *parent) m_extruder_switching_status = new ExtruderSwithingStatus(panel); m_extruder_switching_status->SetForegroundColour(TEXT_LIGHT_FONT_COL); - + m_extruder_switching_status->Hide(); m_extruder_label = new ::Label(panel, _L("Extruder")); m_extruder_label->SetFont(::Label::Body_13); m_extruder_label->SetForegroundColour(TEXT_LIGHT_FONT_COL); @@ -2213,7 +2489,30 @@ void StatusBasePanel::on_ams_rack_switch(wxCommandEvent &e) e.Skip(); } -void StatusPanel::update_camera_state(MachineObject *obj) +//cj_1 +void StatusBasePanel::update_temp_data(std::string nozzle, std::string bed, std::string chamber) +{ + m_tempCtrl_nozzle->SetLabel(wxString(nozzle)); + m_tempCtrl_bed->SetLabel(wxString(bed)); + m_tempCtrl_chamber->SetLabel(wxString(chamber)); + + + //m_tempCtrl_nozzle->setValue +} + +void StatusBasePanel::update_temp_target(std::string nozzle, std::string bed, std::string chamber) +{ + m_tempCtrl_nozzle->SetTagTemp(wxString(nozzle)); + m_tempCtrl_bed->SetTagTemp(wxString(bed)); + m_tempCtrl_chamber->SetTagTemp(wxString(chamber)); +} + +//y76 +void StatusBasePanel::update_light_status(bool on){ + m_switch_lamp->SetValue(on); +} + +void StatusPanel::update_camera_state(MachineObject* obj) { if (!obj) return; @@ -2407,15 +2706,54 @@ StatusPanel::StatusPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, co Bind(EVT_AMS_RETRY, &StatusPanel::on_ams_retry, this); Bind(EVT_FAN_CHANGED, &StatusPanel::on_fan_changed, this); Bind(EVT_SECONDARY_CHECK_RESUME, &StatusPanel::on_subtask_pause_resume, this); - Bind(EVT_SECONDARY_CHECK_RETRY, [this](auto &e) { - if (m_ams_control) { m_ams_control->on_retry(); } - }); + Bind(EVT_SECONDARY_CHECK_RETRY, [this](auto &e) { if (m_ams_control) { m_ams_control->on_retry(); }}); + Bind(EVT_SELECTED_TYPE, &StatusPanel::on_selected_type, this); + //cj_1 + Bind(EVT_SET_COLOR, [this](wxCommandEvent& e) { + + e.SetInt(curSelectSlotIndex); + int colorIndex = QDSFilamentConfig::getInstance().getColorIndex(e.GetString().ToStdString()); + e.SetString(std::to_string(colorIndex)); + e.Skip(); + }); + //cj_1 + Bind(EVT_SET_TYPE, [this](wxCommandEvent& e) { + wxString vendorAndType = e.GetString(); + size_t spacePos = vendorAndType.find(' '); + wxString type = ""; + wxString vendor = ""; + if (spacePos != wxString::npos) { + vendor = vendorAndType.substr(0, spacePos); + type = vendorAndType.substr(spacePos + 1); + } + + wxCommandEvent eventType(EVTSET_FILAMENT_TYPE); + eventType.SetInt(curSelectSlotIndex); + int typeIndex = QDSFilamentConfig::getInstance().getTypeNameIndex(type.ToStdString()); + eventType.SetString(std::to_string(typeIndex)); + wxPostEvent(GetParent(), eventType); + + + + wxCommandEvent eventVendor(EVTSET_FILAMENT_VENDOR); + eventVendor.SetInt(curSelectSlotIndex); + int vendorIndex = QDSFilamentConfig::getInstance().getVendorIndex(vendor.ToStdString()); + eventVendor.SetString(std::to_string(vendorIndex)); + wxPostEvent(GetParent(), eventVendor); + }); + + //cj_1 + //Bind() m_switch_speed->Connect(wxEVT_LEFT_DOWN, wxCommandEventHandler(StatusPanel::on_switch_speed), NULL, this); m_calibration_btn->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_start_calibration), NULL, this); m_options_btn->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_show_print_options), NULL, this); m_safety_btn->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_show_safety_options), NULL, this); m_parts_btn->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_show_parts_options), NULL, this); + +//cj_1 + m_ams_control->EnableLoadFilamentBtn(false, "", "", ""); + m_ams_control->EnableUnLoadFilamentBtn(false, "", "", ""); } StatusPanel::~StatusPanel() @@ -2472,6 +2810,151 @@ StatusPanel::~StatusPanel() if (m_score_data != nullptr) { delete m_score_data; } } +//cj_1 +void StatusPanel::update_progress(std::string fileName, std::string layer, std::string totalTime, std::string weight, float remainingTime, float progress) +{ + //return; + if (m_project_task_panel == nullptr) { + return; + } + if (fileName != "") { + m_project_task_panel->update_subtask_name(fileName); + } + else { + m_project_task_panel->update_subtask_name("N/A"); + } + + m_project_task_panel->update_layers_num(true,layer); + if (remainingTime - 0.0 > 0.00001) { + m_project_task_panel->update_left_time(remainingTime); + } + else { + m_project_task_panel->update_left_time("N/A"); + } + if (progress - 0.0 > 0.00001) { + m_project_task_panel->update_progress_percent(wxString::Format(wxT("%d"), (int)(progress * 100)), "%"); + } + else { + m_project_task_panel->update_progress_percent("N/A", ""); + } + m_project_task_panel->update_stage_value("", (int)(progress * 100)); + m_project_task_panel->show_priting_use_info(true, totalTime,weight); + m_project_task_panel->Layout(); + +} + +//cj_1 +void StatusPanel::update_camera_url(std::string url) +{ + m_media_play_ctrl->setUrl(wxString(url)); +} + +// cj_1 +void StatusPanel::update_print_status(std::string status) +{ + // printing paused standby + if (status == "standby") { + m_project_task_panel->enable_pause_resume_button(false, "resume_disable"); + m_project_task_panel->enable_abort_button(false); + } + if (status == "printing") { + m_project_task_panel->enable_pause_resume_button(true, "pause"); + m_project_task_panel->enable_abort_button(true); + + } + if (status == "paused") { + m_project_task_panel->enable_pause_resume_button(true, "resume"); + m_project_task_panel->enable_abort_button(true); + } + +} + +//cj_1 +void StatusPanel::update_thumbnail(std::string url) +{ + if (m_request_url == wxString(url)) { + return; + } + + m_request_url = wxString(url); + if (!m_request_url.IsEmpty()) { + wxImage img; + std::map::iterator it = img_list.find(m_request_url); + if (it != img_list.end()) { + img = it->second; + wxImage resize_img = img.Scale(m_project_task_panel->get_bitmap_thumbnail()->GetSize().x, m_project_task_panel->get_bitmap_thumbnail()->GetSize().y); + m_project_task_panel->set_thumbnail_img(resize_img, ""); + } + else { + web_request = wxWebSession::GetDefault().CreateRequest(this, m_request_url); + web_request.Start(); + m_start_loading_thumbnail = false; + } + } + else { + m_project_task_panel->reset_printing_value(); + } +} + +//cj_1 +void StatusPanel::update_boxs(std::vector boxS, std::vector ext_info) +{ + //m_ams + m_boxS = boxS; + m_ext_info = ext_info; + int total_ext_count = 1; // ͷ + std::string dev_id = "device-1234"; + std::string series_name = "QIDI-X"; + std::string printer_type = "X-Max 4"; // ʾϵĴӡͼƬ + m_ams_control->SetAmsModel(AMSModel::N3S_AMS, AMSModel::EXT_AMS); + m_ams_control->SetData(boxS, ext_info, total_ext_count, dev_id, series_name, printer_type); + m_ams_control->Hide(); + m_ams_control->Show(); + m_ams_control_box->Hide(); + m_ams_control_box->Show(); + m_ams_control->Layout(); + m_ams_control_box->Layout(); + m_ams_control_box->Update(); + m_ams_control_box->Fit(); + Layout(); +} + +//cj_1 +void StatusPanel::update_cur_slot(int curSlotSyncIndex) +{ + m_curSlotSync = curSlotSyncIndex; +} + +//cj_1 +void StatusPanel::set_filament_config(std::vectorconfig) +{ + if (m_isInitConfig) { + return; + } + m_filamentConfig = config; +} + +// cj_1 +void StatusPanel::pause_camera() +{ + m_media_play_ctrl->stopMonitor(); +} + +//cj_1 +void StatusPanel::update_AMSSettingData(bool autoRead, bool initDetect, bool autoReload) +{ + m_auto_read_rfid = autoRead; + m_init_detect = initDetect; + m_auto_reload_detect = autoReload; + +} + +// cj_1 +void StatusPanel::update_fan_speed(AIR_FUN id, int speed) +{ + m_fan_speeds[id] = speed; +} + void StatusPanel::init_scaled_buttons() { m_project_task_panel->init_scaled_buttons(); @@ -2584,6 +3067,12 @@ void StatusPanel::on_subtask_partskip(wxCommandEvent &event) void StatusPanel::on_subtask_pause_resume(wxCommandEvent &event) { + //cj_1 + int type = 0; + if (m_project_task_panel->get_pause_resume_button()->GetToolTipText() == _L("Resume")) { + type = 1; + } + postEventValueAndEnable(EVTSET_PRINT_CONTROL, type, "type"); if (obj) { if (obj->can_resume()) { BOOST_LOG_TRIVIAL(info) << "monitor: resume current print task dev_id =" << QDTCrossTalk::Crosstalk_DevId(obj->get_dev_id()); @@ -2600,7 +3089,11 @@ void StatusPanel::on_subtask_abort(wxCommandEvent &event) if (abort_dlg == nullptr) { abort_dlg = new SecondaryCheckDialog(this->GetParent(), wxID_ANY, _L("Cancel print")); abort_dlg->Bind(EVT_SECONDARY_CHECK_CONFIRM, [this](wxCommandEvent &e) { - if (obj) { + //cj_1 + postEventValueAndEnable(EVTSET_PRINT_CONTROL, 2, "type"); + + + if (obj) { BOOST_LOG_TRIVIAL(info) << "monitor: stop current print task dev_id =" << QDTCrossTalk::Crosstalk_DevId(obj->get_dev_id()); obj->command_task_abort(); } @@ -2638,14 +3131,16 @@ void StatusPanel::on_webrequest_state(wxWebRequestEvent &evt) BOOST_LOG_TRIVIAL(trace) << "monitor: monitor_panel web request state = " << evt.GetState(); switch (evt.GetState()) { case wxWebRequest::State_Completed: { - if (m_current_print_mode != PrintingTaskType::CALIBRATION || (m_calib_mode == CalibMode::Calib_Flow_Rate && m_calib_method == CalibrationMethod::CALI_METHOD_MANUAL)) { + //cj_1 + //if (m_current_print_mode != PrintingTaskType::CALIBRATION ||(m_calib_mode == CalibMode::Calib_Flow_Rate && m_calib_method == CalibrationMethod::CALI_METHOD_MANUAL)) { wxImage img(*evt.GetResponse().GetStream()); img_list.insert(std::make_pair(m_request_url, img)); wxImage resize_img = img.Scale(m_project_task_panel->get_bitmap_thumbnail()->GetSize().x, m_project_task_panel->get_bitmap_thumbnail()->GetSize().y, wxIMAGE_QUALITY_HIGH); m_project_task_panel->set_thumbnail_img(resize_img, ""); - m_project_task_panel->set_brightness_value(get_brightness_value(resize_img)); - } + //cj_1 + //m_project_task_panel->set_brightness_value(get_brightness_value(resize_img)); + //} if (obj) { m_project_task_panel->set_plate_index(obj->m_plate_index); } else { @@ -2737,7 +3232,9 @@ void StatusPanel::update(MachineObject *obj) /*STUDIO-12573*/ if (!obj->GetInfo()->IsFdmMode()) { m_switch_lamp->Enable(false); } - update_temp_ctrl(obj); +//y76 + //update_temp_ctrl(obj); + update_misc_ctrl(obj); update_ams(obj); @@ -2818,6 +3315,7 @@ void StatusPanel::show_recenter_dialog() { RecenterDialog dlg(this); if (dlg.ShowModal() == wxID_OK) { + postEventValueAndEnable(EVTSET_RETURN_SAFEHOME, 1, "value"); if (obj) { obj->GetAxis()->Ctrl_GoHome(); } } } @@ -2913,26 +3411,29 @@ void StatusPanel::show_printing_status(bool ctrl_area, bool temp_area) } } -void StatusPanel::update_temp_ctrl(MachineObject *obj) +//y76 +void StatusPanel::update_temp_ctrl(std::shared_ptr obj) { if (!obj) return; + // std::cout << "statusPanel" << std::endl; + // DevBed* bed = obj->GetBed(); + int bed_cur_temp = std::stoi(obj->m_bed_temperature); + int bed_target_temp = std::stoi(obj->m_target_bed); + // m_tempCtrl_bed->SetCurrTemp((int) bed_cur_temp); - DevBed *bed = obj->GetBed(); - int bed_cur_temp = bed->GetBedTemp(); - int bed_target_temp = bed->GetBedTempTarget(); - m_tempCtrl_bed->SetCurrTemp((int) bed_cur_temp); + // auto limit = obj->get_bed_temperature_limit(); + // if (obj->bed_temp_range.size() > 1) { + // limit = obj->bed_temp_range[1]; + // } + // m_tempCtrl_bed->SetMaxTemp(limit); - auto limit = obj->get_bed_temperature_limit(); - if (obj->bed_temp_range.size() > 1) { limit = obj->bed_temp_range[1]; } - m_tempCtrl_bed->SetMaxTemp(limit); + // if (obj->nozzle_temp_range.size() >= 2) { + // m_tempCtrl_nozzle->SetMinTemp(obj->nozzle_temp_range[0]); + // m_tempCtrl_nozzle->SetMaxTemp(obj->nozzle_temp_range[1]); - if (obj->nozzle_temp_range.size() >= 2) { - m_tempCtrl_nozzle->SetMinTemp(obj->nozzle_temp_range[0]); - m_tempCtrl_nozzle->SetMaxTemp(obj->nozzle_temp_range[1]); - - m_tempCtrl_nozzle_deputy->SetMinTemp(obj->nozzle_temp_range[0]); - m_tempCtrl_nozzle_deputy->SetMaxTemp(obj->nozzle_temp_range[1]); - } + // m_tempCtrl_nozzle_deputy->SetMinTemp(obj->nozzle_temp_range[0]); + // m_tempCtrl_nozzle_deputy->SetMaxTemp(obj->nozzle_temp_range[1]); + // } // update temprature if not input temp target if (m_temp_bed_timeout > 0) { @@ -2947,108 +3448,157 @@ void StatusPanel::update_temp_ctrl(MachineObject *obj) m_tempCtrl_bed->SetIconNormal(); } - bool to_update_layout = false; - int nozzle_num = obj->GetExtderSystem()->GetTotalExtderCount(); - if (nozzle_num == 1) { - m_tempCtrl_nozzle->SetCurrTemp(obj->GetExtderSystem()->GetNozzleTempCurrent(MAIN_EXTRUDER_ID)); - m_tempCtrl_nozzle->SetCurrType(TEMP_OF_NORMAL_TYPE); + // bool to_update_layout = false; + // int nozzle_num = obj->GetExtderSystem()->GetTotalExtderCount(); + // if (nozzle_num == 1) + // { + // m_tempCtrl_nozzle->SetCurrTemp(obj->GetExtderSystem()->GetNozzleTempCurrent(MAIN_EXTRUDER_ID)); + // m_tempCtrl_nozzle->SetCurrType(TEMP_OF_NORMAL_TYPE); - m_tempCtrl_nozzle_deputy->SetCurrType(TEMP_OF_NORMAL_TYPE); - m_tempCtrl_nozzle_deputy->SetLabel(TEMP_BLANK_STR); - m_tempCtrl_nozzle_deputy->Hide(); + // m_tempCtrl_nozzle_deputy->SetCurrType(TEMP_OF_NORMAL_TYPE); + // m_tempCtrl_nozzle_deputy->SetLabel(TEMP_BLANK_STR); + // m_tempCtrl_nozzle_deputy->Hide(); - if (m_tempCtrl_nozzle->GetMinSize() != TEMP_CTRL_MIN_SIZE_ALIGN_ONE_ICON) { - to_update_layout = true; - m_tempCtrl_nozzle->SetMinSize(TEMP_CTRL_MIN_SIZE_ALIGN_ONE_ICON); - } - } else if (nozzle_num == 2) { - m_tempCtrl_nozzle->SetCurrType(TEMP_OF_MAIN_NOZZLE_TYPE); - m_tempCtrl_nozzle->SetCurrTemp(obj->GetExtderSystem()->GetNozzleTempCurrent(MAIN_EXTRUDER_ID)); - m_tempCtrl_nozzle->Show(); + // if (m_tempCtrl_nozzle->GetMinSize() != TEMP_CTRL_MIN_SIZE_ALIGN_ONE_ICON) + // { + // to_update_layout = true; + // m_tempCtrl_nozzle->SetMinSize(TEMP_CTRL_MIN_SIZE_ALIGN_ONE_ICON); + // } + // } + // else if (nozzle_num == 2) + // { + // m_tempCtrl_nozzle->SetCurrType(TEMP_OF_MAIN_NOZZLE_TYPE); + // m_tempCtrl_nozzle->SetCurrTemp(obj->GetExtderSystem()->GetNozzleTempCurrent(MAIN_EXTRUDER_ID)); + // m_tempCtrl_nozzle->Show(); - m_tempCtrl_nozzle_deputy->SetCurrType(TEMP_OF_DEPUTY_NOZZLE_TYPE); - m_tempCtrl_nozzle_deputy->SetCurrTemp(obj->GetExtderSystem()->GetNozzleTempCurrent(DEPUTY_EXTRUDER_ID)); - m_tempCtrl_nozzle_deputy->Show(); + // m_tempCtrl_nozzle_deputy->SetCurrType(TEMP_OF_DEPUTY_NOZZLE_TYPE); + // m_tempCtrl_nozzle_deputy->SetCurrTemp(obj->GetExtderSystem()->GetNozzleTempCurrent(DEPUTY_EXTRUDER_ID)); + // m_tempCtrl_nozzle_deputy->Show(); - if (m_tempCtrl_nozzle->GetMinSize() != TEMP_CTRL_MIN_SIZE_ALIGN_TWO_ICON) { - to_update_layout = true; - m_tempCtrl_nozzle->SetMinSize(TEMP_CTRL_MIN_SIZE_ALIGN_TWO_ICON); - } + // if (m_tempCtrl_nozzle->GetMinSize() != TEMP_CTRL_MIN_SIZE_ALIGN_TWO_ICON) + // { + // to_update_layout = true; + // m_tempCtrl_nozzle->SetMinSize(TEMP_CTRL_MIN_SIZE_ALIGN_TWO_ICON); + // } + // } + + // if (m_temp_nozzle_timeout > 0) { + // m_temp_nozzle_timeout--; + // } else { + // if (!nozzle_temp_input) { + // auto main_extder = obj->GetExtderSystem()->GetExtderById(MAIN_EXTRUDER_ID); + // if (main_extder) + // { + // m_tempCtrl_nozzle->SetTagTemp(main_extder->GetTargetTemp()); + // m_tempCtrl_nozzle->SetCurrTemp((int)main_extder->GetCurrentTemp()); + // if (main_extder->GetTargetTemp() - main_extder->GetCurrentTemp() > TEMP_THRESHOLD_VAL) + // { + // m_tempCtrl_nozzle->SetIconActive(); + // } + // else + // { + // m_tempCtrl_nozzle->SetIconNormal(); + // } + // } + // } + // } + + int nozzle_cur_temp = std::stoi(obj->m_extruder_temperature); + int nozzle_target_temp = std::stoi(obj->m_target_extruder); + if ((nozzle_target_temp - nozzle_cur_temp) > TEMP_THRESHOLD_VAL) + { + m_tempCtrl_nozzle->SetIconActive(); + } + else + { + m_tempCtrl_nozzle->SetIconNormal(); } - if (m_temp_nozzle_timeout > 0) { - m_temp_nozzle_timeout--; - } else { - if (!nozzle_temp_input) { - auto main_extder = obj->GetExtderSystem()->GetExtderById(MAIN_EXTRUDER_ID); - if (main_extder) { - m_tempCtrl_nozzle->SetTagTemp(main_extder->GetTargetTemp()); - m_tempCtrl_nozzle->SetCurrTemp((int) main_extder->GetCurrentTemp()); - if (main_extder->GetTargetTemp() - main_extder->GetCurrentTemp() > TEMP_THRESHOLD_VAL) { - m_tempCtrl_nozzle->SetIconActive(); - } else { - m_tempCtrl_nozzle->SetIconNormal(); - } - } - } - } + // if (m_temp_nozzle_deputy_timeout > 0) { + // m_temp_nozzle_deputy_timeout--; + // } + // else { + // if (!nozzle_temp_input && nozzle_num >= 2) { + // auto deputy_extder = obj->GetExtderSystem()->GetExtderById(DEPUTY_EXTRUDER_ID); + // if (deputy_extder) + // { + // m_tempCtrl_nozzle_deputy->SetTagTemp(deputy_extder->GetTargetTemp()); + // m_tempCtrl_nozzle_deputy->SetCurrTemp((int)deputy_extder->GetCurrentTemp()); + // if (deputy_extder->GetTargetTemp() - deputy_extder->GetCurrentTemp() > TEMP_THRESHOLD_VAL) + // { + // m_tempCtrl_nozzle_deputy->SetIconActive(); + // } + // else + // { + // m_tempCtrl_nozzle_deputy->SetIconNormal(); + // } + // } + // } + // } - if (m_temp_nozzle_deputy_timeout > 0) { - m_temp_nozzle_deputy_timeout--; - } else { - if (!nozzle_temp_input && nozzle_num >= 2) { - auto deputy_extder = obj->GetExtderSystem()->GetExtderById(DEPUTY_EXTRUDER_ID); - if (deputy_extder) { - m_tempCtrl_nozzle_deputy->SetTagTemp(deputy_extder->GetTargetTemp()); - m_tempCtrl_nozzle_deputy->SetCurrTemp((int) deputy_extder->GetCurrentTemp()); - if (deputy_extder->GetTargetTemp() - deputy_extder->GetCurrentTemp() > TEMP_THRESHOLD_VAL) { - m_tempCtrl_nozzle_deputy->SetIconActive(); - } else { - m_tempCtrl_nozzle_deputy->SetIconNormal(); - } - } - } - } + // // support current temp for chamber + // if (obj->get_printer_series() == PrinterSeries::SERIES_X1) + // { + // m_tempCtrl_chamber->SetCurrTemp(obj->chamber_temp); + // } + // else + // { + // m_tempCtrl_chamber->SetCurrTemp(TEMP_BLANK_STR); + // } - // support current temp for chamber - const auto &chamber = obj->GetChamber(); - if (chamber->SupportChamberTempDisplay()) { - m_tempCtrl_chamber->SetCurrTemp(chamber->GetChamberTemp()); - } else { - m_tempCtrl_chamber->SetCurrTemp(TEMP_BLANK_STR); - } + // // support edit chamber temp + // DevConfig* config = obj->GetConfig(); + // if (config->SupportChamberEdit()) + // { + // m_tempCtrl_chamber->SetReadOnly(false); + // m_tempCtrl_chamber->Enable(); + // m_tempCtrl_chamber->SetMinTemp(config->GetChamberTempEditMin()); + // m_tempCtrl_chamber->SetMaxTemp(config->GetChamberTempEditMax()); + // m_tempCtrl_chamber->AddTemp(0); // zero is default temp + // wxCursor cursor(wxCURSOR_IBEAM); + // m_tempCtrl_chamber->GetTextCtrl()->SetCursor(cursor); - // support edit chamber temp - if (chamber->SupportChamberEdit()) { - m_tempCtrl_chamber->SetReadOnly(false); - m_tempCtrl_chamber->Enable(); - m_tempCtrl_chamber->SetMinTemp(chamber->GetChamberTempEditMin()); - m_tempCtrl_chamber->SetMaxTemp(chamber->GetChamberTempEditMax()); - m_tempCtrl_chamber->AddTemp(0); // zero is default temp - wxCursor cursor(wxCURSOR_IBEAM); - m_tempCtrl_chamber->GetTextCtrl()->SetCursor(cursor); + // if (m_temp_chamber_timeout > 0) + // { + // m_temp_chamber_timeout--; + // } + // else + // { + // /*update temprature if not input temp target*/ + // if (!cham_temp_input) { m_tempCtrl_chamber->SetTagTemp(obj->chamber_temp_target); } + // } + // } + // else + // { + // m_tempCtrl_chamber->SetReadOnly(true); + // m_tempCtrl_chamber->SetTagTemp(TEMP_BLANK_STR); - if (m_temp_chamber_timeout > 0) { - m_temp_chamber_timeout--; - } else { - /*update temprature if not input temp target*/ - if (!cham_temp_input) { m_tempCtrl_chamber->SetTagTemp(chamber->GetChamberTempTarget()); } - } - } else { - m_tempCtrl_chamber->SetReadOnly(true); - m_tempCtrl_chamber->SetTagTemp(TEMP_BLANK_STR); + // wxCursor cursor(wxCURSOR_ARROW); + // m_tempCtrl_chamber->GetTextCtrl()->SetCursor(cursor); + // } - wxCursor cursor(wxCURSOR_ARROW); - m_tempCtrl_chamber->GetTextCtrl()->SetCursor(cursor); - } + // if ((obj->chamber_temp_target - obj->chamber_temp) >= TEMP_THRESHOLD_VAL) { + // m_tempCtrl_chamber->SetIconActive(); + // } + // else { + // m_tempCtrl_chamber->SetIconNormal(); + // } - if ((chamber->GetChamberTempTarget() - chamber->GetChamberTemp()) >= TEMP_THRESHOLD_VAL) { + int chamber_cur_temp = std::stoi(obj->m_chamber_temperature); + int chamber_target_temp = std::stoi(obj->m_target_chamber); + if ((chamber_target_temp - chamber_cur_temp) > TEMP_THRESHOLD_VAL) + { m_tempCtrl_chamber->SetIconActive(); - } else { + } + else + { m_tempCtrl_chamber->SetIconNormal(); } - if (to_update_layout) { this->Layout(); } + // if (to_update_layout) + // { + // this->Layout(); + // } } void StatusPanel::update_misc_ctrl(MachineObject *obj) @@ -3797,6 +4347,23 @@ void StatusPanel::reset_printing_values() void StatusPanel::on_axis_ctrl_xy(wxCommandEvent &event) { + if (m_homed_axes == "") { + show_recenter_dialog(); + return; + } + // cj_1 + //check is at home + + if (event.GetInt() == 0) { postEventValueAndEnable(EVTSET_Y_AXIS, 10,"value"); } + else if (event.GetInt() == 1) { postEventValueAndEnable(EVTSET_X_AXIS, -10, "value"); } + else if (event.GetInt() == 2) { postEventValueAndEnable(EVTSET_Y_AXIS, -10, "value"); } + else if (event.GetInt() == 3) { postEventValueAndEnable(EVTSET_X_AXIS, 10, "value"); } + else if (event.GetInt() == 4) { postEventValueAndEnable(EVTSET_Y_AXIS, 1, "value"); } + else if (event.GetInt() == 5) { postEventValueAndEnable(EVTSET_X_AXIS, -1, "value"); } + else if (event.GetInt() == 6) { postEventValueAndEnable(EVTSET_Y_AXIS, -1, "value"); } + else if (event.GetInt() == 7) { postEventValueAndEnable(EVTSET_X_AXIS, 1, "value"); } + else if (event.GetInt() == 8) { postEventValueAndEnable(EVTSET_RETURN_SAFEHOME, 1, "value"); } + if (!obj) return; // check is at home @@ -3858,6 +4425,8 @@ bool StatusPanel::check_axis_z_at_home(MachineObject *obj) void StatusPanel::on_axis_ctrl_z_up_10(wxCommandEvent &event) { +//cj_1 + postEventValueAndEnable(EVTSET_Z_AXIS, -10, "value"); if (obj) { obj->GetAxis()->Ctrl_Axis("Z", 1.0, -10.0f, 900); if (!check_axis_z_at_home(obj)) return; @@ -3866,6 +4435,8 @@ void StatusPanel::on_axis_ctrl_z_up_10(wxCommandEvent &event) void StatusPanel::on_axis_ctrl_z_up_1(wxCommandEvent &event) { +//cj_1 + postEventValueAndEnable(EVTSET_Z_AXIS, -1, "value"); if (obj) { obj->GetAxis()->Ctrl_Axis("Z", 1.0, -1.0f, 900); if (!check_axis_z_at_home(obj)) return; @@ -3874,6 +4445,8 @@ void StatusPanel::on_axis_ctrl_z_up_1(wxCommandEvent &event) void StatusPanel::on_axis_ctrl_z_down_1(wxCommandEvent &event) { +//cj_1 + postEventValueAndEnable(EVTSET_Z_AXIS, 1, "value"); if (obj) { obj->GetAxis()->Ctrl_Axis("Z", 1.0, 1.0f, 900); if (!check_axis_z_at_home(obj)) return; @@ -3882,6 +4455,8 @@ void StatusPanel::on_axis_ctrl_z_down_1(wxCommandEvent &event) void StatusPanel::on_axis_ctrl_z_down_10(wxCommandEvent &event) { +//cj_1 + postEventValueAndEnable(EVTSET_Z_AXIS, 10, "value"); if (obj) { obj->GetAxis()->Ctrl_Axis("Z", 1.0, 10.0f, 900); if (!check_axis_z_at_home(obj)) return; @@ -3907,6 +4482,12 @@ void StatusPanel::axis_ctrl_e_hint(bool up_down) void StatusPanel::on_axis_ctrl_e_up_10(wxCommandEvent& event) { + //cj_1 + if (!judgeAxis()) + { + return; + } + postEventValueAndEnable(EVTSET_BACK, 10, "value"); if (obj) { auto ext = obj->GetExtderSystem()->GetCurrentExtder(); if (ext && ext->GetCurrentTemp() >= TEMP_THRESHOLD_ALLOW_E_CTRL) { @@ -3923,6 +4504,13 @@ void StatusPanel::on_axis_ctrl_e_up_10(wxCommandEvent& event) void StatusPanel::on_axis_ctrl_e_down_10(wxCommandEvent& event) { + //cj_1 + if (!judgeAxis()) + { + return; + } + postEventValueAndEnable(EVTSET_EXTRUESION, 10, "value"); + if (obj) { auto ext = obj->GetExtderSystem()->GetCurrentExtder(); if (ext && ext->GetCurrentTemp() >= TEMP_THRESHOLD_ALLOW_E_CTRL) @@ -3940,9 +4528,18 @@ void StatusPanel::on_axis_ctrl_e_down_10(wxCommandEvent& event) void StatusPanel::on_set_bed_temp() { - if (!obj) { return; } - +//cj_1 wxString str = m_tempCtrl_bed->GetTextCtrl()->GetValue(); + long temp = 0; + str.ToLong(&temp); + wxCommandEvent event(EVTSET_HEATERBED_TEMPERATURE); + event.SetInt(temp); + event.SetString("value"); + wxPostEvent(this, event); + + + if (!obj) {return;} + try { long bed_temp; if (str.ToLong(&bed_temp) && obj) { @@ -3966,7 +4563,16 @@ void StatusPanel::on_set_bed_temp() void StatusPanel::on_set_nozzle_temp(int nozzle_id) { - if (!obj) { return; } +//cj_1 + wxString str = m_tempCtrl_nozzle->GetTextCtrl()->GetValue(); + long temp = 0; + str.ToLong(&temp); + wxCommandEvent event(EVTSET_EXTRUDER_TEMPERATURE); + event.SetInt(temp); + event.SetString("value"); + wxPostEvent(this, event); + + if (!obj) {return;} try { long nozzle_temp; @@ -4019,7 +4625,17 @@ void StatusPanel::on_set_nozzle_temp(int nozzle_id) void StatusPanel::on_set_chamber_temp() { - if (!obj) { return; } +//cj_1 + wxString str1 = m_tempCtrl_chamber->GetTextCtrl()->GetValue(); + long temp = 0; + str1.ToLong(&temp); + wxCommandEvent event(EVTSET_CHAMBER_TEMPERATURE); + event.SetInt(temp); + event.SetString("value"); + wxPostEvent(this, event); + + + if (!obj) {return;} wxString str = m_tempCtrl_chamber->GetTextCtrl()->GetValue(); try { @@ -4065,6 +4681,12 @@ void StatusPanel::on_set_chamber_temp() void StatusPanel::on_ams_load(SimpleEvent &event) { + //cj_1 + wxCommandEvent e; + e.SetEventType(EVTSET_FILAMENT_LOAD); + e.SetInt(curSelectSlotIndex); + wxPostEvent(this, e); + BOOST_LOG_TRIVIAL(info) << "on_ams_load"; on_ams_load_curr(); } @@ -4200,6 +4822,13 @@ void StatusPanel::on_ams_switch(SimpleEvent &event) void StatusPanel::on_ams_unload(SimpleEvent &event) { + + //cj_1 + wxCommandEvent e; + e.SetEventType(EVTSET_FILAMENT_UNLOAD); + e.SetInt(curSelectSlotIndex); + wxPostEvent(this, e); + if (obj) { std::string curr_ams_id = m_ams_control->GetCurentAms(); std::string curr_can_id = m_ams_control->GetCurrentCan(curr_ams_id); @@ -4218,21 +4847,65 @@ void StatusPanel::on_ams_unload(SimpleEvent &event) void StatusPanel::on_ams_filament_backup(SimpleEvent &event) { - if (obj) { - AmsReplaceMaterialDialog *m_replace_material_popup = new AmsReplaceMaterialDialog(this); - m_replace_material_popup->update_machine_obj(obj); +//cj_1 + //if (obj) { + AmsReplaceMaterialDialog* m_replace_material_popup = new AmsReplaceMaterialDialog(this); + + //cj_1 + std::map< + std::tuple, + std::vector + >colorGroups; + char goupPre = 'A'; + for (AMSinfo box : m_boxS) { + int goupNo = 1; + for (Caninfo can : box.cans) { + //GetAsString(wxC2S_HTML_SYNTAX) + if (can.material_state != AMSCanType::AMS_CAN_TYPE_NONE) { + + std::tuple key{ can.ctype, + can.material_name.ToStdString(), + can.material_colour.GetAsString(wxC2S_HTML_SYNTAX).ToStdString() }; + colorGroups[key].push_back(std::string(1,goupPre) + std::to_string(goupNo)); + } + ++goupNo; + } + ++goupPre; + } + + std::vectorgroupDatas; + for (auto it = colorGroups.begin(); it != colorGroups.end(); ++it) { + if (it->second.size() < 2) { + continue; + } + BackupGroupData groupData; + groupData.material = std::get<1>(it->first); + for (std::string name : it->second) { + groupData.group_info[name] = wxColour(std::get<2>(it->first)); + } + groupDatas.push_back(groupData); + } + + m_replace_material_popup->update_data(groupDatas); m_replace_material_popup->ShowModal(); - } + //} } void StatusPanel::on_ams_setting_click(SimpleEvent &event) { - if (obj) { - if (!m_ams_setting_dlg) { m_ams_setting_dlg = new AMSSetting((wxWindow *) this, wxID_ANY); } + //cj_1 + //if (obj) { + if (!m_ams_setting_dlg) { + m_ams_setting_dlg = new AMSSetting((wxWindow*)this, wxID_ANY); + } - m_ams_setting_dlg->UpdateByObj(obj); + //m_ams_setting_dlg->UpdateByObj(obj); + m_ams_setting_dlg->update_insert_material_read_mode(m_auto_read_rfid,""); + m_ams_setting_dlg->update_starting_read_mode(m_init_detect); + m_ams_setting_dlg->update_switch_filament(m_auto_reload_detect); + m_ams_setting_dlg->update_ams_img(nullptr); m_ams_setting_dlg->Show(); - } + //} } void StatusPanel::on_filament_extrusion_cali(wxCommandEvent &event) @@ -4355,6 +5028,58 @@ void StatusPanel::on_ext_spool_edit(wxCommandEvent &event) auto drect = wxDisplay(GetParent()).GetGeometry().GetHeight() - FromDIP(50); current_position_y = current_position_y + m_filament_setting_dlg->GetSize().GetHeight() > drect ? drect - m_filament_setting_dlg->GetSize().GetHeight() : current_position_y; + //cj_1 + long canInfoIndex = -1; + event.GetString().ToLong(&canInfoIndex); + if (canInfoIndex>=0 && canInfoIndex<=16) { + curSelectSlotIndex = canInfoIndex; + Caninfo can; + if (canInfoIndex == 16) { + can = m_ext_info[0].cans[0]; + } + else { + + int amsIndex = canInfoIndex / 4; + int canIndexInAms = canInfoIndex % 4; + can = m_boxS[amsIndex].cans[canIndexInAms]; + } + + m_filament_setting_dlg->Move(wxPoint(current_position_x, current_position_y)); + m_filament_setting_dlg->set_color(can.material_colour); + + //cj_1 + wxArrayString filamentNames; { + for (auto filament : m_filamentConfig) { + if (filament.name.empty())continue; + filamentNames.Add("QIDI " + filament.name); + } + for (auto filament : m_filamentConfig) { + if (filament.name.empty())continue; + filamentNames.Add("Generic " + filament.name); + } + } + m_filament_setting_dlg->setComboBoxData(filamentNames); + + for (auto filament : m_filamentConfig) { + if (filament.name == can.material_name) { + m_filament_setting_dlg->setMinMaxTemp(std::to_string(filament.minTemp), std::to_string(filament.maxTemp)); + } + } + wxString curComboBoxValue = ""; + if (can.ctype == 0) { + curComboBoxValue = "Generic " + can.material_name; + } + else { + curComboBoxValue = "QIDI " + can.material_name; + + } + m_filament_setting_dlg->setComboBoxValue(curComboBoxValue); + + m_filament_setting_dlg->Show(true); + m_filament_setting_dlg->ShowModal(); + } + + if (obj) { m_filament_setting_dlg->obj = obj; @@ -4406,6 +5131,9 @@ void StatusPanel::on_ext_spool_edit(wxCommandEvent &event) void StatusPanel::on_ams_refresh_rfid(wxCommandEvent &event) { +//cj_1 + event.Skip(); + if (obj) { // std::string curr_ams_id = m_ams_control->GetCurentAms(); if (event.GetInt() < 0 || event.GetInt() > VIRTUAL_TRAY_MAIN_ID) { return; } @@ -4460,6 +5188,40 @@ void StatusPanel::on_ams_refresh_rfid(wxCommandEvent &event) void StatusPanel::on_ams_selected(wxCommandEvent &event) { +//cj_1 + std::string slotId = event.GetString().ToStdString(); + long canInfoIndex = -1; + event.GetString().ToLong(&canInfoIndex); + if (canInfoIndex >= 0 && canInfoIndex <= 16) { + curSelectSlotIndex = canInfoIndex; + Caninfo can; + if (canInfoIndex == 16) { + can = m_ext_info[0].cans[0]; + } + else { + + int amsIndex = canInfoIndex / 4; + int canIndexInAms = canInfoIndex % 4; + can = m_boxS[amsIndex].cans[canIndexInAms]; + } + if (can.material_state == AMSCanType::AMS_CAN_TYPE_EMPTY) { + m_ams_control->EnableLoadFilamentBtn(false, "", "", ""); + m_ams_control->EnableUnLoadFilamentBtn(false, "", "", ""); + return; + } + + if (m_curSlotSync == canInfoIndex) { + m_ams_control->EnableLoadFilamentBtn(false, "", "", ""); + m_ams_control->EnableUnLoadFilamentBtn(true, "", "", ""); + } + else { + m_ams_control->EnableLoadFilamentBtn(true, "", "", ""); + m_ams_control->EnableUnLoadFilamentBtn(false, "", "", ""); + } + } + return; +//cj_1 + if (obj) { std::string curr_ams_id = m_ams_control->GetCurentAms(); std::string curr_selected_ams_id = std::to_string(event.GetInt()); @@ -4588,8 +5350,10 @@ void StatusPanel::on_switch_speed(wxCommandEvent &event) } step->SelectItem(selected_item); - if (!obj->is_in_printing()) { - step->Bind(wxEVT_LEFT_DOWN, [](auto &e) { return; }); +//cj_1 + if (obj!=nullptr && !obj->is_in_printing()) { + step->Bind(wxEVT_LEFT_DOWN, [](auto& e) { + return; }); } step->Bind(EVT_STEP_CHANGED, [this](auto &e) { @@ -4630,34 +5394,113 @@ void StatusPanel::on_printing_fan_switch(wxCommandEvent &event) void StatusPanel::on_nozzle_fan_switch(wxCommandEvent &event) { - if (m_fan_control_popup) { - m_fan_control_popup->Destroy(); - m_fan_control_popup = nullptr; +//cj_1 + { + if (m_fan_control_popup) { + m_fan_control_popup->Destroy(); + m_fan_control_popup = nullptr; + } + AirDuctData fanData; + AirMode airmode; { + airmode.id = 0; + airmode.ctrl.push_back(1); + airmode.ctrl.push_back(2); + airmode.ctrl.push_back(3); + airmode.ctrl.push_back(4); + airmode.off.push_back(6); + } + for (int i = 1; i < 7; ++i) { + if (i == 4 || i == 5) { + continue; + } + AirParts partData; { + partData.id = i; + } + fanData.parts.push_back(partData); + } + + fanData.modes[0] = airmode; + fanData.m_sub_mode = 0; + m_fan_control_popup = new FanControlPopupNew(this, obj, fanData); + auto pos = m_switch_fan->GetScreenPosition(); + pos.y = pos.y + m_switch_fan->GetSize().y; + + int display_idx = wxDisplay::GetFromWindow(this); + auto display = wxDisplay(display_idx).GetClientArea(); + + + wxSize screenSize = wxSize(display.GetWidth(), display.GetHeight()); + wxSize fan_popup_size = m_fan_control_popup->GetSize(); + + pos.x -= FromDIP(150); + pos.y -= FromDIP(20); + if (screenSize.y - fan_popup_size.y < FromDIP(300)) { + pos.y = (screenSize.y - fan_popup_size.y) / 2; + } + + m_fan_control_popup->SetPosition(pos); + m_fan_control_popup->ShowModal(); + + return; } - if (!obj) { return; } - if (obj->GetFan()->GetAirDuctData().modes.empty()) { obj->GetFan()->converse_to_duct(true, obj->GetFan()->GetSupportAuxFanData(), obj->GetFan()->GetSupportChamberFan()); } + for (auto it : m_fan_speeds) { + m_fan_control_popup->update_fan_data(it.first, it.second); + } - m_fan_control_popup = new FanControlPopupNew(this, obj, obj->GetFan()->GetAirDuctData()); + auto pos = m_switch_fan->GetScreenPosition(); + pos.y = pos.y + m_switch_fan->GetSize().y; - auto pos = m_switch_fan->GetScreenPosition(); - pos.y = pos.y + m_switch_fan->GetSize().y; + int display_idx = wxDisplay::GetFromWindow(this); + auto display = wxDisplay(display_idx).GetClientArea(); - int display_idx = wxDisplay::GetFromWindow(this); - auto display = wxDisplay(display_idx).GetClientArea(); - wxSize screenSize = wxSize(display.GetWidth(), display.GetHeight()); - wxSize fan_popup_size = m_fan_control_popup->GetSize(); + wxSize screenSize = wxSize(display.GetWidth(), display.GetHeight()); + wxSize fan_popup_size = m_fan_control_popup->GetSize(); - pos.x -= FromDIP(150); - pos.y -= FromDIP(20); - if (screenSize.y - fan_popup_size.y < FromDIP(300)) { pos.y = (screenSize.y - fan_popup_size.y) / 2; } + pos.x -= FromDIP(150); + pos.y -= FromDIP(20); + if (screenSize.y - fan_popup_size.y < FromDIP(300)) { + pos.y = (screenSize.y - fan_popup_size.y) / 2; + } - m_fan_control_popup->SetPosition(pos); - m_fan_control_popup->ShowModal(); + m_fan_control_popup->SetPosition(pos); + m_fan_control_popup->ShowModal(); + + return; +//cj_1 + + //y76 + //if (!obj) { return; } + //if (obj->GetFan()->GetAirDuctData().modes.empty()) { obj->GetFan()->converse_to_duct(true, obj->GetFan()->GetSupportAuxFanData(), obj->GetFan()->GetSupportChamberFan()); } + + //m_fan_control_popup = new FanControlPopupNew(this, obj, obj->GetFan()->GetAirDuctData()); + + //auto pos = m_switch_fan->GetScreenPosition(); + //pos.y = pos.y + m_switch_fan->GetSize().y; + + //int display_idx = wxDisplay::GetFromWindow(this); + //auto display = wxDisplay(display_idx).GetClientArea(); + + //wxSize screenSize = wxSize(display.GetWidth(), display.GetHeight()); + //wxSize fan_popup_size = m_fan_control_popup->GetSize(); + + //pos.x -= FromDIP(150); + //pos.y -= FromDIP(20); + //if (screenSize.y - fan_popup_size.y < FromDIP(300)) { pos.y = (screenSize.y - fan_popup_size.y) / 2; } + + //m_fan_control_popup->SetPosition(pos); + //m_fan_control_popup->ShowModal(); } void StatusPanel::on_lamp_switch(wxCommandEvent &event) { +//cj_1 + bool value1 = m_switch_lamp->GetValue(); + wxCommandEvent event1(EVTSET_CASE_LIGHT); + event1.SetInt(value1); + event1.SetString("enable"); + wxPostEvent(this, event1); + if (!obj) return; bool value = m_switch_lamp->GetValue(); @@ -4801,6 +5644,30 @@ void StatusPanel::update_printer_parts_options(MachineObject *obj_) } } +//cj_1 +void StatusPanel::postEventValueAndEnable(wxEventType eventType, int value, std::string valueType) +{ + wxCommandEvent event(eventType); + event.SetInt(value); + event.SetString(valueType); + wxPostEvent(this, event); +} + +// cj_1 +bool StatusPanel::judgeAxis() +{ + long nozzleTemp = 0; + m_tempCtrl_nozzle->GetLabel().ToLong(&nozzleTemp); + + if (nozzleTemp < 170) { + MessageDialog msg_dlg(nullptr, _L("Please heat the nozzle to above 170 degree before loading or unloading filament."), + wxEmptyString, wxOK); + msg_dlg.ShowModal(); + return false; + } + return true; +} + void StatusPanel::on_start_calibration(wxCommandEvent &event) { if (obj) { @@ -4817,6 +5684,25 @@ void StatusPanel::on_start_calibration(wxCommandEvent &event) } } +//cj_1 +void StatusPanel::on_selected_type(wxCommandEvent& event) +{ + wxString typeNameAddVendor = event.GetString(); + wxString typeName = ""; + if (typeNameAddVendor.find(" ") != std::string::npos) { + typeName = typeNameAddVendor.substr(typeNameAddVendor.find(" ") + 1); + } + + if (typeName.IsEmpty()) { + return; + } + for (auto filament : m_filamentConfig) { + if (filament.name == typeName) { + m_filament_setting_dlg->setMinMaxTemp(std::to_string(filament.minTemp), std::to_string(filament.maxTemp)); + } + } +} + bool StatusPanel::is_stage_list_info_changed(MachineObject *obj) { if (!obj) return true; @@ -4851,11 +5737,18 @@ void StatusPanel::set_default() m_bitmap_timelapse_img->Hide(); m_bitmap_recording_img->Hide(); m_bitmap_vcamera_img->Hide(); - m_setting_button->Show(); + + //y76 + m_setting_button->Hide(); + //m_setting_button->Show(); + + m_tempCtrl_chamber->Show(); - m_options_btn->Show(); - m_safety_btn->Show(); - m_parts_btn->Show(); + +//cj_1 + m_options_btn->Hide(); + m_safety_btn->Hide(); + m_parts_btn->Hide(); if (m_panel_control_title) { m_panel_control_title->Layout(); diff --git a/src/slic3r/GUI/StatusPanel.hpp b/src/slic3r/GUI/StatusPanel.hpp index dcd7954..dfdae19 100644 --- a/src/slic3r/GUI/StatusPanel.hpp +++ b/src/slic3r/GUI/StatusPanel.hpp @@ -37,6 +37,9 @@ #include "PartSkipDialog.hpp" #include "DeviceErrorDialog.hpp" +//y76 +#include "QDSDeviceManager.hpp" + class StepIndicator; #define COMMAND_TIMEOUT 5 @@ -47,6 +50,28 @@ class DevExtderSystem; namespace GUI { +//cj_1 + wxDECLARE_EVENT(EVTSET_EXTRUESION, wxCommandEvent); + wxDECLARE_EVENT(EVTSET_BACK, wxCommandEvent); + wxDECLARE_EVENT(EVTSET_COOLER_SWITCH, wxCommandEvent); + wxDECLARE_EVENT(EVTSET_COOLER_ENABLE, wxCommandEvent); + wxDECLARE_EVENT(EVTSET_LEVELING_ENABLE, wxCommandEvent); + wxDECLARE_EVENT(EVTSET_AMS_ENABLE, wxCommandEvent); + wxDECLARE_EVENT(EVTSET_CASE_LIGHT, wxCommandEvent); + wxDECLARE_EVENT(EVTSET_BEEPER_SWITHC, wxCommandEvent); + wxDECLARE_EVENT(EVTSET_EXTRUDER_TEMPERATURE, wxCommandEvent); + wxDECLARE_EVENT(EVTSET_HEATERBED_TEMPERATURE, wxCommandEvent); + wxDECLARE_EVENT(EVTSET_CHAMBER_TEMPERATURE, wxCommandEvent); + wxDECLARE_EVENT(EVTSET_RETURN_SAFEHOME, wxCommandEvent); + wxDECLARE_EVENT(EVTSET_X_AXIS, wxCommandEvent); + wxDECLARE_EVENT(EVTSET_Y_AXIS, wxCommandEvent); + wxDECLARE_EVENT(EVTSET_Z_AXIS, wxCommandEvent); + wxDECLARE_EVENT(EVTSET_PRINT_CONTROL, wxCommandEvent); //print/control + wxDECLARE_EVENT(EVTSET_FILAMENT_TYPE, wxCommandEvent); ///filament/type + wxDECLARE_EVENT(EVTSET_FILAMENT_VENDOR, wxCommandEvent); ///filament/vendor + wxDECLARE_EVENT(EVTSET_FILAMENT_LOAD, wxCommandEvent); ///set/filament/load + wxDECLARE_EVENT(EVTSET_FILAMENT_UNLOAD, wxCommandEvent); ///set/filament/unload + // Previous definitions class MessageDialog; class wgtDeviceNozzleRack; @@ -568,6 +593,14 @@ protected: Button *m_button_retry {nullptr}; StaticBox* m_filament_load_box; +//y76 + wxPanel* m_task_list_panel = nullptr; + wxPanel* m_panel_task_title = nullptr; + Label* m_staticText_task = nullptr; + wxScrolledWindow* m_scroll_files = nullptr; + wxBoxSizer* m_file_list_sizer = nullptr; +//y76 + // Virtual event handlers, override them in your derived class virtual void on_subtask_partskip(wxCommandEvent &event) { event.Skip(); } virtual void on_subtask_pause_resume(wxCommandEvent &event) { event.Skip(); } @@ -623,6 +656,21 @@ public: void jump_to_Rack(); + //cj1 + void update_temp_data(std::string nozzle, std::string bed, std::string chamber); + void update_temp_target(std::string nozzle, std::string bed, std::string chamber); + //y76 + void update_light_status(bool on); + + wxBoxSizer* create_task_list_group(wxWindow *parent); + void init_empty_task_list(); + + void update_task_list_layout(); + + void clear_task_list(); + + void update_task_list(const std::vector& files); + private: void on_ams_rack_switch(wxCommandEvent& event); }; @@ -630,8 +678,37 @@ private: class StatusPanel : public StatusBasePanel { + +//cj_1 +public: + void update_progress(std::string fileName, std::string layer,std::string totalTime,std::string weight, float remainingTime, float progress); + + void update_camera_url(std::string url); + + void update_print_status(std::string status); + + void update_thumbnail(std::string url); + + void update_boxs(std::vector boxS, std::vector ext_info); + + void update_cur_slot(int curSlotSyncIndex); + + void set_filament_config(std::vectorconfig); + + void pause_camera(); + + void update_AMSSettingData(bool autoRead, bool initDetect, bool autoReload); + + void update_fan_speed(AIR_FUN id, int speed); + + void update_temp_ctrl(std::shared_ptr obj); +//cj_1 + void update_homed_axes(std::string homed_axes) { m_homed_axes = homed_axes; } private: friend class MonitorPanel; + //cj_1 + std::vectorm_filamentConfig; + bool m_isInitConfig{ false }; protected: std::shared_ptr m_slice_info_popup; @@ -765,6 +842,9 @@ protected: /* calibration */ void on_start_calibration(wxCommandEvent &event); + //cj_1 + void on_selected_type(wxCommandEvent& event); + /* update apis */ void update(MachineObject* obj); @@ -777,7 +857,8 @@ protected: void update_partskip_subtask(MachineObject *obj); void update_cloud_subtask(MachineObject *obj); void update_sdcard_subtask(MachineObject *obj); - void update_temp_ctrl(MachineObject *obj); + //y76 + //void update_temp_ctrl(MachineObject *obj); void update_misc_ctrl(MachineObject *obj); void update_ams(MachineObject* obj); void update_filament_loading_panel(MachineObject* obj); @@ -803,6 +884,12 @@ protected: // printer parts options void update_printer_parts_options(MachineObject* obj); + +private: + // cj_1 + void postEventValueAndEnable(wxEventType eventType, int value, std::string valueType); + //cj_1 + bool judgeAxis(); public: void update_error_message(); @@ -846,6 +933,22 @@ public: void rescale_camera_icons(); void on_sys_color_changed(); void msw_rescale(); + +//cj_1 +private: + std::vector m_boxS; + std::vector m_ext_info; + int curSelectSlotIndex = 0; + int m_curSlotSync = -1; + bool m_auto_read_rfid{ false }; + bool m_init_detect{ false }; + bool m_auto_reload_detect{ false }; + +//cj_1 + std::map< AIR_FUN, int> m_fan_speeds; + + //cj_1 + std::string m_homed_axes{ "" }; }; } } diff --git a/src/slic3r/GUI/SyncAmsInfoDialog.cpp b/src/slic3r/GUI/SyncAmsInfoDialog.cpp index 890600e..173e3f9 100644 --- a/src/slic3r/GUI/SyncAmsInfoDialog.cpp +++ b/src/slic3r/GUI/SyncAmsInfoDialog.cpp @@ -3253,7 +3253,7 @@ SyncNozzleAndAmsDialog::SyncNozzleAndAmsDialog(InputInfo &input_info) wxGetApp().preset_bundle->get_printer_extruder_count() == 1 ? 370 :320, input_info.dialog_pos, 90, - wxGetApp().preset_bundle->get_printer_extruder_count() == 1 ? _L("Successfully synchronized nozzle information.") : + wxGetApp().preset_bundle->get_printer_extruder_count() == 1 ? _L("Successfully synchronized printer information.") : _L("Successfully synchronized nozzle and AMS number information."), _L("Continue to sync filaments"), _CTX(L_CONTEXT("Cancel", "Sync_Nozzle_BOX"), "Sync_Nozzle_BOX"), diff --git a/src/slic3r/GUI/SyncBoxInfoDialog.cpp b/src/slic3r/GUI/SyncBoxInfoDialog.cpp index e3860cb..1b86706 100644 --- a/src/slic3r/GUI/SyncBoxInfoDialog.cpp +++ b/src/slic3r/GUI/SyncBoxInfoDialog.cpp @@ -3217,7 +3217,8 @@ SyncNozzleAndBoxDialog::~SyncNozzleAndBoxDialog() {} void SyncNozzleAndBoxDialog::deal_ok() { on_hide(); - wxGetApp().plater()->sidebar().sync_ams_list(true); + //y76 + wxGetApp().plater()->sidebar().sync_box_list(true); } void SyncNozzleAndBoxDialog::deal_cancel() @@ -3297,7 +3298,7 @@ GetBoxInfoDialog::GetBoxInfoDialog(Plater* plater) switch_button_panel->SetBackgroundColour(StateColor::darkModeColorFor(wxColour("#FFFFFF"))); m_switch_button = new SwitchButton(switch_button_panel); m_switch_button->SetMaxSize(wxSize(100, 100)); - m_switch_button->SetLabels(_L("Local"), _L("Link")); + m_switch_button->SetLabels(_L("Local"), _L("Net")); m_switch_button->SetValue(m_isNetMode); m_switch_button->Bind(wxEVT_TOGGLEBUTTON, [this](wxCommandEvent& evt) { bool is_checked = evt.GetInt(); diff --git a/src/slic3r/GUI/WebUserLoginDialog.cpp b/src/slic3r/GUI/WebUserLoginDialog.cpp index b4828d9..bf8cfb3 100644 --- a/src/slic3r/GUI/WebUserLoginDialog.cpp +++ b/src/slic3r/GUI/WebUserLoginDialog.cpp @@ -54,7 +54,12 @@ ZUserLogin::ZUserLogin() : wxDialog((wxWindow*)(wxGetApp().mainframe), wxID_ANY, #if QDT_RELEASE_TO_PUBLIC wxString msg; QIDINetwork m_qidinetwork; - TargetUrl = m_qidinetwork.get_qidi_host(); + if (wxGetApp().app_config->get("login_method") == "Maker") { + TargetUrl = m_qidinetwork.get_maker_host(); + } + else { + TargetUrl = m_qidinetwork.get_qidi_host(); + } #endif m_qdt_user_agent = wxString::Format("QDT-Slicer/v%s", SLIC3R_VERSION); diff --git a/src/slic3r/GUI/WebViewDialog.cpp b/src/slic3r/GUI/WebViewDialog.cpp index c0059b0..8c8812f 100644 --- a/src/slic3r/GUI/WebViewDialog.cpp +++ b/src/slic3r/GUI/WebViewDialog.cpp @@ -20,6 +20,8 @@ #include #include #include +#include +#include #include @@ -40,6 +42,7 @@ namespace GUI { WebViewPanel::WebViewPanel(wxWindow *parent) : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize) + , m_contentname("home") { m_Region = wxGetApp().app_config->get_country_code(); m_loginstatus = -1; @@ -355,12 +358,18 @@ wxString WebViewPanel::MakeDisconnectUrl(std::string MenuName) void WebViewPanel::load_url(wxString& url) { + m_browser->Unbind(wxEVT_WEBVIEW_SCRIPT_MESSAGE_RECEIVED, &WebViewPanel::onLoginHandle, this, m_browser->GetId()); this->Show(); this->Raise(); - m_url->SetLabelText(url); + if (m_url != nullptr) { - if (wxGetApp().get_mode() == comDevelop) - wxLogMessage(m_url->GetValue()); + m_url->SetLabelText(url); + if (wxGetApp().get_mode() == comDevelop) + wxLogMessage(m_url->GetValue()); + } + if (m_browser->GetCurrentURL().Contains("home.html") && url.Contains("home.html")) { + return; + } m_browser->LoadURL(url); m_browser->SetFocus(); UpdateState(); @@ -584,6 +593,45 @@ void WebViewPanel::OnFreshLoginStatus(wxTimerEvent &event) } } +void WebViewPanel::onLoginHandle(const wxWebViewEvent& evt) +{ + int index = 3; + try { + json j = json::parse(evt.GetString()); + std::cout << "---" << j << std::endl; + index = j["index"].get(); + } + catch (...) { + + } + + switch (index) + { + case 1: + { + wxGetApp().app_config->set("login_method", "Maker"); + } + break; + case 2: + { + wxGetApp().app_config->set("login_method", "Link"); + + } + break; + default: + wxString UrlRight = wxString::Format("file://%s/web/homepage3/home.html", from_u8(resources_dir())); + load_url(UrlRight); + return; + break; + } + CallAfter([this] { + wxGetApp().request_login(true); + wxString UrlRight = wxString::Format("file://%s/web/homepage3/home.html", from_u8(resources_dir())); + load_url(UrlRight); + m_browser->Unbind(wxEVT_WEBVIEW_SCRIPT_MESSAGE_RECEIVED, &WebViewPanel::onLoginHandle, this, m_browser->GetId()); + }); +} + void WebViewPanel::SendRecentList(int images) { boost::property_tree::wptree req; @@ -1392,9 +1440,9 @@ void WebViewPanel::OnNavigationComplete(wxWebViewEvent& evt) m_online_last_url = TmpNowUrl; } - if (m_browser != nullptr && evt.GetId() == m_browser->GetId()) - { - SwitchWebContent("home"); + if (m_browser != nullptr && evt.GetId() == m_browser->GetId()) + { + SwitchWebContent(m_contentname); if (wxGetApp().app_config->get("staff_pick_switch") == "true") SendDesignStaffpick(true); else @@ -1829,8 +1877,9 @@ void WebViewPanel::SetPrintHistoryTaskID(int TaskID) void WebViewPanel::SwitchWebContent(std::string modelname, int refresh) { - m_contentname = modelname; - + if (modelname != "login") { + m_contentname = modelname; + } CheckMenuNewTag(); wxString strlang = GetStudioLanguage(); @@ -1968,7 +2017,6 @@ void WebViewPanel::SwitchWebContent(std::string modelname, int refresh) } else if (modelname.compare("home") == 0 || modelname.compare("recent") == 0 ) { if (!m_browser) return; - json m_Res = json::object(); m_Res["command"] = "homepage_leftmenu_clicked"; m_Res["sequence_id"] = "10001"; @@ -1984,6 +2032,21 @@ void WebViewPanel::SwitchWebContent(std::string modelname, int refresh) SetWebviewShow("right", true); SetWebviewShow("makerlab", false); SetWebviewShow("wiki", false); + } + //cj_1 + else if (modelname.compare("login") == 0) { + if (!m_browser) return; + if (m_browser->GetCurrentURL().Contains("login.html")) { + return; + } + wxString htmlUrl = wxString::Format("file:///%s/web/homepage3/login.html", from_u8(resources_dir())); + + m_browser->LoadURL(htmlUrl); + + m_browser->Bind(wxEVT_WEBVIEW_SCRIPT_MESSAGE_RECEIVED,&WebViewPanel::onLoginHandle,this,m_browser->GetId()); + + + } GetSizer()->Layout(); diff --git a/src/slic3r/GUI/WebViewDialog.hpp b/src/slic3r/GUI/WebViewDialog.hpp index 5fd6977..d00655a 100644 --- a/src/slic3r/GUI/WebViewDialog.hpp +++ b/src/slic3r/GUI/WebViewDialog.hpp @@ -92,7 +92,8 @@ public: wxTimer * m_LoginUpdateTimer{nullptr}; void OnFreshLoginStatus(wxTimerEvent &event); - + //cj_1 + void onLoginHandle(const wxWebViewEvent& evt); public: void ResetWholePage(); @@ -187,7 +188,7 @@ private: wxButton * m_button_forward; wxButton * m_button_stop; wxButton * m_button_reload; - wxTextCtrl *m_url; + wxTextCtrl* m_url{ nullptr }; wxButton * m_button_tools; wxMenu* m_tools_menu; diff --git a/src/slic3r/GUI/Widgets/AMSControl.cpp b/src/slic3r/GUI/Widgets/AMSControl.cpp index 895cf04..9befc07 100644 --- a/src/slic3r/GUI/Widgets/AMSControl.cpp +++ b/src/slic3r/GUI/Widgets/AMSControl.cpp @@ -30,11 +30,34 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons , m_percent_humidity_dry_popup(new uiAmsPercentHumidityDryPopup(this)) , m_ams_introduce_popup(AmsIntroducePopup(this)) { - Slic3r::DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); - if (dev) { - MachineObject *obj = dev->get_selected_machine(); - parse_object(obj); - } + // NOTE: Previously this constructor queried DeviceManager and parsed MachineObject + // to populate `m_ams_info`. To decouple AMSControl from DeviceManager/MachineObject + // we no longer perform that automatic query here. Callers should inject data via + // `SetData(...)` (added) after constructing the control. + + // cj_1 + StateColor btn_bg_blue(std::pair(AMS_CONTROL_DISABLE_COLOUR, StateColor::Disabled), + std::pair(wxColour(54, 97, 201), StateColor::Pressed), + std::pair(wxColour(78, 133, 255), StateColor::Hovered), + std::pair(AMS_CONTROL_BRAND_COLOUR, StateColor::Normal)); + + StateColor btn_bg_white(std::pair(AMS_CONTROL_DISABLE_COLOUR, StateColor::Disabled), + std::pair(AMS_CONTROL_DISABLE_COLOUR, StateColor::Pressed), + std::pair(AMS_CONTROL_DEF_BLOCK_BK_COLOUR, StateColor::Hovered), + std::pair(AMS_CONTROL_WHITE_COLOUR, StateColor::Normal)); + + StateColor btn_bd_blue(std::pair(wxColour(255, 255, 254), StateColor::Disabled), + std::pair(AMS_CONTROL_BRAND_COLOUR, StateColor::Enabled)); + + StateColor btn_bd_white(std::pair(wxColour(255, 255, 254), StateColor::Disabled), + std::pair(wxColour(38, 46, 48), StateColor::Enabled)); + + StateColor btn_text_blue(std::pair(wxColour(255, 255, 254), StateColor::Disabled), + std::pair(wxColour(255, 255, 254), StateColor::Enabled)); + + StateColor btn_text_white(std::pair(wxColour(255, 255, 254), StateColor::Disabled), + std::pair(wxColour(38, 46, 48), StateColor::Enabled)); + SetBackgroundColour(*wxWHITE); // normal mode @@ -46,41 +69,34 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons m_amswin->SetMinSize(wxSize(FromDIP(578), -1)); - m_sizer_ams_items = new wxBoxSizer(wxHORIZONTAL); + m_sizer_ams_items = new wxBoxSizer(wxHORIZONTAL); { - /*right items*/ - m_panel_prv_left = new wxScrolledWindow(m_amswin, wxID_ANY); - m_panel_prv_left->SetScrollRate(10, 0); - m_panel_prv_left->SetSize(AMS_ITEMS_PANEL_SIZE); - m_panel_prv_left->SetMinSize(AMS_ITEMS_PANEL_SIZE); - //m_panel_prv_left->SetBackgroundColour(0x4169E1); - m_panel_prv_left->SetBackgroundColour(AMS_CONTROL_DEF_BLOCK_BK_COLOUR); - m_sizer_prv_left = new wxBoxSizer(wxHORIZONTAL); - m_panel_prv_left->SetSizer(m_sizer_prv_left); - m_panel_prv_left->Layout(); - //m_sizer_items_left->Fit(m_panel_prv_left); + /*right items*/ + m_panel_prv_left = new wxScrolledWindow(m_amswin, wxID_ANY); + m_panel_prv_left->SetScrollRate(10, 0); + m_panel_prv_left->SetSize(AMS_ITEMS_PANEL_SIZE); + m_panel_prv_left->SetMinSize(AMS_ITEMS_PANEL_SIZE); - /*right items*/ - m_panel_prv_right = new wxScrolledWindow(m_amswin, wxID_ANY); - m_panel_prv_right->SetScrollRate(10, 0); - m_panel_prv_right->SetSize(AMS_ITEMS_PANEL_SIZE); - m_panel_prv_right->SetMinSize(AMS_ITEMS_PANEL_SIZE); - //m_panel_prv_right->SetBackgroundColour(0x4169E1); - m_panel_prv_right->SetBackgroundColour(AMS_CONTROL_DEF_BLOCK_BK_COLOUR); - m_sizer_prv_right = new wxBoxSizer(wxHORIZONTAL); - m_panel_prv_right->SetSizer(m_sizer_prv_right); - m_panel_prv_right->Layout(); - //m_sizer_items_right->Fit(m_panel_prv_right); + m_panel_prv_left->SetBackgroundColour(AMS_CONTROL_DEF_BLOCK_BK_COLOUR); //AMS_EXTRUDER_DEF_COLOUR + m_sizer_prv_left = new wxBoxSizer(wxHORIZONTAL); + m_panel_prv_left->SetSizer(m_sizer_prv_left); + m_panel_prv_left->Layout(); - /*m_sizer_ams_items->Add(m_panel_prv_left, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, FromDIP(5)); - m_sizer_ams_items->Add(m_panel_prv_right, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, FromDIP(5));*/ + m_panel_prv_right = new wxScrolledWindow(m_amswin, wxID_ANY); + m_panel_prv_right->SetScrollRate(10, 0); + m_panel_prv_right->SetSize(AMS_ITEMS_PANEL_SIZE); + m_panel_prv_right->SetMinSize(AMS_ITEMS_PANEL_SIZE); + //m_panel_prv_right->SetBackgroundColour(0x4169E1); + m_panel_prv_right->SetBackgroundColour(AMS_CONTROL_DEF_BLOCK_BK_COLOUR); + m_sizer_prv_right = new wxBoxSizer(wxHORIZONTAL); + m_panel_prv_right->SetSizer(m_sizer_prv_right); + m_panel_prv_right->Layout(); + //m_sizer_items_right->Fit(m_panel_prv_right); + } + m_sizer_ams_items->Add(m_panel_prv_left, 0, wxLEFT | wxRIGHT, FromDIP(5)); m_sizer_ams_items->Add(m_panel_prv_right, 0, wxLEFT | wxRIGHT, FromDIP(5)); - - //m_panel_prv_right->Hide(); - - //m_sizer_ams_body = new wxBoxSizer(wxHORIZONTAL); - + m_sizer_ams_body = new wxBoxSizer(wxHORIZONTAL); //ams area @@ -92,7 +108,7 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons m_simplebook_ams_left->SetBackgroundColour(AMS_CONTROL_DEF_BLOCK_BK_COLOUR); //m_sizer_ams_area_left->Add(m_simplebook_ams_left, 0, wxLEFT | wxRIGHT, FromDIP(5)); m_sizer_ams_area_left->Add(m_simplebook_ams_left, 0, wxALIGN_CENTER, 0); - + m_simplebook_ams_right = new wxSimplebook(m_amswin, wxID_ANY, wxDefaultPosition, AMS_CANS_WINDOW_SIZE, 0); m_simplebook_ams_right->SetBackgroundColour(AMS_CONTROL_DEF_BLOCK_BK_COLOUR); //m_sizer_ams_area_right->Add(m_simplebook_ams_right, 0, wxLEFT | wxRIGHT, FromDIP(5)); @@ -108,7 +124,6 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons // m_simplebook_ams_right->SetBackgroundColour(AMS_CONTROL_DEF_BLOCK_BK_COLOUR); - m_sizer_ams_area_left->Layout(); m_sizer_ams_area_right->Layout(); @@ -133,28 +148,6 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons m_panel_option_right->SetMinSize(wxSize(FromDIP(180), -1)); m_panel_option_right->SetMaxSize(wxSize(FromDIP(180), -1)); - StateColor btn_bg_blue(std::pair(AMS_CONTROL_DISABLE_COLOUR, StateColor::Disabled), - std::pair(wxColour(54, 97, 201), StateColor::Pressed), - std::pair(wxColour(78, 133, 255), StateColor::Hovered), - std::pair(AMS_CONTROL_BRAND_COLOUR, StateColor::Normal)); - - StateColor btn_bg_white(std::pair(AMS_CONTROL_DISABLE_COLOUR, StateColor::Disabled), - std::pair(AMS_CONTROL_DISABLE_COLOUR, StateColor::Pressed), - std::pair(AMS_CONTROL_DEF_BLOCK_BK_COLOUR, StateColor::Hovered), - std::pair(AMS_CONTROL_WHITE_COLOUR, StateColor::Normal)); - - StateColor btn_bd_blue(std::pair(wxColour(255, 255, 254), StateColor::Disabled), - std::pair(AMS_CONTROL_BRAND_COLOUR, StateColor::Enabled)); - - StateColor btn_bd_white(std::pair(wxColour(255, 255, 254), StateColor::Disabled), - std::pair(wxColour(38, 46, 48), StateColor::Enabled)); - - StateColor btn_text_blue(std::pair(wxColour(255, 255, 254), StateColor::Disabled), - std::pair(wxColour(255, 255, 254), StateColor::Enabled)); - - StateColor btn_text_white(std::pair(wxColour(255, 255, 254), StateColor::Disabled), - std::pair(wxColour(38, 46, 48), StateColor::Enabled)); - /*option left*/ m_button_auto_refill = new Button(m_panel_option_left, _L("Auto-refill")); @@ -170,6 +163,7 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons m_button_ams_setting_press = ScalableBitmap(this, "ams_setting_press", 24); m_button_ams_setting = new wxStaticBitmap(m_panel_option_left, wxID_ANY, m_button_ams_setting_normal.bmp(), wxDefaultPosition, wxSize(FromDIP(24), FromDIP(24))); + m_sizer_option_left->Add(m_button_auto_refill, 0, wxALIGN_CENTER, 0); m_sizer_option_left->Add(0, 0, 0, wxLEFT, FromDIP(20)); m_sizer_option_left->Add(m_button_ams_setting, 0, wxALIGN_CENTER, 0); @@ -180,8 +174,9 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons m_sizer_option_mid->Add( m_extruder, 0, wxALIGN_CENTER, 0 ); - /*option right*/ - m_button_extruder_feed = new Button(m_panel_option_right, _L("Load")); + /*option right*/ // cj_1 + m_button_extruder_feed = new Button(m_panel_option_right, _L("Load"));{ + m_button_extruder_feed->SetFont(Label::Body_13); m_button_extruder_feed->SetBackgroundColor(btn_bg_blue); m_button_extruder_feed->SetBorderColor(btn_bd_blue); @@ -189,7 +184,7 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons m_button_extruder_feed->SetMinSize(wxSize(FromDIP(80),FromDIP(34))); m_button_extruder_feed->SetMaxSize(wxSize(FromDIP(80),FromDIP(34))); m_button_extruder_feed->EnableTooltipEvenDisabled(); - + if (wxGetApp().app_config->get("language") == "de_DE") m_button_extruder_feed->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "fr_FR") m_button_extruder_feed->SetFont(Label::Body_9); @@ -201,29 +196,28 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons if (wxGetApp().app_config->get("language") == "cs_CZ") m_button_extruder_feed->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "uk_UA") m_button_extruder_feed->SetFont(Label::Body_9); if (wxGetApp().app_config->get("language") == "pt_BR") m_button_extruder_feed->SetLabel("Load"); + } + m_button_extruder_back = new Button(m_panel_option_right, _L("Unload")); { + m_button_extruder_back->SetBackgroundColor(btn_bg_white); + m_button_extruder_back->SetBorderColor(btn_bd_white); + m_button_extruder_back->SetTextColor(btn_text_white); + m_button_extruder_back->SetFont(Label::Body_13); + m_button_extruder_back->SetMinSize(wxSize(FromDIP(80), FromDIP(34))); + m_button_extruder_back->SetMaxSize(wxSize(FromDIP(80), FromDIP(34))); + m_button_extruder_back->EnableTooltipEvenDisabled(); + + if (wxGetApp().app_config->get("language") == "de_DE") m_button_extruder_back->SetFont(Label::Body_9); + if (wxGetApp().app_config->get("language") == "fr_FR") m_button_extruder_back->SetFont(Label::Body_9); + if (wxGetApp().app_config->get("language") == "ru_RU") m_button_extruder_back->SetLabel("Unload"); + if (wxGetApp().app_config->get("language") == "nl_NL") m_button_extruder_back->SetFont(Label::Body_9); + if (wxGetApp().app_config->get("language") == "hu_HU") m_button_extruder_back->SetFont(Label::Body_9); + if (wxGetApp().app_config->get("language") == "ja_JP") m_button_extruder_back->SetFont(Label::Body_9); + if (wxGetApp().app_config->get("language") == "sv_SE") m_button_extruder_back->SetFont(Label::Body_9); + if (wxGetApp().app_config->get("language") == "cs_CZ") m_button_extruder_back->SetFont(Label::Body_9); + if (wxGetApp().app_config->get("language") == "uk_UA") m_button_extruder_back->SetFont(Label::Body_9); + if (wxGetApp().app_config->get("language") == "pt_BR") m_button_extruder_back->SetLabel("Unload"); + } - m_button_extruder_back = new Button(m_panel_option_right, _L("Unload")); - m_button_extruder_back->SetBackgroundColor(btn_bg_white); - m_button_extruder_back->SetBorderColor(btn_bd_white); - m_button_extruder_back->SetTextColor(btn_text_white); - m_button_extruder_back->SetFont(Label::Body_13); - m_button_extruder_back->SetMinSize(wxSize(FromDIP(80), FromDIP(34))); - m_button_extruder_back->SetMaxSize(wxSize(FromDIP(80), FromDIP(34))); - m_button_extruder_back->EnableTooltipEvenDisabled(); - - if (wxGetApp().app_config->get("language") == "de_DE") m_button_extruder_back->SetFont(Label::Body_9); - if (wxGetApp().app_config->get("language") == "fr_FR") m_button_extruder_back->SetFont(Label::Body_9); - if (wxGetApp().app_config->get("language") == "ru_RU") m_button_extruder_back->SetLabel("Unload"); - if (wxGetApp().app_config->get("language") == "nl_NL") m_button_extruder_back->SetFont(Label::Body_9); - if (wxGetApp().app_config->get("language") == "hu_HU") m_button_extruder_back->SetFont(Label::Body_9); - if (wxGetApp().app_config->get("language") == "ja_JP") m_button_extruder_back->SetFont(Label::Body_9); - if (wxGetApp().app_config->get("language") == "sv_SE") m_button_extruder_back->SetFont(Label::Body_9); - if (wxGetApp().app_config->get("language") == "cs_CZ") m_button_extruder_back->SetFont(Label::Body_9); - if (wxGetApp().app_config->get("language") == "uk_UA") m_button_extruder_back->SetFont(Label::Body_9); - if (wxGetApp().app_config->get("language") == "pt_BR") m_button_extruder_back->SetLabel("Unload"); - - - //m_sizer_option_right->Add(0, 0, 1, wxEXPAND, 0); m_sizer_option_right->Add(m_button_extruder_back, 0, wxLEFT, FromDIP(0)); m_sizer_option_right->Add(m_button_extruder_feed, 0, wxLEFT, FromDIP(20)); @@ -256,8 +250,7 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons SetMinSize(m_amswin->GetSize()); - AddPage(m_amswin, wxEmptyString, false); - + AddPage(m_amswin, wxEmptyString, false); m_button_extruder_feed->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(AMSControl::on_filament_load), NULL, this); m_button_extruder_back->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(AMSControl::on_filament_unload), NULL, this); @@ -306,6 +299,7 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons delete info; }); Bind(EVT_AMS_ON_SELECTED, &AMSControl::AmsSelectedSwitch, this); + } void AMSControl::on_retry() @@ -363,6 +357,10 @@ bool AMSControl::IsAmsInRightPanel(std::string ams_id) { } void AMSControl::AmsSelectedSwitch(wxCommandEvent& event) { + + std::string slotId = event.GetString().ToStdString(); + event.Skip(); + std::string ams_id_selected = std::to_string(event.GetInt()); if (m_current_ams != ams_id_selected){ m_current_ams = ams_id_selected; @@ -565,14 +563,14 @@ void AMSControl::CreateAms() std::vector::iterator it; //Freeze(); for (it = ams_info.begin(); it != ams_info.end(); it++) { - AddAmsPreview(*it, AMSModel::GENERIC_AMS); + //AddAmsPreview(*it, AMSModel::GENERIC_AMS); AddAms(*it); //AddExtraAms(*it); m_ams_info.push_back(*it); } if (m_single_nozzle_no_ams) { - m_simplebook_ams_left->Hide(); + //m_simplebook_ams_left->Hide(); } else { m_sizer_prv_left->Layout(); @@ -695,6 +693,8 @@ void AMSControl::CreateAmsDoubleNozzle(const std::string &series_name, const std if (m_ams_info.size() > 0){ m_panel_prv_left->Show(); m_panel_prv_right->Show(); + + } else{ m_panel_prv_left->Hide(); @@ -790,6 +790,7 @@ void AMSControl::CreateAmsSingleNozzle(const std::string &series_name, const std if (m_ams_info.size() > 1){ m_sizer_prv_right->Layout(); m_panel_prv_right->Show(); + } m_down_road->UpdateLeft(1, left_init_mode); m_down_road->UpdateRight(1, right_init_mode); @@ -1018,6 +1019,102 @@ void AMSControl::UpdateAms(const std::string &series_name, } } +// cj_1 +void AMSControl::SetData(const std::vector& ams_info, + const std::vector& ext_info, + int total_ext_count, + const std::string& dev_id, + const std::string& series_name, + const std::string& printer_type, + bool is_reset) +{ + // Lightweight data injection path that mirrors parts of UpdateAms but + // does not require DevExtderSystem or MachineObject. This is intended + // to decouple AMSControl from device-level structures: callers should + // transform device data to AMSinfo/Caninfo and call SetData. + ClearAms(); + m_ams_info = ams_info; + m_ext_info = ext_info; + m_total_ext_count = total_ext_count; + m_dev_id = dev_id; + + // Rebuild UI when the AMS set changed + //ClearAms(); + if (m_total_ext_count >= 2) { + CreateAmsDoubleNozzle(series_name, printer_type); + } else { + CreateAmsSingleNozzle(series_name, printer_type); + } + + + // update cans + +// for (auto ams_item : m_ams_item_list) { +// if (ams_item.second == nullptr) { +// continue; +// } +// std::string ams_id = ams_item.second->get_ams_id(); +// AmsItem* cans = ams_item.second; +// if (cans->get_ams_id() == std::to_string(VIRTUAL_TRAY_MAIN_ID) || cans->get_ams_id() == std::to_string(VIRTUAL_TRAY_DEPUTY_ID)) { +// for (auto ifo : m_ext_info) { +// if (ifo.ams_id == ams_id) { +// cans->Update(ifo); +// cans->show_sn_value(m_ams_model == AMSModel::AMS_LITE ? false : true); +// } +// } +// } +// else { +// for (auto ifo : m_ams_info) { +// if (ifo.ams_id == ams_id) { +// cans->Update(ifo); +// cans->show_sn_value(m_ams_model == AMSModel::AMS_LITE ? false : true); +// } +// } +// } +// } +// +// for (auto ams_prv : m_ams_preview_list) { +// std::string id = ams_prv.second->get_ams_id(); +// auto item = m_ams_item_list.find(id); +// if (item != m_ams_item_list.end()) +// { +// ams_prv.second->Update(item->second->get_ams_info()); +// } +// } +// +// +// /*update humidity popup*/ +// if (m_percent_humidity_dry_popup->IsShown()) +// { +// string target_id = m_percent_humidity_dry_popup->get_owner_ams_id(); +// for (const auto& the_info : ams_info) +// { +// if (target_id == the_info.ams_id) +// { +// uiAmsHumidityInfo humidity_info; +// humidity_info.ams_id = the_info.ams_id; +// humidity_info.humidity_display_idx = the_info.get_humidity_display_idx(); +// humidity_info.humidity_percent = the_info.humidity_raw; +// humidity_info.left_dry_time = the_info.left_dray_time; +// humidity_info.current_temperature = the_info.current_temperature; +// m_percent_humidity_dry_popup->Update(&humidity_info); +// break; +// } +// } +// } +// +// /*update ams extruder*/ +// if (m_extruder->updateNozzleNum(m_total_ext_count, series_name)) +// { +// m_amswin->Layout(); +// } +// + + SetSize(wxSize(FromDIP(578), -1)); + SetMinSize(wxSize(FromDIP(578), -1)); + //Layout(); +} + void AMSControl::AddAmsPreview(AMSinfo info, AMSModel type) { AMSPreview *ams_prv = nullptr; @@ -1039,6 +1136,7 @@ void AMSControl::AddAmsPreview(AMSinfo info, AMSModel type) e.Skip(); }); m_ams_preview_list[info.ams_id] = ams_prv; + // ams_prv->Hide(); } } @@ -1595,8 +1693,11 @@ void AMSControl::SetAmsStep(std::string ams_id, std::string canid, AMSPassRoadTy void AMSControl::on_filament_load(wxCommandEvent &event) { + post_event(SimpleEvent(EVT_AMS_LOAD)); + return; /*If the filament is unknown, show warning*/ const auto& filament_id = get_filament_id(m_current_ams, GetCurrentCan(m_current_ams)); + if (filament_id.empty()) { MessageDialog msg_dlg(nullptr, _L("Filament type is unknown which is required to perform this action. Please set target filament's informations."), @@ -1621,6 +1722,8 @@ void AMSControl::on_extrusion_cali(wxCommandEvent &event) void AMSControl::on_filament_unload(wxCommandEvent &event) { + post_event(SimpleEvent(EVT_AMS_UNLOAD)); + return; for (auto i = 0; i < m_ams_info.size(); i++) { if (m_ams_info[i].ams_id == m_current_ams) { m_ams_info[i].current_action = AMSAction::AMS_ACTION_UNLOAD; } } diff --git a/src/slic3r/GUI/Widgets/AMSControl.hpp b/src/slic3r/GUI/Widgets/AMSControl.hpp index 8116514..04d70f1 100644 --- a/src/slic3r/GUI/Widgets/AMSControl.hpp +++ b/src/slic3r/GUI/Widgets/AMSControl.hpp @@ -163,6 +163,14 @@ public: std::string dev_id, bool is_reset = true, bool test = false); + // cj_1 New API to inject AMS data directly (decoupled from MachineObject/DeviceManager) + void SetData(const std::vector& ams_info, + const std::vector& ext_info, + int total_ext_count, + const std::string& dev_id, + const std::string& series_name = std::string(), + const std::string& printer_type = std::string(), + bool is_reset = true); std::vector GenerateSimulateData(); void AddAms(AMSinfo info, AMSPanelPos pos = AMSPanelPos::LEFT_PANEL); diff --git a/src/slic3r/GUI/Widgets/AMSItem.cpp b/src/slic3r/GUI/Widgets/AMSItem.cpp index 6bd00f3..14e5486 100644 --- a/src/slic3r/GUI/Widgets/AMSItem.cpp +++ b/src/slic3r/GUI/Widgets/AMSItem.cpp @@ -3132,10 +3132,7 @@ void AmsItem::create(wxWindow *parent) m_can_count++; } it = m_info.cans.begin(); - //auto road_panel = new wxWindow(this, wxID_ANY); - //auto road_panel = new wxPanel(this, wxID_ANY); - //road_panel->SetSize(AMS_CAN_ROAD_SIZE); - //road_panel->SetMinSize(AMS_CAN_ROAD_SIZE); + if (m_ams_model == AMSModel::GENERIC_AMS || m_ams_model == AMSModel::N3F_AMS || m_ams_model == AMSModel::N3S_AMS){ m_humidity = new AMSHumidity(this, wxID_ANY, m_info); sizer_item->Add(m_humidity, 0, wxALIGN_CENTER_HORIZONTAL, 0); @@ -3147,8 +3144,8 @@ void AmsItem::create(wxWindow *parent) } } m_panel_road = new AMSRoadUpPart(this, wxID_ANY, m_info, m_ams_model); - sizer_item->Add(sizer_can, 0, wxALIGN_CENTER_HORIZONTAL, 0); + //sizer_item->Add(m_panel_road, 0, wxALIGN_CENTER_HORIZONTAL, 0); sizer_item->Add(m_panel_road, 1, wxEXPAND); @@ -3194,6 +3191,7 @@ void AmsItem::AddCan(Caninfo caninfo, int canindex, int maxcan, wxBoxSizer* size if (m_ams_model != AMSModel::EXT_AMS) { m_panel_refresh = new AMSrefresh(amscan, m_info.ams_id, m_can_count, caninfo); + m_can_refresh_list[caninfo.can_id] = m_panel_refresh; } else if (m_ams_model == AMSModel::EXT_AMS){ @@ -3242,7 +3240,8 @@ void AmsItem::AddCan(Caninfo caninfo, int canindex, int maxcan, wxBoxSizer* size //auto m_panel_road = new AMSRoad(amscan, wxID_ANY, caninfo, canindex, maxcan, wxDefaultPosition, AMS_CAN_ROAD_SIZE); if (m_ams_model != AMSModel::AMS_LITE && m_ams_model != AMSModel::EXT_AMS) { - m_sizer_ams->Add(0, 0, 0, wxALIGN_CENTER_HORIZONTAL, 0); + m_sizer_ams->Add(0, 0, 0, wxALIGN_CENTER_HORIZONTAL, 0); + m_sizer_ams->Add(m_panel_refresh, 0, wxALIGN_CENTER_HORIZONTAL | wxDOWN, FromDIP(4)); m_sizer_ams->Add(m_panel_lib, 0, wxALIGN_CENTER_HORIZONTAL, 0); } @@ -3250,6 +3249,7 @@ void AmsItem::AddCan(Caninfo caninfo, int canindex, int maxcan, wxBoxSizer* size { if (m_ams_model == AMSModel::EXT_AMS){ m_sizer_ams->Add(0, 0, 0, wxALIGN_CENTER_HORIZONTAL, 0); + //m_sizer_ams->Add(m_panel_text, 0, wxALIGN_CENTER_HORIZONTAL | wxTOP, 4); m_sizer_ams->Add(m_ext_text, 0, wxALIGN_CENTER_HORIZONTAL | wxDOWN, FromDIP(4)); m_sizer_ams->Add(m_panel_lib, 0, wxALIGN_CENTER_HORIZONTAL, 0); diff --git a/src/slic3r/GUI/Widgets/DeviceButton.cpp b/src/slic3r/GUI/Widgets/DeviceButton.cpp index c202c69..28bb176 100644 --- a/src/slic3r/GUI/Widgets/DeviceButton.cpp +++ b/src/slic3r/GUI/Widgets/DeviceButton.cpp @@ -27,14 +27,15 @@ END_EVENT_TABLE() DeviceButton::DeviceButton(wxString name_text, wxString ip_text, wxString apikey_text) : paddingSize(10, 8), m_name_text(name_text), m_ip_text(ip_text), m_apikey(apikey_text) { background_color = StateColor( - std::make_pair(0x262629, (int) StateColor::Disabled), - std::make_pair(0x37EE7C, (int) StateColor::Hovered | StateColor::Checked), + std::make_pair(0xF5F5F5, (int) StateColor::Disabled), + std::make_pair(0xE6F7FF, (int) StateColor::Hovered | StateColor::Checked), std::make_pair(0x4479fb, (int) StateColor::Checked), - std::make_pair(*wxLIGHT_GREY, (int) StateColor::Hovered), - std::make_pair(0x262629, (int) StateColor::Normal)); + std::make_pair(0xF0F0F0, (int) StateColor::Hovered), + std::make_pair(0xFFFFFF, (int) StateColor::Normal)); text_color = StateColor( - std::make_pair(*wxLIGHT_GREY, (int) StateColor::Disabled), - std::make_pair(*wxBLACK, (int) StateColor::Normal)); + std::make_pair(0xCCCCCC, (int) StateColor::Disabled), + std::make_pair(0x666666, (int) StateColor::Checked), + std::make_pair(0x666666, (int) StateColor::Normal)); } //y40 @@ -48,6 +49,9 @@ DeviceButton::DeviceButton(wxWindow *parent, wxString apikey_text) : DeviceButton(name_text,ip_text, apikey_text) { + //y76 + style = wxBORDER_NONE; + paddingSize = wxSize(8, 5); Create(parent, text, icon, style, iconSize); } @@ -57,7 +61,8 @@ DeviceButton::DeviceButton(wxWindow* parent, long style) { // y20 - paddingSize = wxSize(12, 6); + style = wxBORDER_NONE; + paddingSize = wxSize(8, 5); wxSize iconSize = wxSize(20, 20); Create(parent, "", icon, style, iconSize); } @@ -67,7 +72,7 @@ bool DeviceButton::Create(wxWindow *parent, wxString text, wxString icon, long s StaticBox::Create(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, style); state_handler.attach({&text_color}); state_handler.update_binds(); - wxWindow::SetFont(wxFont(15, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD)); + wxWindow::SetFont(wxFont(10, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, "Microsoft YaHei")); wxString device_nameText = text; wxWindow::SetLabel(device_nameText); @@ -162,7 +167,7 @@ void DeviceButton::SetIsSimpleMode(bool isSimpleMode) m_isSimpleMode = isSimpleMode; if ((this->active_icon.bmp().IsOk())) { if (m_isSimpleMode) { - SetIconWithSize(this->active_icon.name(), wxSize(30, 30)); + SetIconWithSize(this->active_icon.name(), wxSize(25, 25)); } else { SetIconWithSize(this->active_icon.name(), wxSize(80, 80)); } @@ -176,15 +181,19 @@ void DeviceButton::SetIsSelected(bool isSelected) { m_isSelected = isSelected; if (m_isSelected) { - StateColor calc_btn_bg(std::pair(wxColour(147, 147, 150), StateColor::Pressed), - std::pair(wxColour(100, 100, 105), StateColor::Hovered), - std::pair(wxColour(100, 100, 105), StateColor::Normal)); - SetBackgroundColor(calc_btn_bg); + StateColor selected_bg(std::pair(wxColour(230, 237, 255), StateColor::Pressed), + std::pair(wxColour(230, 237, 255), StateColor::Hovered), + std::pair(wxColour(230, 237, 255), StateColor::Normal)); + SetBackgroundColor(selected_bg); + + text_color.setColorForStates(wxColour(102, 102, 102), (int)StateColor::Checked); } else { - StateColor calc_btn_bg(std::pair(wxColour(118, 118, 121), StateColor::Pressed), - std::pair(wxColour(76, 76, 80), StateColor::Hovered), - std::pair(wxColour(67, 67, 71), StateColor::Normal)); - SetBackgroundColor(calc_btn_bg); + StateColor normal_bg(std::pair(wxColour(230, 237, 255), StateColor::Pressed), + std::pair(wxColour(230, 247, 255), StateColor::Hovered), + std::pair(wxColour(255, 255, 255), StateColor::Normal)); + SetBackgroundColor(normal_bg); + + text_color.setColorForStates(wxColour(102, 102, 102), 0); } Refresh(); } @@ -260,34 +269,38 @@ void DeviceButton::render(wxDC &dc) if (GetLabel() == "") { // y20 - dc.DrawBitmap(icon.bmp(), rcContent.x/2+1, rcContent.y/2-2); + dc.DrawBitmap(icon.bmp(), rcContent.x/2, rcContent.y/2-2); } // y2 else if (m_ip_text == "" && m_name_text == "") { - //dc.DrawBitmap(icon.get_bitmap(), 10, (GetSize().GetHeight() - icon.get_bitmap().GetHeight()) / 2); if (m_isSimpleMode) { - dc.SetFont(wxFont(10, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD)); + dc.SetFont(wxFont(9, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD)); } else { - dc.SetFont(wxFont(12, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD)); + dc.SetFont(wxFont(11, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD)); } dc.SetTextForeground(text_color.colorForStates(states)); dc.DrawText(GetLabel(), rcContent.x / 2, size.y/2 - dc.GetTextExtent(GetLabel()).y / 2); } else if (m_isSimpleMode) { - dc.SetFont(wxFont(15, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD)); - dc.SetTextForeground(wxColour(230, 230, 230)); - dc.DrawText(m_name_text, 10, rcContent.y); - int dotRadius = 4; - int dotX = size.x - dotRadius - 10; - int dotY = 10; + //y76 + dc.SetFont(wxFont(10, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, "Microsoft YaHei")); if (m_isSelected) { - dc.SetBrush(wxBrush(wxColour(68, 121, 251))); - dc.SetPen(wxPen(wxColour(68, 121, 251))); + dc.SetTextForeground(wxColour(68, 121, 251)); } else { - dc.SetBrush(wxBrush(wxColour(26, 26, 28))); - dc.SetPen(wxPen(wxColour(26, 26, 28))); + dc.SetTextForeground(wxColour(196, 196, 196)); } - dc.DrawCircle(dotX, dotY, dotRadius); + dc.DrawText(m_name_text, 32, rcContent.y); + // int dotRadius = 4; + // int dotX = size.x - dotRadius - 10; + // int dotY = 10; + // if (m_isSelected) { + // dc.SetBrush(wxBrush(wxColour(33, 150, 243))); + // dc.SetPen(wxPen(wxColour(33, 150, 243))); + // } else { + // dc.SetBrush(wxBrush(wxColour(220, 220, 220))); + // dc.SetPen(wxPen(wxColour(220, 220, 220))); + // } + // dc.DrawCircle(dotX, dotY, dotRadius); } else { dc.DrawBitmap(icon.bmp(), 10, (GetSize().GetHeight() - icon.bmp().GetHeight()) / 2); @@ -350,7 +363,7 @@ void DeviceButton::messureSize() } wxSize size = szContent + paddingSize * 2; if (m_isSimpleMode && m_ip_text != "") - size.x = 180; + size.x = 218; else if (m_ip_text != "") size.x = 290; if (minSize.GetHeight() > 0) diff --git a/src/slic3r/GUI/Widgets/FanControl.cpp b/src/slic3r/GUI/Widgets/FanControl.cpp index 4272973..e3c78aa 100644 --- a/src/slic3r/GUI/Widgets/FanControl.cpp +++ b/src/slic3r/GUI/Widgets/FanControl.cpp @@ -16,6 +16,11 @@ wxDEFINE_EVENT(EVT_FAN_ADD, wxCommandEvent); wxDEFINE_EVENT(EVT_FAN_DEC, wxCommandEvent); wxDEFINE_EVENT(EVT_FAN_CHANGED, wxCommandEvent); +//cj_1 +wxDEFINE_EVENT(EVTSET_COOLLINGFAN_SPEED, wxCommandEvent); +wxDEFINE_EVENT(EVTSET_CHAMBERFAN_SPEED, wxCommandEvent); +wxDEFINE_EVENT(EVTSET_AUXILIARYFAN_SPEED, wxCommandEvent); + constexpr int time_out = 6; static bool not_show_fan_speed_warning_dlg = false; @@ -328,7 +333,34 @@ void FanOperate::msw_rescale() { } static void nop_deleter_fan_control(FanControlNew* ){} - /************************************************* + +//cj_1 +void FanControlNew::post_fan_speed_changed(int m_partId, const wxCommandEvent& oldEvent) +{ + wxEventType type; + switch (m_partId) { + case 1: + type = EVTSET_COOLLINGFAN_SPEED; + break; + case 2: + type = EVTSET_AUXILIARYFAN_SPEED; + break; + case 3: + type = EVTSET_CHAMBERFAN_SPEED; + break; + default: + break; + } + + wxCommandEvent event(type); + event.SetInt(oldEvent.GetInt() * 10); + event.SetString("value"); + + wxPostEvent(GetParent()->GetParent(), event); + +} + +/************************************************* Description:FanControlNew **************************************************/ FanControlNew::FanControlNew(wxWindow *parent, const AirDuctData &fan_data, int mode_id, int part_id, wxWindowID id, const wxPoint &pos, const wxSize &size) @@ -386,21 +418,33 @@ FanControlNew::FanControlNew(wxWindow *parent, const AirDuctData &fan_data, int m_current_speed = e.GetInt(); m_switch_button->SetBitmap(m_bitmap_toggle_on->bmp()); m_switch_fan = true; + //cj_1 + post_fan_speed_changed(m_part_id, e); + }); m_fan_operate->Bind(EVT_FAN_SWITCH_OFF, [this](const wxCommandEvent &e) { m_current_speed = e.GetInt(); m_switch_button->SetBitmap(m_bitmap_toggle_off->bmp()); m_switch_fan = false; + //cj_1 + post_fan_speed_changed(m_part_id, e); + + }); m_fan_operate->Bind(EVT_FAN_ADD, [this](const wxCommandEvent &e) { m_current_speed = e.GetInt(); command_control_fan(); + //cj_1 + post_fan_speed_changed(m_part_id, e); }); m_fan_operate->Bind(EVT_FAN_DEC, [this](const wxCommandEvent& e) { m_current_speed = e.GetInt(); command_control_fan(); + //cj_1 + post_fan_speed_changed(m_part_id, e); + }); m_sizer_control_bottom->Add(m_static_status_name, 0, wxLEFT | wxALIGN_CENTER, FromDIP(30)); @@ -454,6 +498,10 @@ void FanControlNew::command_control_fan() { if (m_current_speed < 0 || m_current_speed > 10) { return; } + + wxCommandEvent event(EVTSET_COOLLINGFAN_SPEED); + + return; BOOST_LOG_TRIVIAL(info) << "Functions Need to be supplemented! :FanControlNew::command_control_fan. the speed may change"; if (m_obj) { if (!m_obj->is_enable_np){ @@ -487,11 +535,24 @@ void FanControlNew::on_swith_fan(wxMouseEvent& evt) if (m_switch_fan) { m_switch_button->SetBitmap(m_bitmap_toggle_off->bmp()); m_switch_fan = false; + +//cj_1 + wxCommandEvent event; + event.SetInt(0); + post_fan_speed_changed(m_part_id, event); + } else { speed = 255; m_switch_button->SetBitmap(m_bitmap_toggle_on->bmp()); m_switch_fan = true; + +//cj_1 + wxCommandEvent event; + event.SetInt(10); + post_fan_speed_changed(m_part_id, event); + + } set_fan_speed(speed); @@ -716,7 +777,7 @@ void FanControlPopupNew::CreateDuct() { auto fan_control = m_fan_control_list[part_id]; fan_control->set_fan_speed_percent(part_state / 10); - } + } } } else @@ -726,7 +787,7 @@ void FanControlPopupNew::CreateDuct() int cooling_fan_speed = round(m_obj->GetFan()->GetCoolingFanSpeed() / float(25.5)); int big_fan1_speed = round(m_obj->GetFan()->GetBigFan1Speed() / float(25.5)); int big_fan2_speed = round(m_obj->GetFan()->GetBigFan2Speed() / float(25.5)); - update_fan_data(AIR_FUN::FAN_COOLING_0_AIRDOOR, cooling_fan_speed); + update_fan_data (AIR_FUN::FAN_COOLING_0_AIRDOOR, cooling_fan_speed); update_fan_data(AIR_FUN::FAN_REMOTE_COOLING_0_IDX, big_fan1_speed); update_fan_data(AIR_FUN::FAN_CHAMBER_0_IDX, big_fan2_speed); } diff --git a/src/slic3r/GUI/Widgets/FanControl.hpp b/src/slic3r/GUI/Widgets/FanControl.hpp index fc29d22..06e0ce2 100644 --- a/src/slic3r/GUI/Widgets/FanControl.hpp +++ b/src/slic3r/GUI/Widgets/FanControl.hpp @@ -176,6 +176,9 @@ public: void on_mode_change(wxMouseEvent& event); void msw_rescale(); + + //cj_1 + void post_fan_speed_changed(int m_partId, const wxCommandEvent& oldEvent); }; wxDECLARE_EVENT(EVT_FANCTRL_SWITCH, wxCommandEvent); @@ -250,7 +253,6 @@ private: void UpdatePartSubMode(); void update_fan_data(const AirDuctData& data); - void update_fan_data(AIR_FUN id, int speed); void on_mode_changed(const wxMouseEvent& event); void on_fan_changed(const wxCommandEvent& event); @@ -263,7 +265,10 @@ private: void command_control_air_duct(int mode_id, int submode = -1); public: + //cj_1 + void update_fan_data(AIR_FUN id, int speed); void update_fan_data(MachineObject *obj); + void msw_rescale(); }; @@ -273,6 +278,11 @@ wxDECLARE_EVENT(EVT_FAN_ADD, wxCommandEvent); wxDECLARE_EVENT(EVT_FAN_DEC, wxCommandEvent); wxDECLARE_EVENT(EVT_FAN_CHANGED, wxCommandEvent); +//cj_1 +wxDECLARE_EVENT(EVTSET_COOLLINGFAN_SPEED, wxCommandEvent); +wxDECLARE_EVENT(EVTSET_CHAMBERFAN_SPEED, wxCommandEvent); +wxDECLARE_EVENT(EVTSET_AUXILIARYFAN_SPEED, wxCommandEvent); + }} // namespace Slic3r::GUI #endif diff --git a/src/slic3r/GUI/Widgets/TempInput.cpp b/src/slic3r/GUI/Widgets/TempInput.cpp index 95e867e..22feae7 100644 --- a/src/slic3r/GUI/Widgets/TempInput.cpp +++ b/src/slic3r/GUI/Widgets/TempInput.cpp @@ -67,11 +67,13 @@ bool TempInput::CheckIsValidVal(bool show_warning) if (tempint > max_temp) { if (show_warning) { Warning(true, WARNING_TOO_HIGH); } + text_ctrl->SetValue(wxString::Format("%d", max_temp)); return false; } else if (tempint < min_temp) { if (show_warning) { Warning(true, WARNING_TOO_LOW); } + text_ctrl->SetValue(wxString::Format("%d", min_temp)); return false; } } @@ -191,6 +193,11 @@ wxString TempInput::erasePending(wxString &str) void TempInput::SetTagTemp(int temp) { + //cj_1 + bool isFocused = text_ctrl->HasFocus(); + if (isFocused) { + return; + } auto tp = wxString::Format("%d", temp); if (text_ctrl->GetValue() != tp) { text_ctrl->SetValue(tp); @@ -201,6 +208,11 @@ void TempInput::SetTagTemp(int temp) void TempInput::SetTagTemp(wxString temp) { + //cj_1 + bool isFocused = text_ctrl->HasFocus(); + if (isFocused) { + return; + } if (text_ctrl->GetValue() != temp) { text_ctrl->SetValue(temp); messureSize(); diff --git a/src/slic3r/GUI/wxMediaCtrl3.cpp b/src/slic3r/GUI/wxMediaCtrl3.cpp index 6baa227..979be59 100644 --- a/src/slic3r/GUI/wxMediaCtrl3.cpp +++ b/src/slic3r/GUI/wxMediaCtrl3.cpp @@ -11,7 +11,7 @@ #endif //wxDEFINE_EVENT(EVT_MEDIA_CTRL_STAT, wxCommandEvent); - +#ifdef _WIN32 BEGIN_EVENT_TABLE(wxMediaCtrl3, wxWindow) // catch paint events @@ -342,3 +342,414 @@ void wxMediaCtrl3::NotifyStopped() event.SetEventObject(this); wxPostEvent(this, event); } + +#endif + +//y76 +wxBEGIN_EVENT_TABLE(VideoPanel, wxPanel) + EVT_PAINT(VideoPanel::OnPaint) + EVT_ERASE_BACKGROUND(VideoPanel::OnEraseBackground) + EVT_SIZE(VideoPanel::OnSize) +wxEND_EVENT_TABLE() + +VideoPanel::VideoPanel(wxWindow* parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size) + : wxPanel(parent, id, pos, size) + , m_state(wxMEDIASTATE_STOPPED) + , m_error(0) +{ + SetBackgroundStyle(wxBG_STYLE_PAINT); + SetDoubleBuffered(true); + + SetBackgroundColour(wxColour(20, 20, 20)); + + curl_global_init(CURL_GLOBAL_DEFAULT); + + m_thread = std::thread(&VideoPanel::PlayThread, this); +} + +VideoPanel::~VideoPanel() +{ + m_exit_flag = true; + { + std::unique_lock lk(m_mutex); + m_url.reset(); + m_frame = wxImage(m_idle_image); + m_cond.notify_all(); + } + + if (m_thread.joinable()) { + m_thread.join(); + } + + if (m_curl) { + curl_easy_cleanup(m_curl); + } + curl_global_cleanup(); +} + +void VideoPanel::Load(const std::string& url) +{ + std::unique_lock lk(m_mutex); + + if (url.empty()) { + wxLogWarning("VideoPanel: Attempted to load empty URL"); + return; + } + + m_video_size = wxDefaultSize; + m_error = 0; + + // if (m_state != wxMEDIASTATE_LOADING) { + // m_state = wxMEDIASTATE_LOADING; + // wxMediaEvent event(wxEVT_MEDIA_STATECHANGED); + // event.SetId(GetId()); + // event.SetEventObject(this); + // wxPostEvent(this, event); + // } + + m_url = std::make_shared(url); + + wxLogMessage("VideoPanel: Loaded URL: %s", url); + + m_cond.notify_all(); +} + +void VideoPanel::Play() +{ + std::unique_lock lk(m_mutex); + + if (m_state != wxMEDIASTATE_PLAYING && m_url) { + m_state = wxMEDIASTATE_PLAYING; + + wxMediaEvent event(wxEVT_MEDIA_STATECHANGED); + event.SetId(GetId()); + event.SetEventObject(this); + wxPostEvent(this, event); + } +} + +void VideoPanel::Stop() +{ + std::unique_lock lk(m_mutex); + + m_url.reset(); + m_frame = wxImage(m_idle_image); + m_video_size = wxDefaultSize; + m_frame_size = wxDefaultSize; + NotifyStopped(); + m_cond.notify_all(); + CallAfter([this] { + Refresh(); + }); +} + +void VideoPanel::SetIdleImage(wxString const &image) +{ + if (m_idle_image == image) + return; + m_idle_image = image; + if (m_url == nullptr) { + std::unique_lock lk(m_mutex); + m_frame = wxImage(m_idle_image); + + if (m_frame.IsOk()) { + CallAfter([this] { + Refresh(); + }); + } + } +} + +wxMediaState VideoPanel::GetState() +{ + std::unique_lock lk(m_mutex); + return m_state; +} + +int VideoPanel::GetLastError() +{ + std::unique_lock lk(m_mutex); + return m_error; +} + +wxSize VideoPanel::GetVideoSize() +{ + std::unique_lock lk(m_mutex); + return m_video_size; +} + +wxSize VideoPanel::DoGetBestSize() const +{ + return { -1, -1 }; +} + +void VideoPanel::OnPaint(wxPaintEvent& event) +{ + paintEvent(event); +} + +void VideoPanel::OnEraseBackground(wxEraseEvent& event) +{ +} + +void VideoPanel::OnSize(wxSizeEvent& event) +{ + std::unique_lock lk(m_mutex); + + if (m_video_size.IsFullySpecified()) { + adjust_frame_size(m_frame_size, m_video_size, GetSize()); + } + + Refresh(); + event.Skip(); +} + +void VideoPanel::paintEvent(wxPaintEvent& evt) +{ + wxPaintDC dc(this); + auto size = GetSize(); + + if (size.x <= 0 || size.y <= 0) { + return; + } + + std::unique_lock lk(m_mutex); + + dc.SetPen(*wxTRANSPARENT_PEN); + dc.SetBrush(*wxBLACK_BRUSH); + dc.DrawRectangle(0, 0, size.x, size.y); + + if (!m_frame.IsOk()) { + return; + } + + wxSize frameSize = m_frame.GetSize(); + + double scaleX = (double)size.x / frameSize.x; + double scaleY = (double)size.y / frameSize.y; + double scale = std::min(scaleX, scaleY); + + wxSize scaledSize(frameSize.x * scale, frameSize.y * scale); + wxPoint pos((size.x - scaledSize.x) / 2, (size.y - scaledSize.y) / 2); + wxImage scaledImage = m_frame.Scale(scaledSize.x, scaledSize.y, wxIMAGE_QUALITY_HIGH); + dc.DrawBitmap(wxBitmap(scaledImage), pos.x, pos.y, true); +} + +void VideoPanel::adjust_frame_size(wxSize& frame, const wxSize& video, const wxSize& window) +{ + if (video.x * window.y < video.y * window.x) { + frame = { video.x * window.y / video.y, window.y }; + } else { + frame = { window.x, video.y * window.x / video.x }; + } +} + +void VideoPanel::PlayThread() +{ + using namespace std::chrono_literals; + std::unique_lock lk(m_mutex); + + std::shared_ptr url; + + int frameCount = 0; + std::chrono::steady_clock::time_point lastSecondTime; + + while (!m_exit_flag) { + m_cond.wait(lk, [this, &url] { + return m_exit_flag || + (!m_url && url) || + (m_url && !url) || + (m_url && url && *m_url != *url); + }); + + if (m_exit_flag) { + break; + } + + url = m_url; + + if (!url) { + continue; + } + + if (url->empty()) { + continue; + } + + frameCount = 0; + lastSecondTime = std::chrono::steady_clock::now(); + + m_last_PTS = 0; + m_last_PTS_expected = std::chrono::steady_clock::now(); + m_last_PTS_practical = std::chrono::steady_clock::now(); + + m_state = wxMEDIASTATE_PLAYING; + wxMediaEvent stateEvent(wxEVT_MEDIA_STATECHANGED); + stateEvent.SetId(GetId()); + stateEvent.SetEventObject(this); + wxPostEvent(this, stateEvent); + + lk.unlock(); + + CURL* curl = curl_easy_init(); + if (!curl) { + lk.lock(); + m_error = -1; + NotifyStopped(); + continue; + } + + curl_easy_setopt(curl, CURLOPT_URL, url->c_str()); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); + curl_easy_setopt(curl, CURLOPT_TIMEOUT, 5L); + curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3L); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); + curl_easy_setopt(curl, CURLOPT_USERAGENT, "VideoPanel/1.0"); + + bool shouldCleanup = true; + + while (true) { + auto now = std::chrono::steady_clock::now(); + uint64_t currentPTS = std::chrono::duration_cast( + now.time_since_epoch()).count(); + + wxMemoryOutputStream memStream; + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &memStream); + + CURLcode res = curl_easy_perform(curl); + + lk.lock(); + + if (m_url != url) { + shouldCleanup = false; + lk.unlock(); + break; + } + + if (res == CURLE_OK && memStream.GetSize() > 0) { + wxMemoryInputStream imgStream(memStream); + wxImage newImage; + + if (newImage.LoadFile(imgStream, wxBITMAP_TYPE_JPEG)) { + frameCount++; + auto nowStat = std::chrono::steady_clock::now(); + auto elapsedTime = std::chrono::duration_cast( + nowStat - lastSecondTime).count(); + + if (elapsedTime >= 1000) { + int fps = static_cast(frameCount * 1000 / elapsedTime); + wxLogMessage("VideoPanel: Decode Rate: %d FPS", fps); + frameCount = 0; + lastSecondTime = nowStat; + } + + const int minFrameDuration = 100; + + if (m_last_PTS && (currentPTS - m_last_PTS) < 3000000) { + auto next_PTS_expected = m_last_PTS_expected + + std::chrono::microseconds(currentPTS - m_last_PTS); + + auto next_PTS_practical = m_last_PTS_practical + + std::chrono::milliseconds(minFrameDuration); + + auto next_PTS = std::max(next_PTS_expected, next_PTS_practical); + + if (nowStat < next_PTS) { + lk.unlock(); + std::this_thread::sleep_until(next_PTS); + lk.lock(); + + if (m_url != url) { + shouldCleanup = false; + lk.unlock(); + break; + } + } else { + next_PTS = nowStat; + } + + m_last_PTS = currentPTS; + m_last_PTS_expected = next_PTS_expected; + m_last_PTS_practical = next_PTS; + } else { + m_last_PTS = currentPTS; + m_last_PTS_expected = nowStat; + m_last_PTS_practical = nowStat; + } + + m_frame = newImage; + + CallAfter([this] { + Refresh(); + }); + + } else { + m_error = -2; + wxLogWarning("VideoPanel: Failed to decode JPEG image"); + } + } else if (res != CURLE_OK) { + m_error = res; + + lk.unlock(); + std::this_thread::sleep_for(500ms); + lk.lock(); + + if (m_url != url) { + shouldCleanup = false; + lk.unlock(); + break; + } + continue; + } + + lk.unlock(); + + std::this_thread::sleep_for(std::chrono::milliseconds(33)); // ~30FPS + } + + curl_easy_cleanup(curl); + + if (shouldCleanup) { + std::unique_lock lockAfterCleanup(m_mutex); + if (m_url == url) { + m_error = 0; + } + + m_frame_size = wxDefaultSize; + m_video_size = wxDefaultSize; + NotifyStopped(); + } + + lk = std::unique_lock(m_mutex); + } +} + +void VideoPanel::NotifyStopped() +{ + m_state = wxMEDIASTATE_STOPPED; + wxMediaEvent event(wxEVT_MEDIA_STATECHANGED); + event.SetId(GetId()); + event.SetEventObject(this); + wxPostEvent(this, event); +} + +size_t VideoPanel::WriteMemoryCallback(void* contents, size_t size, size_t nmemb, void* userp) +{ + size_t realsize = size * nmemb; + wxMemoryOutputStream* mem = static_cast(userp); + + if (mem && realsize > 0) { + try { + mem->Write(contents, realsize); + return realsize; + } catch (...) { + return 0; + } + } + + return 0; +} +//y76 \ No newline at end of file diff --git a/src/slic3r/GUI/wxMediaCtrl3.h b/src/slic3r/GUI/wxMediaCtrl3.h index 94cdaad..40a0566 100644 --- a/src/slic3r/GUI/wxMediaCtrl3.h +++ b/src/slic3r/GUI/wxMediaCtrl3.h @@ -10,6 +10,9 @@ #include "wx/uri.h" #include "wx/mediactrl.h" +#include +#include +#include wxDECLARE_EVENT(EVT_MEDIA_CTRL_STAT, wxCommandEvent); @@ -91,4 +94,66 @@ private: #endif +//y76 +class VideoPanel : public wxPanel +{ +public: + VideoPanel(wxWindow* parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxSize(640, 480)); + + virtual ~VideoPanel(); + + void Load(const std::string& url); + void Play(); + void Stop(); + void SetIdleImage(wxString const &image); + + wxMediaState GetState(); + int GetLastError(); + wxSize GetVideoSize(); + + wxSize DoGetBestSize() const override; + +protected: + void OnPaint(wxPaintEvent& event); + void OnEraseBackground(wxEraseEvent& event); + void OnSize(wxSizeEvent& event); + + void paintEvent(wxPaintEvent& evt); + + static void adjust_frame_size(wxSize& frame, const wxSize& video, const wxSize& window); + +private: + void PlayThread(); + void NotifyStopped(); + + static size_t WriteMemoryCallback(void* contents, size_t size, size_t nmemb, void* userp); + +private: + std::shared_ptr m_url; + wxMediaState m_state = wxMEDIASTATE_STOPPED; + int m_error = 0; + + wxString m_idle_image; + wxImage m_frame; + wxSize m_video_size = wxDefaultSize; + wxSize m_frame_size = wxDefaultSize; + + uint64_t m_last_PTS = 0; + std::chrono::steady_clock::time_point m_last_PTS_expected; + std::chrono::steady_clock::time_point m_last_PTS_practical; + + std::mutex m_mutex; + std::condition_variable m_cond; + std::thread m_thread; + + CURL* m_curl = nullptr; + std::atomic m_exit_flag{false}; + + wxDECLARE_EVENT_TABLE(); +}; +//y76 + #endif /* wxMediaCtrl3_h */ diff --git a/src/slic3r/Utils/CalibUtils.cpp b/src/slic3r/Utils/CalibUtils.cpp index 956bb53..a7e5a9f 100644 --- a/src/slic3r/Utils/CalibUtils.cpp +++ b/src/slic3r/Utils/CalibUtils.cpp @@ -358,13 +358,14 @@ static bool is_same_nozzle_type(const DynamicPrintConfig &full_config, const Mac static bool check_nozzle_diameter_and_type(const DynamicPrintConfig &full_config, wxString& error_msg) { - DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager(); - if (!dev) { - error_msg = _L("Need select printer"); - return false; - } + //y76 + //DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager(); + //if (!dev) { + // error_msg = _L("Need select printer"); + // return false; + //} - MachineObject *obj = dev->get_selected_machine(); + auto obj = wxGetApp().qdsdevmanager->getSelectedDevice(); if (obj == nullptr) { error_msg = _L("Need select printer"); return false; @@ -373,15 +374,15 @@ static bool check_nozzle_diameter_and_type(const DynamicPrintConfig &full_config if (!Slic3r::GUI::wxGetApp().plater()->check_printer_initialized(obj)) return false; - // P1P/S - if (obj->GetExtderSystem()->GetNozzleType(0) == NozzleType::ntUndefine) - return true; + //// P1P/S + //if (obj->GetExtderSystem()->GetNozzleType(0) == NozzleType::ntUndefine) + // return true; - // if (!is_same_nozzle_diameters(full_config, obj, error_msg)) - // return false; + //// if (!is_same_nozzle_diameters(full_config, obj, error_msg)) + //// return false; - if (!is_same_nozzle_type(full_config, obj, error_msg)) - return false; + //if (!is_same_nozzle_type(full_config, obj, error_msg)) + // return false; return true; } @@ -2067,8 +2068,7 @@ void CalibUtils::send_to_print(const CalibInfo &calib_info, wxString &error_mess print_job->has_sdcard = obj_->GetStorage()->get_sdcard_state() == DevStorage::HAS_SDCARD_NORMAL; print_job->could_emmc_print = obj_->is_support_print_with_emmc; - //y - print_job->set_print_config(MachineBedTypeString[bed_type], true, false, false, false, true, false, 0, 0, 0, 0, 0); + print_job->set_print_config(MachineBedTypeString[bed_type], true, false, false, false, true, false, 0, 0, 0, 0, 0, 0); print_job->set_print_job_finished_event(wxGetApp().plater()->get_send_calibration_finished_event(), print_job->m_project_name); { // after send: record the print job @@ -2199,8 +2199,7 @@ void CalibUtils::send_to_print(const std::vector &calib_infos, wxStri print_job->has_sdcard = obj_->GetStorage()->get_sdcard_state() == DevStorage::HAS_SDCARD_NORMAL; print_job->could_emmc_print = obj_->is_support_print_with_emmc; - //y - print_job->set_print_config(MachineBedTypeString[bed_type], true, true, false, false, true, false, 0, 0, 1, 0, 0); + print_job->set_print_config(MachineBedTypeString[bed_type], true, true, false, false, true, false, 0, 1, 0, 0, 0, 0); print_job->set_print_job_finished_event(wxGetApp().plater()->get_send_calibration_finished_event(), print_job->m_project_name); { // after send: record the print job diff --git a/src/slic3r/Utils/qidi_networking.hpp b/src/slic3r/Utils/qidi_networking.hpp index f3c28ff..99a8674 100644 --- a/src/slic3r/Utils/qidi_networking.hpp +++ b/src/slic3r/Utils/qidi_networking.hpp @@ -236,6 +236,9 @@ struct PrintParams { int auto_flow_cali{ 0 }; int auto_offset_cali{ 0 }; int extruder_cali_manual_mode{ -1 }; + //y76 + int enable_air_condition{0}; + bool task_ext_change_assist; bool try_emmc_print; }; diff --git a/version.inc b/version.inc index 63beb18..2cf525c 100644 --- a/version.inc +++ b/version.inc @@ -13,7 +13,7 @@ endif() # The build_version should start from 50 in master branch -set(SLIC3R_VERSION "02.04.00.70") +set(SLIC3R_VERSION "02.04.01.10") string(REPLACE "." "," SLIC3R_COMMA_SEPARATED_VERSION ${SLIC3R_VERSION}) set(SLIC3R_COMMA_SEPARATED_VERSION "${SLIC3R_COMMA_SEPARATED_VERSION}") \ No newline at end of file