diff --git a/src/libslic3r/GCode/GCodeBinarizer.cpp b/src/libslic3r/GCode/GCodeBinarizer.cpp index ddb1816368..4191d0c3a6 100644 --- a/src/libslic3r/GCode/GCodeBinarizer.cpp +++ b/src/libslic3r/GCode/GCodeBinarizer.cpp @@ -12,7 +12,7 @@ namespace BinaryGCode { static size_t g_checksum_max_cache_size = 65536; -static const size_t MAX_GCODE_CACHE_SIZE = 65536; +static constexpr size_t MAX_GCODE_CACHE_SIZE = 65536; std::string translate_result(BinaryGCode::EResult result) { @@ -110,17 +110,17 @@ static bool decode_metadata(const std::vector& src, std::vector MAX_GCODE_CACHE_SIZE) { if (!m_gcode_cache.empty()) { - const EResult res = write_gcode_block(*m_file, m_gcode_cache, m_gcode_encoding_type, m_compression_type, m_checksum_type); + const EResult res = write_gcode_block(*m_file, m_gcode_cache, m_config.gcode_encoding, m_config.compression, m_config.checksum); if (res != EResult::Success) // propagate error return res; @@ -892,7 +891,7 @@ EResult Binarizer::finalize() // save gcode cache, if not empty if (!m_gcode_cache.empty()) { - const EResult res = write_gcode_block(*m_file, m_gcode_cache, m_gcode_encoding_type, m_compression_type, m_checksum_type); + const EResult res = write_gcode_block(*m_file, m_gcode_cache, m_config.gcode_encoding, m_config.compression, m_config.checksum); if (res != EResult::Success) // propagate error return res; diff --git a/src/libslic3r/GCode/GCodeBinarizer.hpp b/src/libslic3r/GCode/GCodeBinarizer.hpp index 3dd2d14ca7..ad4d1c640c 100644 --- a/src/libslic3r/GCode/GCodeBinarizer.hpp +++ b/src/libslic3r/GCode/GCodeBinarizer.hpp @@ -252,27 +252,31 @@ struct BinaryData } }; +struct BinarizerConfig +{ + ECompressionType compression{ ECompressionType::None }; + EGCodeEncodingType gcode_encoding{ EGCodeEncodingType::None }; + EMetadataEncodingType metadata_encoding{ EMetadataEncodingType::INI }; + EChecksumType checksum{ EChecksumType::None }; +}; + class Binarizer { public: bool is_enabled() const { return m_enabled; } void set_enabled(bool enable) { m_enabled = enable; } - void set_compression_type(ECompressionType type) { m_compression_type = type; } BinaryData& get_binary_data() { return m_binary_data; } const BinaryData& get_binary_data() const { return m_binary_data; } - EResult initialize(FILE& file, EGCodeEncodingType gcode_encoding_type, EChecksumType checksum_type); + EResult initialize(FILE& file, const BinarizerConfig& config); EResult append_gcode(const std::string& gcode); EResult finalize(); private: bool m_enabled{ false }; - EChecksumType m_checksum_type{ EChecksumType::None }; - ECompressionType m_compression_type{ ECompressionType::None }; - EGCodeEncodingType m_gcode_encoding_type{ EGCodeEncodingType::None }; - + BinarizerConfig m_config; FILE* m_file{ nullptr }; BinaryData m_binary_data; std::string m_gcode_cache; diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp index b66850fd07..e72745fac1 100644 --- a/src/libslic3r/GCode/GCodeProcessor.cpp +++ b/src/libslic3r/GCode/GCodeProcessor.cpp @@ -69,6 +69,10 @@ const std::vector GCodeProcessor::Reserved_Tags = { const float GCodeProcessor::Wipe_Width = 0.05f; const float GCodeProcessor::Wipe_Height = 0.05f; +#if ENABLE_BINARIZED_GCODE +BinaryGCode::BinarizerConfig GCodeProcessor::s_binarizer_config{}; +#endif // ENABLE_BINARIZED + #if ENABLE_GCODE_VIEWER_DATA_CHECKING const std::string GCodeProcessor::Mm3_Per_Mm_Tag = "MM3_PER_MM:"; #endif // ENABLE_GCODE_VIEWER_DATA_CHECKING @@ -3716,7 +3720,7 @@ void GCodeProcessor::post_process() } } - const BinaryGCode::EResult res = m_binarizer.initialize(*out.f, BinaryGCode::EGCodeEncodingType::None, BinaryGCode::EChecksumType::CRC32); + const BinaryGCode::EResult res = m_binarizer.initialize(*out.f, s_binarizer_config); if (res != BinaryGCode::EResult::Success) throw Slic3r::RuntimeError(std::string("Unable to initialize the gcode binarizer.\n")); } diff --git a/src/libslic3r/GCode/GCodeProcessor.hpp b/src/libslic3r/GCode/GCodeProcessor.hpp index 9ca4455945..333f3295e6 100644 --- a/src/libslic3r/GCode/GCodeProcessor.hpp +++ b/src/libslic3r/GCode/GCodeProcessor.hpp @@ -527,10 +527,15 @@ namespace Slic3r { }; #endif // ENABLE_GCODE_VIEWER_DATA_CHECKING +#if ENABLE_BINARIZED_GCODE_DEBUG_WINDOW + static BinaryGCode::BinarizerConfig& get_binarizer_config() { return s_binarizer_config; } +#endif // ENABLE_BINARIZED_GCODE_DEBUG_WINDOW + private: GCodeReader m_parser; #if ENABLE_BINARIZED_GCODE BinaryGCode::Binarizer m_binarizer; + static BinaryGCode::BinarizerConfig s_binarizer_config; #endif // ENABLE_BINARIZED_GCODE EUnits m_units; diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 92b6f8578c..6af385e71a 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -69,6 +69,7 @@ // Enable export of binarized gcode #define ENABLE_BINARIZED_GCODE (1 && ENABLE_2_6_1_ALPHA1) +#define ENABLE_BINARIZED_GCODE_DEBUG_WINDOW (1 && ENABLE_BINARIZED_GCODE) #endif // _prusaslicer_technologies_h_ diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index debdc2054d..9b89596001 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -2048,6 +2048,11 @@ void GLCanvas3D::render() #endif // ENABLE_SLA_VIEW_DEBUG_WINDOW } +#if ENABLE_BINARIZED_GCODE_DEBUG_WINDOW + if (wxGetApp().plater()->is_view3D_shown() && current_printer_technology() != ptSLA && fff_print()->config().gcode_binary) + show_binary_gcode_debug_window(); +#endif // ENABLE_BINARIZED_GCODE_DEBUG_WINDOW + std::string tooltip; // Negative coordinate means out of the window, likely because the window was deactivated. @@ -7866,6 +7871,62 @@ void GLCanvas3D::GizmoHighlighter::blink() invalidate(); } +#if ENABLE_BINARIZED_GCODE_DEBUG_WINDOW +void GLCanvas3D::show_binary_gcode_debug_window() +{ + BinaryGCode::BinarizerConfig& binarizer_config = GCodeProcessor::get_binarizer_config(); + + ImGuiWrapper& imgui = *wxGetApp().imgui(); + imgui.begin(std::string("Binary GCode"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); + + if (ImGui::BeginTable("BinaryGCodeConfig", 2)) { + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, "Compression"); + ImGui::TableSetColumnIndex(1); + const std::vector gcode_compressions = { "None" }; + int compression = (int)binarizer_config.compression; + if (imgui.combo(std::string("##1"), gcode_compressions, compression, ImGuiComboFlags_HeightLargest, 0.0f, 100.0f)) + binarizer_config.compression = (BinaryGCode::ECompressionType)compression; + + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, "GGcode encoding"); + ImGui::TableSetColumnIndex(1); + const std::vector gcode_encodings = { "None", "MeatPack" }; + int gcode_encoding = (int)binarizer_config.gcode_encoding; + if (imgui.combo(std::string("##2"), gcode_encodings, gcode_encoding, ImGuiComboFlags_HeightLargest, 0.0f, 100.0f)) + binarizer_config.gcode_encoding = (BinaryGCode::EGCodeEncodingType)gcode_encoding; + + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, "Metadata encoding"); + ImGui::TableSetColumnIndex(1); + const std::vector metadata_encodings = { "INI" }; + int metadata_encoding = (int)binarizer_config.metadata_encoding; + if (imgui.combo(std::string("##3"), metadata_encodings, metadata_encoding, ImGuiComboFlags_HeightLargest, 0.0f, 100.0f)) + binarizer_config.metadata_encoding = (BinaryGCode::EMetadataEncodingType)metadata_encoding; + + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, "Checksum type"); + ImGui::TableSetColumnIndex(1); + const std::vector checksums = { "None", "CRC32" }; + int checksum = (int)binarizer_config.checksum; + if (imgui.combo(std::string("##4"), checksums, checksum, ImGuiComboFlags_HeightLargest, 0.0f, 100.0f)) + binarizer_config.checksum = (BinaryGCode::EChecksumType)checksum; + + ImGui::EndTable(); + + ImGui::Separator(); + imgui.text("!!! WARNING !!!"); + imgui.text("Changing values does NOT invalidate the current slice"); + } + + imgui.end(); +} +#endif // ENABLE_BINARIZED_GCODE_DEBUG_WINDOW + const ModelVolume *get_model_volume(const GLVolume &v, const Model &model) { const ModelVolume * ret = nullptr; diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 4d7368ed26..2ef9c8d189 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -1113,6 +1113,10 @@ private: bool _deactivate_arrange_menu(); float get_overlay_window_width() { return LayersEditing::get_overlay_window_width(); } + +#if ENABLE_BINARIZED_GCODE_DEBUG_WINDOW + void show_binary_gcode_debug_window(); +#endif // ENABLE_BINARIZED_GCODE_DEBUG_WINDOW }; const ModelVolume *get_model_volume(const GLVolume &v, const Model &model); diff --git a/src/slic3r/GUI/ImGuiWrapper.cpp b/src/slic3r/GUI/ImGuiWrapper.cpp index 1a800eee42..d774aeb044 100644 --- a/src/slic3r/GUI/ImGuiWrapper.cpp +++ b/src/slic3r/GUI/ImGuiWrapper.cpp @@ -782,7 +782,8 @@ bool ImGuiWrapper::combo(const wxString& label, const std::vector& bool ImGuiWrapper::combo(const std::string& label, const std::vector& options, int& selection, ImGuiComboFlags flags/* = 0*/, float label_width/* = 0.0f*/, float item_width/* = 0.0f*/) { // this is to force the label to the left of the widget: - if (!label.empty()) { + const bool hidden_label = boost::starts_with(label, "##"); + if (!label.empty() && !hidden_label) { text(label); ImGui::SameLine(label_width); } @@ -792,7 +793,7 @@ bool ImGuiWrapper::combo(const std::string& label, const std::vector= 0 ? options[selection].c_str() : ""; - if (ImGui::BeginCombo(("##" + label).c_str(), selection_str, flags)) { + if (ImGui::BeginCombo(hidden_label ? label.c_str() : ("##" + label).c_str(), selection_str, flags)) { for (int i = 0; i < (int)options.size(); i++) { if (ImGui::Selectable(options[i].c_str(), i == selection)) { selection_out = i;