From 04f0b96029b42aef5a82f4be6aa78e215c3948b4 Mon Sep 17 00:00:00 2001 From: "weizhen.xie" Date: Wed, 16 Jul 2025 23:12:31 +0800 Subject: [PATCH] =?UTF-8?q?FIX=EF=BC=9AFix=20the=20crash=20that=20occurred?= =?UTF-8?q?=20when=20importing=20G-code=20file?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Jira:STUDIO-13408 (cherry picked from commit 3810f4edfe086b9500860e59baf35e5568b56977) --- src/libslic3r/GCode/GCodeProcessor.cpp | 10 ++++++++++ src/libslic3r/GCode/GCodeProcessor.hpp | 3 +++ src/libslic3r/GCodeReader.hpp | 5 +++++ src/libslic3r/Print.cpp | 4 ++++ src/libslic3r/Print.hpp | 2 ++ src/libslic3r/PrintConfig.hpp | 2 +- src/slic3r/GUI/Plater.cpp | 2 ++ 7 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp index 221462fffe..a0b5917f88 100644 --- a/src/libslic3r/GCode/GCodeProcessor.cpp +++ b/src/libslic3r/GCode/GCodeProcessor.cpp @@ -2316,6 +2316,16 @@ static inline const char* remove_eols(const char *begin, const char *end) { return end; } +DynamicConfig GCodeProcessor::export_config_for_render() const +{ + DynamicConfig config; + config.set_key_value("filament_colour", new ConfigOptionStrings(m_parser.get_config().filament_colour.values)); + config.set_key_value("filament_is_support", new ConfigOptionBools(m_parser.get_config().filament_is_support.values)); + config.set_key_value("filament_type", new ConfigOptionStrings(m_parser.get_config().filament_type.values)); + config.set_key_value("filament_map", new ConfigOptionInts(m_parser.get_config().filament_map.values)); + return config; +} + // Load a G-code into a stand-alone G-code viewer. // throws CanceledException through print->throw_if_canceled() (sent by the caller as callback). void GCodeProcessor::process_file(const std::string& filename, std::function cancel_callback) diff --git a/src/libslic3r/GCode/GCodeProcessor.hpp b/src/libslic3r/GCode/GCodeProcessor.hpp index 82d1053722..08b3b90a12 100644 --- a/src/libslic3r/GCode/GCodeProcessor.hpp +++ b/src/libslic3r/GCode/GCodeProcessor.hpp @@ -847,6 +847,9 @@ class Print; const std::vector>& unprintable_filament_types ); void apply_config(const PrintConfig& config); void set_print(Print* print) { m_print = print; } + + DynamicConfig export_config_for_render() const; + void enable_stealth_time_estimator(bool enabled); bool is_stealth_time_estimator_enabled() const { return m_time_processor.machines[static_cast(PrintEstimatedStatistics::ETimeMode::Stealth)].enabled; diff --git a/src/libslic3r/GCodeReader.hpp b/src/libslic3r/GCodeReader.hpp index bcfabd7bbb..196a7f7fc6 100644 --- a/src/libslic3r/GCodeReader.hpp +++ b/src/libslic3r/GCodeReader.hpp @@ -162,6 +162,11 @@ public: float& j() { return m_position[J]; } float j() const { return m_position[J]; } + GCodeConfig get_config() const + { + return m_config; + } + private: template bool parse_file_raw_internal(const std::string &filename, ParseLineCallback parse_line_callback, LineEndCallback line_end_callback); diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 3c02f17c7c..b816b6981b 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -2798,6 +2798,10 @@ void Print::update_filament_maps_to_config(std::vector f_maps) m_has_auto_filament_map_result = true; } +void Print::apply_config_for_render(const DynamicConfig &config) +{ + m_config.apply(config); +} std::vector Print::get_filament_maps() const { diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index 584ae68723..e485d7259c 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -986,6 +986,8 @@ public: const ToolOrdering& tool_ordering() const { return m_tool_ordering; } void update_filament_maps_to_config(std::vector f_maps); + void apply_config_for_render(const DynamicConfig &config); + // 1 based group ids std::vector get_filament_maps() const; FilamentMapMode get_filament_map_mode() const; diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 88a24138e5..4c77f99801 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1236,6 +1236,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionStrings, filament_type)) ((ConfigOptionBools, filament_soluble)) ((ConfigOptionStrings, filament_ids)) + ((ConfigOptionStrings, filament_colour)) ((ConfigOptionStrings, filament_vendor)) ((ConfigOptionBools, filament_is_support)) ((ConfigOptionInts, filament_printable)) @@ -1410,7 +1411,6 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionBools, reduce_fan_stop_start_freq)) ((ConfigOptionBools, dont_slow_down_outer_wall)) ((ConfigOptionFloats, fan_cooling_layer_time)) - ((ConfigOptionStrings, filament_colour)) ((ConfigOptionBools, activate_air_filtration)) ((ConfigOptionInts, during_print_exhaust_fan_speed)) ((ConfigOptionInts, complete_print_exhaust_fan_speed)) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 1bb2c04d2e..5c20bac301 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -12431,6 +12431,8 @@ void Plater::load_gcode(const wxString& filename) current_print.apply(this->model(), wxGetApp().preset_bundle->full_config()); + current_print.apply_config_for_render(processor.export_config_for_render()); + //BBS: add cost info when drag in gcode auto& ps = current_result->print_statistics; double total_cost = 0.0;