* FIX: linux: fix the building issue on Linux Mint 21.3 Virginia github: https://github.com/bambulab/BambuStudio/issues/3874 author: https://github.com/lucianoloder Change-Id: Ia3db6923d5dd68dba532d7bdba6f93f73cc51d59 * FIX: auto-arranging incorrect with rotation enabled auto-arranging incorrect with rotation enabled and the objects already have been rotated. jira: STUDIO-6022 Change-Id: I349d663efb1fc71367c8a77aa8ed5047a0bf2017 (cherry picked from commit 75fe40257a274ed83886e1ee20ce8dedd0de48f6) * ENH: update X1C & X1E start gcode 1.Fix fan problem jira:NEW Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Change-Id: I68ee5be78e142e8a2a210a1a70f5663893390610 * ENH: update A series gcode 1. Update A1 series start gcode and change filament gcode 2. Add G2814 command 3. Add multi-filament extrusion compensation and vibration suppression jira:NEW Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Change-Id: I57d2bc8e98d3e547881dc1369c1fb31413c6205d * FIX: fix some cali problem of P series jira: none Change-Id: Id57ea8d65da22ab653cca49509cb923ff065e43f * FIX: fix can't enter ',' in multiplicator github: #3805 Change-Id: I6dd70822d1c2e79d66c70514d6dd580ab029c7ea * calib wizard * NEW: FlipLines infill jira:6701 New infill pattern that combine block lines infill and switching layers for smooth transition. Change-Id: I2608a2d39b14efcdfe9d39a9437280da350b94c0 (cherry picked from commit 8d0a09c8b763dfc924cbba9913c241e6afadbc7f) * ENH: add nozzle blob detection and air printing detection jira: new Change-Id: Ie4a19a7ad7d0b10a021c516cbc3a84b4ae734302 * FIX: Top surface bridging fail on 3DHC & FL infill Add 45 degree angle offset when processing the bridge. Need to raise infill_direction to invalidate posPrepareInfill jira: 6774 Change-Id: I5e6bef3aa814b01c5f30398ac745937a67e3ef4c (cherry picked from commit 7b12cab10b88f432a11414f8caa1c6427777a1ba) * FIX: the error display when reset virtual slot jira: none Change-Id: I5ae5899baf1bfc2aaadb832083b277855a669fd5 * FIX: Error "Voronoi cell doesn't contain a sourcepoint" github: 3859 Change-Id: Idca84992bcba5380bfe05e63ac9a5e40419dcfdf * fix build error * FIX: CLI: fix the crash issue caused by get_min_flush_volumes JIRA: no jira Change-Id: I0d5bfd605e51ebddac8fddc4d83dab5055b0fbf2 * FIX: can't use support filament in gcode.3mf 1. Add total_filament_volumes, directly access it to get used filaments github:#3865 Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Change-Id: I4fae4f1947b4ebd16e394e0f3cf5fb0e9f979717 * ENH: p series support long retraction 1. P series support long retraction in filament 2. Add long retraction params in common.json jira:NEW Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Change-Id: Ib94184fa1f0b5ab151360f1f053d8c8ff92e7e18 * ENH::modify some logs level jira:[for log] Change-Id: I6a46b8fcd3a030b4b630e800fe9a9ac5c387f117 * NEW: support multi device JIRA: STUDIO-6072 Change-Id: Ic514c4097767b0a728368c9ea48ee103c031fbb0 Signed-off-by: Stone Li <stone.li@bambulab.com> * ENH: update A1 series gcode 1.Update filament change gcode and machine start gcode for A1 and A1 mini jira:NEW Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Change-Id: I2f3be3fd89fef21e717a32f2b89985fc046f7f6e * FIX: always have 0th filament in ams mapping 1. Only set the filament id in map when flush length is not 0 jira:NEW Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Change-Id: I6e0aeaf010f6e6dcbdc3bca5c0034aa60750bb67 * ENH: add filament id in slice info jira:NEW Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Change-Id: Ic5fe4632bca8acacc9ffd072ee2ed207c1da37aa * ENH: refine ui for multi machine JIRA: STUDIO-6819 STUDIO-6824 1. Shrink the Send Print dialog box 2. add input box for flipping panel Change-Id: I4174c79ecd239c374ee11478951e12be399c57ce * FIX: fix Issues with sending multiple devices JIRA: STUDIO-6876 Signed-off-by: Kunlong Ma <kunlong.ma@bambulab.com> Change-Id: I33c6a932863fc715c3f0eb5dfd4b299f980a4918 * NEW: support hms error code Change-Id: Ic256a83cf501fb05bb9d3203f3d24cb1d1290fa4 * FIX:fixed some multi job issue Change-Id: I338078ad8fcf809888db9d8daeb470a9bf4eab46 * NEW:support pin code binding Change-Id: Ida5d47881fbd83f3ffedc80369cfe377114d7f13 * ENH:add printable check for devices Change-Id: I672988fa9cfa986d924bfc64331752f4aef68067 (cherry picked from commit 69de9e5b8334ec94eec7fcee31038b8ff42d1d3b) * FIX: add more fonts jira: none Change-Id: I6bafed3563083858f29e92a3d84906a2e53dcb5c (cherry picked from commit afbea693e807dcc1c406a59aa5376b9ea2a5d606) * ENH: load more fonts this feature is according to Prusa by Filip Sykala<filip.sykala@prusa3d.cz>, thanks to Filip Sykala jira: none Change-Id: I55e92f184f750c0b93b679d4382aaa5b164ec5c3 (cherry picked from commit d05522c4cc5d7ee4cac42de398b88d347a55f74b) * ENH: add ProfileDescription for translate 1.Add ProfileDescription.hpp simply for translating jira:NEW Signed-off-by: XunZhangBambu <xun.zhang@bambulab.com> Change-Id: Iaa3ced1edccf67eaeebde35c1e8b36442d2e9a6f * ENH: Improve CrossHatch transation layers jira: 6701 Change name from Flippingline to CrossHatch. Reduce noise, improve speed by 6.5%. Improve transation layers by gradually increasing rotation angle and overshoot the transation layer while direction changed. Change-Id: I17fcc45b409074d121bf5bb5702e15553d925b51 * UP * ENH: modify the default config for multi-device JIRA: STUDIO-6072 Change-Id: If6e7582a8274eb5e685b8b8545f6eab5d17de3f5 Signed-off-by: Stone Li <stone.li@bambulab.com> * ENH: add long retraction for P series jira:NEW Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Change-Id: I6890695b67e674fc5cdc2a208e89bd9e41404213 * FIX: all plates stats data missing issue jira: new Change-Id: I137a2b6d69ad08791f5a9a9788653621960dc63f * ENH:update pre print options jira:[for multi] Change-Id: I2e9bb8a09436a71749af98a0bad94e9922f95c81 * FIX:fixed can't popup pinbind win on macos jira:[STUDIO-6895] Change-Id: I664bba78cf27420d736b586df19e3c09c6f8ed21 * FIX:fixed the task of padding cannot be cancelled Change-Id: I401a22118c14ca7601be7a925cfd8e4796dfc1e9 * ENH:Play video after redirecting to device page jira:[STUDIO-6884] Change-Id: Ia5e2ac84e3d71baacfcf941b782dab2325f35d54 * FIX: fix ui bug in send multi machine page for mac JIRA: STUDIO-6882 Incorrect background color when renaming during multi machine printing Change-Id: I6c551f5023ffe747e7a7e2f5703b0707c9505922 * FIX: Fix some bugs in maintaining the selected status of local tasks JIRA: STUDIO-6824 Change-Id: I12c4da3fc56ac5077b3ccd7e89a4b57c3675eaf5 * ENH: local task sort by send time by default JIRA: STUDIO-6885 Change-Id: I03b5881a39ab2e90c5b9cf46052ba465ee707ccc * FIX: Clicking to continue printing does not take effect in error code JIRA: STUDIO-6830 Detected an incomplete printing task error pop-up when power outage occurred. Clicking to continue printing did not take effect Change-Id: Ie85a1602093dabac861cd1f41ea21e1c312c83e9 * ENH: use designTitle when designId > 0 JIRA: STUDIO-6072 Change-Id: I8342df053edeab16f930522e099e2eef91e5c5a4 Signed-off-by: Stone Li <stone.li@bambulab.com> * NEW:import vertex and mtl color from obj file Jira: STUDIO-6805 Change-Id: Iaacb13ee2451effdb83e5aba4b7fe1637b7fc95f * FIX:change the strategy of merge_ka_kd Upgrade ui, users can directly ok to proceed to the next step jira: STUDIO-6805 Change-Id: Ia81019c2eacb503666680c0b8583d026baa0134c (cherry picked from commit 38a2434753c8e3b422267283b16c75f6ad195b14) * FIX:use default_strategy after modifed cluster number jira: STUDIO-6915 Change-Id: I4e0c3d62f5a766f73d48d1e06c4364fc6babe1ac * FIX: the bug of incorrect button without restarting JIRA: STUDIO-6824 The bug can cause the user to not restart when opening the multi-device option, but the button of send multi-devices appears Change-Id: I0837fa79ecc1d8ab5ce98273ad134fa2f830421e * FIX: wrong default value for long retraction jira:NEW Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Change-Id: Ifc2ec57a320fdb14e7ca746e5795501ed146ff32 * FIX: error code pop-up window without retry button in some code JIRA: STUDIO-6922 Change-Id: I67464bebaba4558618301592c455db8824bbfe30 * FIX: air printing and nozzle blob detection issue jira: STUDIO-6897 Change-Id: I008ddb24b74119d7e4124ae26310b4b86c42a799 * FIX:fix bugs of algo and read quad in obj file Jira: STUDIO-6805 Change-Id: I6c33e8197225f27dccdfa0681e64d76d1df14f61 * dd * ENH:Set the default nozzle diameter to 0.4 jira:[for nozzle] Change-Id: I74a5c9b0460046496b897eae3d9f917ac1b99052 * FIX:fixed backspace error on macos Change-Id: I76066391783c04857c1a60a6f8438111501b6d7c * ENH:Subscription list deduplication jira:[for mulit] Change-Id: I10e9d849986c9661b587c7b1a509180c2451816e * ENH:update wiki url for Pin Code jira:[pin code] Change-Id: I95faaa396a839b5b159119ef235b650c76706a84 * NEW:add OpenCV.cmake in deps jira: none Change-Id: I1ae4a2bd5618e9e620b08a937904d6af5d00bc41 * FIX:cancel obj import restrictions jira: none Change-Id: Iaf3e799ca982ad6aeb3ec76e9a416c4c8e4d100c * NEW:add multiple printer restrictions jira:[for multiple] Change-Id: I0bb5a0c1062a543c42f8d67a9347efa358b0864a * ENH:Added two entrances for adding devices jira:[multi device] Change-Id: Ieb6197e067d422979606f93b22b337a2399aec74 * slic3r: Fix wxFont being undefined [427/494] Building CXX object src/slic3r/CMakeFiles/libslic3r_gui.dir/Utils/FontUtils.cpp.o FAILED: src/slic3r/CMakeFiles/libslic3r_gui.dir/Utils/FontUtils.cpp.o /usr/bin/c++ -DBOOST_ATOMIC_NO_LIB -DBOOST_CHRONO_NO_LIB -DBOOST_DATE_TIME_NO_LIB -DBOOST_FILESYSTEM_NO_LIB -DBOOST_IOSTREAMS_NO_LIB -DBOOST_LOCALE_NO_LIB -DBOOST_LOG_NO_LIB -DBOOST_REGEX_NO_LIB -DBOOST_SYSTEM_NO_LIB -DBOOST_THREAD_NO_LIB -DCURL_STATICLIB -DGLEW_STATIC -DLIBNEST2D_GEOMETRIES_libslic3r -DLIBNEST2D_OPTIMIZER_nlopt -DLIBNEST2D_STATIC -DLIBNEST2D_THREADING_tbb -DOPENSSL_CERT_OVERRIDE -DOPENVDB_OPENEXR_STATICLIB -DOPENVDB_STATICLIB -DSLIC3R_CURRENTLY_COMPILING_GUI_MODULE -DSLIC3R_GUI -DTBB_USE_CAPTURED_EXCEPTION=0 -DUNICODE -DUSE_TBB -DWXINTL_NO_GETTEXT_MACRO -D_UNICODE -D__WXGTK3__ -D__WXGTK__ -DwxDEBUG_LEVEL=0 -DwxNO_UNSAFE_WXSTRING_CONV -DwxUSE_UNICODE -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/run/build/BambuStudio/src -I/run/build/BambuStudio/build/src/platform -I/run/build/BambuStudio/src/hidapi/include -I/run/build/BambuStudio/src/slic3r/Utils -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/webp -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -I/usr/include/gstreamer-1.0 -I/run/build/BambuStudio/build/src/libslic3r -I/run/build/BambuStudio/deps/build/destdir/usr/local/include/opencascade -I/run/build/BambuStudio/src/libnest2d/include -I/run/build/BambuStudio/src/miniz -I/run/build/BambuStudio/src/glu-libtess/include -I/run/build/BambuStudio/src/clipper2/Clipper2Lib/include -I/run/build/BambuStudio/src/minilzo -isystem /run/build/BambuStudio/src/eigen -isystem /run/build/BambuStudio/src/libigl -isystem /app/lib/wx/include/gtk3-unicode-static-3.1 -isystem /app/include/wx-3.1 -isystem /run/build/BambuStudio/deps/build/destdir/usr/local/include -isystem /run/build/BambuStudio/deps/build/destdir/usr/local/include/opencv4 -isystem /run/build/BambuStudio/deps/build/destdir/usr/local/include/OpenEXR -std=gnu++20 -fext-numeric-literals -Wall -Wno-reorder -pthread -O3 -DNDEBUG -std=gnu++17 -fPIC -fsigned-char -Werror=return-type -Wno-ignored-attributes -Wno-unknown-pragmas -DOPENVDB_ABI_VERSION_NUMBER=8 -MD -MT src/slic3r/CMakeFiles/libslic3r_gui.dir/Utils/FontUtils.cpp.o -MF src/slic3r/CMakeFiles/libslic3r_gui.dir/Utils/FontUtils.cpp.o.d -o src/slic3r/CMakeFiles/libslic3r_gui.dir/Utils/FontUtils.cpp.o -c /run/build/BambuStudio/src/slic3r/Utils/FontUtils.cpp In file included from /run/build/BambuStudio/src/slic3r/Utils/FontUtils.cpp:1: /run/build/BambuStudio/src/slic3r/Utils/FontUtils.hpp:51:21: error: ‘wxFont’ does not name a type 51 | bool can_load(const wxFont &font); | ^~~~~~ * slic3r: Fix missing BOOST_LOG_TRIVIAL declaration [427/494] Building CXX object src/slic3r/CMakeFiles/libslic3r_gui.dir/Utils/FontUtils.cpp.o FAILED: src/slic3r/CMakeFiles/libslic3r_gui.dir/Utils/FontUtils.cpp.o /usr/bin/c++ -DBOOST_ATOMIC_NO_LIB -DBOOST_CHRONO_NO_LIB -DBOOST_DATE_TIME_NO_LIB -DBOOST_FILESYSTEM_NO_LIB -DBOOST_IOSTREAMS_NO_LIB -DBOOST_LOCALE_NO_LIB -DBOOST_LOG_NO_LIB -DBOOST_REGEX_NO_LIB -DBOOST_SYSTEM_NO_LIB -DBOOST_THREAD_NO_LIB -DCURL_STATICLIB -DGLEW_STATIC -DLIBNEST2D_GEOMETRIES_libslic3r -DLIBNEST2D_OPTIMIZER_nlopt -DLIBNEST2D_STATIC -DLIBNEST2D_THREADING_tbb -DOPENSSL_CERT_OVERRIDE -DOPENVDB_OPENEXR_STATICLIB -DOPENVDB_STATICLIB -DSLIC3R_CURRENTLY_COMPILING_GUI_MODULE -DSLIC3R_GUI -DTBB_USE_CAPTURED_EXCEPTION=0 -DUNICODE -DUSE_TBB -DWXINTL_NO_GETTEXT_MACRO -D_UNICODE -D__WXGTK3__ -D__WXGTK__ -DwxDEBUG_LEVEL=0 -DwxNO_UNSAFE_WXSTRING_CONV -DwxUSE_UNICODE -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/run/build/BambuStudio/src -I/run/build/BambuStudio/build/src/platform -I/run/build/BambuStudio/src/hidapi/include -I/run/build/BambuStudio/src/slic3r/Utils -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/webp -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -I/usr/include/gstreamer-1.0 -I/run/build/BambuStudio/build/src/libslic3r -I/run/build/BambuStudio/deps/build/destdir/usr/local/include/opencascade -I/run/build/BambuStudio/src/libnest2d/include -I/run/build/BambuStudio/src/miniz -I/run/build/BambuStudio/src/glu-libtess/include -I/run/build/BambuStudio/src/clipper2/Clipper2Lib/include -I/run/build/BambuStudio/src/minilzo -isystem /run/build/BambuStudio/src/eigen -isystem /run/build/BambuStudio/src/libigl -isystem /app/lib/wx/include/gtk3-unicode-static-3.1 -isystem /app/include/wx-3.1 -isystem /run/build/BambuStudio/deps/build/destdir/usr/local/include -isystem /run/build/BambuStudio/deps/build/destdir/usr/local/include/opencv4 -isystem /run/build/BambuStudio/deps/build/destdir/usr/local/include/OpenEXR -std=gnu++20 -fext-numeric-literals -Wall -Wno-reorder -pthread -O3 -DNDEBUG -std=gnu++17 -fPIC -fsigned-char -Werror=return-type -Wno-ignored-attributes -Wno-unknown-pragmas -DOPENVDB_ABI_VERSION_NUMBER=8 -MD -MT src/slic3r/CMakeFiles/libslic3r_gui.dir/Utils/FontUtils.cpp.o -MF src/slic3r/CMakeFiles/libslic3r_gui.dir/Utils/FontUtils.cpp.o.d -o src/slic3r/CMakeFiles/libslic3r_gui.dir/Utils/FontUtils.cpp.o -c /run/build/BambuStudio/src/slic3r/Utils/FontUtils.cpp /run/build/BambuStudio/src/slic3r/Utils/FontUtils.cpp: In function ‘std::unique_ptr<Slic3r::FontFile> Slic3r::create_font_file(const char*)’: /run/build/BambuStudio/src/slic3r/Utils/FontUtils.cpp:127:27: error: ‘error’ was not declared in this scope; did you mean ‘perror’? 127 | BOOST_LOG_TRIVIAL(error) << "Couldn't open " << file_path << " for reading."; | ^~~~~ | perror [447/494] Building CXX object src/slic3r/CMakeFiles/libslic3r_gui.dir/GUI/TaskManager.cpp.o FAILED: src/slic3r/CMakeFiles/libslic3r_gui.dir/GUI/TaskManager.cpp.o /usr/bin/c++ -DBOOST_ATOMIC_NO_LIB -DBOOST_CHRONO_NO_LIB -DBOOST_DATE_TIME_NO_LIB -DBOOST_FILESYSTEM_NO_LIB -DBOOST_IOSTREAMS_NO_LIB -DBOOST_LOCALE_NO_LIB -DBOOST_LOG_NO_LIB -DBOOST_REGEX_NO_LIB -DBOOST_SYSTEM_NO_LIB -DBOOST_THREAD_NO_LIB -DCURL_STATICLIB -DGLEW_STATIC -DLIBNEST2D_GEOMETRIES_libslic3r -DLIBNEST2D_OPTIMIZER_nlopt -DLIBNEST2D_STATIC -DLIBNEST2D_THREADING_tbb -DOPENSSL_CERT_OVERRIDE -DOPENVDB_OPENEXR_STATICLIB -DOPENVDB_STATICLIB -DSLIC3R_CURRENTLY_COMPILING_GUI_MODULE -DSLIC3R_GUI -DTBB_USE_CAPTURED_EXCEPTION=0 -DUNICODE -DUSE_TBB -DWXINTL_NO_GETTEXT_MACRO -D_UNICODE -D__WXGTK3__ -D__WXGTK__ -DwxDEBUG_LEVEL=0 -DwxNO_UNSAFE_WXSTRING_CONV -DwxUSE_UNICODE -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/run/build/BambuStudio/src -I/run/build/BambuStudio/build/src/platform -I/run/build/BambuStudio/src/hidapi/include -I/run/build/BambuStudio/src/slic3r/Utils -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/webp -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/atk-1.0 -I/usr/include/fribidi -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/sysprof-6 -I/usr/include/gstreamer-1.0 -I/run/build/BambuStudio/build/src/libslic3r -I/run/build/BambuStudio/deps/build/destdir/usr/local/include/opencascade -I/run/build/BambuStudio/src/libnest2d/include -I/run/build/BambuStudio/src/miniz -I/run/build/BambuStudio/src/glu-libtess/include -I/run/build/BambuStudio/src/clipper2/Clipper2Lib/include -I/run/build/BambuStudio/src/minilzo -isystem /run/build/BambuStudio/src/eigen -isystem /run/build/BambuStudio/src/libigl -isystem /app/lib/wx/include/gtk3-unicode-static-3.1 -isystem /app/include/wx-3.1 -isystem /run/build/BambuStudio/deps/build/destdir/usr/local/include -isystem /run/build/BambuStudio/deps/build/destdir/usr/local/include/opencv4 -isystem /run/build/BambuStudio/deps/build/destdir/usr/local/include/OpenEXR -std=gnu++20 -fext-numeric-literals -Wall -Wno-reorder -pthread -O3 -DNDEBUG -std=gnu++17 -fPIC -fsigned-char -Werror=return-type -Wno-ignored-attributes -Wno-unknown-pragmas -DOPENVDB_ABI_VERSION_NUMBER=8 -MD -MT src/slic3r/CMakeFiles/libslic3r_gui.dir/GUI/TaskManager.cpp.o -MF src/slic3r/CMakeFiles/libslic3r_gui.dir/GUI/TaskManager.cpp.o.d -o src/slic3r/CMakeFiles/libslic3r_gui.dir/GUI/TaskManager.cpp.o -c /run/build/BambuStudio/src/slic3r/GUI/TaskManager.cpp In file included from /run/build/BambuStudio/src/slic3r/GUI/TaskManager.cpp:1: /run/build/BambuStudio/src/slic3r/GUI/TaskManager.hpp: In member function ‘void Slic3r::TaskStateInfo::set_state(Slic3r::TaskState)’: /run/build/BambuStudio/src/slic3r/GUI/TaskManager.hpp:40:9: error: ‘BOOST_LOG_TRIVIAL’ was not declared in this scope 40 | BOOST_LOG_TRIVIAL(trace) << "TaskStateInfo set state = " << get_task_state_enum_str(ts); | ^~~~~~~~~~~~~~~~~ * fix OpenCV * wip - build break * fix build error wip * ENH: support preset description(tooltip) Change-Id: Iff005baac4974c538d1109fb0ba1df20b04a8f69 Jira: STUDIO-5754 * fix more build errors * Revert "ENH: load more fonts" This reverts commit 32b6fd199ac50e21db1f72089e5b3287a1776e04. * change colors * misc fixes * restore export gcode btn --------- Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Signed-off-by: Stone Li <stone.li@bambulab.com> Signed-off-by: Kunlong Ma <kunlong.ma@bambulab.com> Signed-off-by: XunZhangBambu <xun.zhang@bambulab.com> Co-authored-by: lane.wei <lane.wei@bambulab.com> Co-authored-by: Arthur <arthur.tang@bambulab.com> Co-authored-by: xun.zhang <xun.zhang@bambulab.com> Co-authored-by: zhimin.zeng <zhimin.zeng@bambulab.com> Co-authored-by: Kunlong Ma <kunlong.ma@bambulab.com> Co-authored-by: jianjia.ma <jianjia.ma@bambulab.com> Co-authored-by: liz.li <liz.li@bambulab.com> Co-authored-by: tao wang <tao.wang@bambulab.com> Co-authored-by: Stone Li <stone.li@bambulab.com> Co-authored-by: zhou.xu <zhou.xu@bambulab.com> Co-authored-by: Bastien Nocera <hadess@hadess.net> Co-authored-by: chunmao.guo <chunmao.guo@bambulab.com>
357 lines
18 KiB
C++
357 lines
18 KiB
C++
#include "Voronoi.hpp"
|
|
|
|
#include "libslic3r/Arachne/utils/PolygonsSegmentIndex.hpp"
|
|
#include "libslic3r/Geometry/VoronoiUtils.hpp"
|
|
#include "libslic3r/Geometry/VoronoiUtilsCgal.hpp"
|
|
#include "libslic3r/MultiMaterialSegmentation.hpp"
|
|
|
|
#include <boost/log/trivial.hpp>
|
|
|
|
namespace Slic3r::Geometry {
|
|
|
|
using PolygonsSegmentIndexConstIt = std::vector<Arachne::PolygonsSegmentIndex>::const_iterator;
|
|
using LinesIt = Lines::iterator;
|
|
using ColoredLinesConstIt = ColoredLines::const_iterator;
|
|
|
|
// Explicit template instantiation.
|
|
template void VoronoiDiagram::construct_voronoi(LinesIt, LinesIt, bool);
|
|
template void VoronoiDiagram::construct_voronoi(ColoredLinesConstIt, ColoredLinesConstIt, bool);
|
|
template void VoronoiDiagram::construct_voronoi(PolygonsSegmentIndexConstIt, PolygonsSegmentIndexConstIt, bool);
|
|
|
|
template<typename SegmentIterator>
|
|
typename boost::polygon::enable_if<
|
|
typename boost::polygon::gtl_if<typename boost::polygon::is_segment_concept<
|
|
typename boost::polygon::geometry_concept<typename std::iterator_traits<SegmentIterator>::value_type>::type>::type>::type,
|
|
void>::type
|
|
VoronoiDiagram::construct_voronoi(const SegmentIterator segment_begin, const SegmentIterator segment_end, const bool try_to_repair_if_needed) {
|
|
boost::polygon::construct_voronoi(segment_begin, segment_end, &m_voronoi_diagram);
|
|
if (try_to_repair_if_needed) {
|
|
if (m_issue_type = detect_known_issues(*this, segment_begin, segment_end); m_issue_type != IssueType::NO_ISSUE_DETECTED) {
|
|
if (m_issue_type == IssueType::MISSING_VORONOI_VERTEX) {
|
|
BOOST_LOG_TRIVIAL(warning) << "Detected missing Voronoi vertex, input polygons will be rotated back and forth.";
|
|
} else if (m_issue_type == IssueType::NON_PLANAR_VORONOI_DIAGRAM) {
|
|
BOOST_LOG_TRIVIAL(warning) << "Detected non-planar Voronoi diagram, input polygons will be rotated back and forth.";
|
|
} else if (m_issue_type == IssueType::VORONOI_EDGE_INTERSECTING_INPUT_SEGMENT) {
|
|
BOOST_LOG_TRIVIAL(warning) << "Detected Voronoi edge intersecting input segment, input polygons will be rotated back and forth.";
|
|
} else if (m_issue_type == IssueType::FINITE_EDGE_WITH_NON_FINITE_VERTEX) {
|
|
BOOST_LOG_TRIVIAL(warning) << "Detected finite Voronoi vertex with non finite vertex, input polygons will be rotated back and forth.";
|
|
} else {
|
|
BOOST_LOG_TRIVIAL(error) << "Detected unknown Voronoi diagram issue, input polygons will be rotated back and forth.";
|
|
}
|
|
|
|
if (m_issue_type = try_to_repair_degenerated_voronoi_diagram(segment_begin, segment_end); m_issue_type != IssueType::NO_ISSUE_DETECTED) {
|
|
if (m_issue_type == IssueType::MISSING_VORONOI_VERTEX) {
|
|
BOOST_LOG_TRIVIAL(error) << "Detected missing Voronoi vertex even after the rotation of input.";
|
|
} else if (m_issue_type == IssueType::NON_PLANAR_VORONOI_DIAGRAM) {
|
|
BOOST_LOG_TRIVIAL(error) << "Detected non-planar Voronoi diagram even after the rotation of input.";
|
|
} else if (m_issue_type == IssueType::VORONOI_EDGE_INTERSECTING_INPUT_SEGMENT) {
|
|
BOOST_LOG_TRIVIAL(error) << "Detected Voronoi edge intersecting input segment even after the rotation of input.";
|
|
} else if (m_issue_type == IssueType::FINITE_EDGE_WITH_NON_FINITE_VERTEX) {
|
|
BOOST_LOG_TRIVIAL(error) << "Detected finite Voronoi vertex with non finite vertex even after the rotation of input.";
|
|
} else {
|
|
BOOST_LOG_TRIVIAL(error) << "Detected unknown Voronoi diagram issue even after the rotation of input.";
|
|
}
|
|
|
|
m_state = State::REPAIR_UNSUCCESSFUL;
|
|
} else {
|
|
m_state = State::REPAIR_SUCCESSFUL;
|
|
}
|
|
} else {
|
|
m_state = State::REPAIR_NOT_NEEDED;
|
|
m_issue_type = IssueType::NO_ISSUE_DETECTED;
|
|
}
|
|
} else {
|
|
m_state = State::UNKNOWN;
|
|
m_issue_type = IssueType::UNKNOWN;
|
|
}
|
|
}
|
|
|
|
void VoronoiDiagram::clear()
|
|
{
|
|
if (m_is_modified) {
|
|
m_vertices.clear();
|
|
m_edges.clear();
|
|
m_cells.clear();
|
|
m_is_modified = false;
|
|
} else {
|
|
m_voronoi_diagram.clear();
|
|
}
|
|
|
|
m_state = State::UNKNOWN;
|
|
m_issue_type = IssueType::UNKNOWN;
|
|
}
|
|
|
|
void VoronoiDiagram::copy_to_local(voronoi_diagram_type &voronoi_diagram) {
|
|
m_edges.clear();
|
|
m_cells.clear();
|
|
m_vertices.clear();
|
|
|
|
// Copy Voronoi edges.
|
|
m_edges.reserve(voronoi_diagram.num_edges());
|
|
for (const edge_type &edge : voronoi_diagram.edges()) {
|
|
m_edges.emplace_back(edge.is_linear(), edge.is_primary());
|
|
m_edges.back().color(edge.color());
|
|
}
|
|
|
|
// Copy Voronoi cells.
|
|
m_cells.reserve(voronoi_diagram.num_cells());
|
|
for (const cell_type &cell : voronoi_diagram.cells()) {
|
|
m_cells.emplace_back(cell.source_index(), cell.source_category());
|
|
m_cells.back().color(cell.color());
|
|
|
|
if (cell.incident_edge()) {
|
|
size_t incident_edge_idx = cell.incident_edge() - voronoi_diagram.edges().data();
|
|
m_cells.back().incident_edge(&m_edges[incident_edge_idx]);
|
|
}
|
|
}
|
|
|
|
// Copy Voronoi vertices.
|
|
m_vertices.reserve(voronoi_diagram.num_vertices());
|
|
for (const vertex_type &vertex : voronoi_diagram.vertices()) {
|
|
m_vertices.emplace_back(vertex.x(), vertex.y());
|
|
m_vertices.back().color(vertex.color());
|
|
|
|
if (vertex.incident_edge()) {
|
|
size_t incident_edge_idx = vertex.incident_edge() - voronoi_diagram.edges().data();
|
|
m_vertices.back().incident_edge(&m_edges[incident_edge_idx]);
|
|
}
|
|
}
|
|
|
|
// Assign all pointers for each Voronoi edge.
|
|
for (const edge_type &old_edge : voronoi_diagram.edges()) {
|
|
size_t edge_idx = &old_edge - voronoi_diagram.edges().data();
|
|
edge_type &new_edge = m_edges[edge_idx];
|
|
|
|
if (old_edge.cell()) {
|
|
size_t cell_idx = old_edge.cell() - voronoi_diagram.cells().data();
|
|
new_edge.cell(&m_cells[cell_idx]);
|
|
}
|
|
|
|
if (old_edge.vertex0()) {
|
|
size_t vertex0_idx = old_edge.vertex0() - voronoi_diagram.vertices().data();
|
|
new_edge.vertex0(&m_vertices[vertex0_idx]);
|
|
}
|
|
|
|
if (old_edge.twin()) {
|
|
size_t twin_edge_idx = old_edge.twin() - voronoi_diagram.edges().data();
|
|
new_edge.twin(&m_edges[twin_edge_idx]);
|
|
}
|
|
|
|
if (old_edge.next()) {
|
|
size_t next_edge_idx = old_edge.next() - voronoi_diagram.edges().data();
|
|
new_edge.next(&m_edges[next_edge_idx]);
|
|
}
|
|
|
|
if (old_edge.prev()) {
|
|
size_t prev_edge_idx = old_edge.prev() - voronoi_diagram.edges().data();
|
|
new_edge.prev(&m_edges[prev_edge_idx]);
|
|
}
|
|
}
|
|
}
|
|
|
|
template<typename SegmentIterator>
|
|
typename boost::polygon::enable_if<
|
|
typename boost::polygon::gtl_if<typename boost::polygon::is_segment_concept<
|
|
typename boost::polygon::geometry_concept<typename std::iterator_traits<SegmentIterator>::value_type>::type>::type>::type,
|
|
VoronoiDiagram::IssueType>::type
|
|
VoronoiDiagram::detect_known_issues(const VoronoiDiagram &voronoi_diagram, SegmentIterator segment_begin, SegmentIterator segment_end)
|
|
{
|
|
if (has_finite_edge_with_non_finite_vertex(voronoi_diagram)) {
|
|
return IssueType::FINITE_EDGE_WITH_NON_FINITE_VERTEX;
|
|
} else if (const IssueType cell_issue_type = detect_known_voronoi_cell_issues(voronoi_diagram, segment_begin, segment_end); cell_issue_type != IssueType::NO_ISSUE_DETECTED) {
|
|
return cell_issue_type;
|
|
}
|
|
// BBS: test no problem in BBS
|
|
//} else if (!VoronoiUtilsCgal::is_voronoi_diagram_planar_angle(voronoi_diagram, segment_begin, segment_end)) {
|
|
// // Detection of non-planar Voronoi diagram detects at least GH issues #8474, #8514 and #8446.
|
|
// return IssueType::NON_PLANAR_VORONOI_DIAGRAM;
|
|
//}
|
|
|
|
return IssueType::NO_ISSUE_DETECTED;
|
|
}
|
|
|
|
template<typename SegmentIterator>
|
|
typename boost::polygon::enable_if<
|
|
typename boost::polygon::gtl_if<typename boost::polygon::is_segment_concept<
|
|
typename boost::polygon::geometry_concept<typename std::iterator_traits<SegmentIterator>::value_type>::type>::type>::type,
|
|
VoronoiDiagram::IssueType>::type
|
|
VoronoiDiagram::detect_known_voronoi_cell_issues(const VoronoiDiagram &voronoi_diagram,
|
|
const SegmentIterator segment_begin,
|
|
const SegmentIterator segment_end)
|
|
{
|
|
using Segment = typename std::iterator_traits<SegmentIterator>::value_type;
|
|
using Point = typename boost::polygon::segment_point_type<Segment>::type;
|
|
using SegmentCellRange = SegmentCellRange<Point>;
|
|
|
|
for (VD::cell_type cell : voronoi_diagram.cells()) {
|
|
if (cell.is_degenerate() || !cell.contains_segment())
|
|
continue; // Skip degenerated cell that has no spoon. Also, skip a cell that doesn't contain a segment.
|
|
|
|
if (const SegmentCellRange cell_range = VoronoiUtils::compute_segment_cell_range(cell, segment_begin, segment_end); cell_range.is_valid()) {
|
|
// Detection if Voronoi edge is intersecting input segment.
|
|
// It detects this type of issue at least in GH issues #8446, #8474 and #8514.
|
|
|
|
const Segment &source_segment = Geometry::VoronoiUtils::get_source_segment(cell, segment_begin, segment_end);
|
|
const Vec2d source_segment_from = boost::polygon::segment_traits<Segment>::get(source_segment, boost::polygon::LOW).template cast<double>();
|
|
const Vec2d source_segment_to = boost::polygon::segment_traits<Segment>::get(source_segment, boost::polygon::HIGH).template cast<double>();
|
|
const Vec2d source_segment_vec = source_segment_to - source_segment_from;
|
|
|
|
// All Voronoi vertices must be on the left side of the source segment, otherwise the Voronoi diagram is invalid.
|
|
for (const VD::edge_type *edge = cell_range.edge_begin; edge != cell_range.edge_end; edge = edge->next()) {
|
|
if (edge->is_infinite()) {
|
|
// When there is a missing Voronoi vertex, we may encounter an infinite Voronoi edge.
|
|
// This happens, for example, in GH issue #8846.
|
|
return IssueType::MISSING_VORONOI_VERTEX;
|
|
} else if (const Vec2d edge_v1(edge->vertex1()->x(), edge->vertex1()->y()); Slic3r::cross2(source_segment_vec, edge_v1 - source_segment_from) < 0) {
|
|
return IssueType::VORONOI_EDGE_INTERSECTING_INPUT_SEGMENT;
|
|
}
|
|
}
|
|
} else {
|
|
// When there is a missing Voronoi vertex (especially at one of the endpoints of the input segment),
|
|
// the returned cell_range is marked as invalid.
|
|
// It detects this type of issue at least in GH issue #8846.
|
|
return IssueType::MISSING_VORONOI_VERTEX;
|
|
}
|
|
}
|
|
|
|
return IssueType::NO_ISSUE_DETECTED;
|
|
}
|
|
|
|
bool VoronoiDiagram::has_finite_edge_with_non_finite_vertex(const VoronoiDiagram &voronoi_diagram)
|
|
{
|
|
for (const voronoi_diagram_type::edge_type &edge : voronoi_diagram.edges()) {
|
|
if (edge.is_finite()) {
|
|
assert(edge.vertex0() != nullptr && edge.vertex1() != nullptr);
|
|
if (edge.vertex0() == nullptr || edge.vertex1() == nullptr || !VoronoiUtils::is_finite(*edge.vertex0()) || !VoronoiUtils::is_finite(*edge.vertex1()))
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
template<typename SegmentIterator>
|
|
typename boost::polygon::enable_if<
|
|
typename boost::polygon::gtl_if<typename boost::polygon::is_segment_concept<
|
|
typename boost::polygon::geometry_concept<typename std::iterator_traits<SegmentIterator>::value_type>::type>::type>::type,
|
|
VoronoiDiagram::IssueType>::type
|
|
VoronoiDiagram::try_to_repair_degenerated_voronoi_diagram(const SegmentIterator segment_begin, const SegmentIterator segment_end)
|
|
{
|
|
IssueType issue_type = m_issue_type;
|
|
|
|
const std::vector<double> fix_angles = {PI / 6, PI / 5, PI / 7, PI / 11};
|
|
for (const double fix_angle : fix_angles) {
|
|
issue_type = try_to_repair_degenerated_voronoi_diagram_by_rotation(segment_begin, segment_end, fix_angle);
|
|
if (issue_type == IssueType::NO_ISSUE_DETECTED) {
|
|
return issue_type;
|
|
}
|
|
}
|
|
|
|
return issue_type;
|
|
}
|
|
|
|
inline VD::vertex_type::color_type encode_input_segment_endpoint(const VD::cell_type::source_index_type cell_source_index, const boost::polygon::direction_1d dir)
|
|
{
|
|
return (cell_source_index + 1) << 1 | (dir.to_int() ? 1 : 0);
|
|
}
|
|
|
|
template<typename SegmentIterator>
|
|
inline typename boost::polygon::enable_if<
|
|
typename boost::polygon::gtl_if<typename boost::polygon::is_segment_concept<
|
|
typename boost::polygon::geometry_concept<typename std::iterator_traits<SegmentIterator>::value_type>::type>::type>::type,
|
|
typename boost::polygon::segment_point_type<typename std::iterator_traits<SegmentIterator>::value_type>::type>::type
|
|
decode_input_segment_endpoint(const VD::vertex_type::color_type color, const SegmentIterator segment_begin, const SegmentIterator segment_end)
|
|
{
|
|
using SegmentType = typename std::iterator_traits<SegmentIterator>::value_type;
|
|
using PointType = typename boost::polygon::segment_traits<SegmentType>::point_type;
|
|
|
|
const size_t segment_idx = (color >> 1) - 1;
|
|
const SegmentIterator segment_it = segment_begin + segment_idx;
|
|
const PointType source_point = boost::polygon::segment_traits<SegmentType>::get(*segment_it, ((color & 1) ? boost::polygon::HIGH :
|
|
boost::polygon::LOW));
|
|
return source_point;
|
|
}
|
|
|
|
template<typename SegmentIterator>
|
|
typename boost::polygon::enable_if<
|
|
typename boost::polygon::gtl_if<typename boost::polygon::is_segment_concept<
|
|
typename boost::polygon::geometry_concept<typename std::iterator_traits<SegmentIterator>::value_type>::type>::type>::type,
|
|
VoronoiDiagram::IssueType>::type
|
|
VoronoiDiagram::try_to_repair_degenerated_voronoi_diagram_by_rotation(const SegmentIterator segment_begin,
|
|
const SegmentIterator segment_end,
|
|
const double fix_angle)
|
|
{
|
|
using SegmentType = typename std::iterator_traits<SegmentIterator>::value_type;
|
|
using PointType = typename boost::polygon::segment_traits<SegmentType>::point_type;
|
|
|
|
// Copy all segments and rotate their vertices.
|
|
std::vector<VoronoiDiagram::Segment> segments_rotated;
|
|
segments_rotated.reserve(std::distance(segment_begin, segment_end));
|
|
for (auto segment_it = segment_begin; segment_it != segment_end; ++segment_it) {
|
|
PointType from = boost::polygon::segment_traits<SegmentType>::get(*segment_it, boost::polygon::LOW);
|
|
PointType to = boost::polygon::segment_traits<SegmentType>::get(*segment_it, boost::polygon::HIGH);
|
|
segments_rotated.emplace_back(from.rotated(fix_angle), to.rotated(fix_angle));
|
|
}
|
|
|
|
VoronoiDiagram::voronoi_diagram_type voronoi_diagram_rotated;
|
|
boost::polygon::construct_voronoi(segments_rotated.begin(), segments_rotated.end(), &voronoi_diagram_rotated);
|
|
|
|
this->copy_to_local(voronoi_diagram_rotated);
|
|
const IssueType issue_type = detect_known_issues(*this, segments_rotated.begin(), segments_rotated.end());
|
|
|
|
// We want to remap all Voronoi vertices at the endpoints of input segments
|
|
// to ensure that Voronoi vertices at endpoints will be preserved after rotation.
|
|
// So we assign every Voronoi vertices color to map this Vertex into input segments.
|
|
for (cell_type cell : m_cells) {
|
|
if (cell.is_degenerate())
|
|
continue;
|
|
|
|
if (cell.contains_segment()) {
|
|
if (const SegmentCellRange cell_range = VoronoiUtils::compute_segment_cell_range(cell, segments_rotated.begin(), segments_rotated.end()); cell_range.is_valid()) {
|
|
if (cell_range.edge_end->vertex1()->color() == 0) {
|
|
// Vertex 1 of edge_end points to the starting endpoint of the input segment (from() or line.a).
|
|
VD::vertex_type::color_type color = encode_input_segment_endpoint(cell.source_index(), boost::polygon::LOW);
|
|
cell_range.edge_end->vertex1()->color(color);
|
|
}
|
|
|
|
if (cell_range.edge_begin->vertex0()->color() == 0) {
|
|
// Vertex 0 of edge_end points to the ending endpoint of the input segment (to() or line.b).
|
|
VD::vertex_type::color_type color = encode_input_segment_endpoint(cell.source_index(), boost::polygon::HIGH);
|
|
cell_range.edge_begin->vertex0()->color(color);
|
|
}
|
|
} else {
|
|
// This could happen when there is a missing Voronoi vertex even after rotation.
|
|
assert(cell_range.is_valid());
|
|
}
|
|
}
|
|
|
|
// FIXME @hejllukas: Implement mapping also for source points and not just for source segments.
|
|
}
|
|
|
|
// Rotate all Voronoi vertices back.
|
|
// When a Voronoi vertex can be mapped to the input segment endpoint, then we don't need to do rotation back.
|
|
for (vertex_type &vertex : m_vertices) {
|
|
if (vertex.color() == 0) {
|
|
// This vertex isn't mapped to any vertex, so we rotate it back.
|
|
vertex = VoronoiUtils::make_rotated_vertex(vertex, -fix_angle);
|
|
} else {
|
|
// This vertex can be mapped to the input segment endpoint.
|
|
PointType endpoint = decode_input_segment_endpoint(vertex.color(), segment_begin, segment_end);
|
|
vertex_type endpoint_vertex{double(endpoint.x()), double(endpoint.y())};
|
|
endpoint_vertex.incident_edge(vertex.incident_edge());
|
|
endpoint_vertex.color(vertex.color());
|
|
vertex = endpoint_vertex;
|
|
}
|
|
}
|
|
|
|
// We have to clear all marked vertices because some algorithms expect that all vertices have a color equal to 0.
|
|
for (vertex_type &vertex : m_vertices)
|
|
vertex.color(0);
|
|
|
|
m_voronoi_diagram.clear();
|
|
m_is_modified = true;
|
|
|
|
return issue_type;
|
|
}
|
|
|
|
} // namespace Slic3r::Geometry
|