mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-30 12:11:15 -06:00 
			
		
		
		
	 d2f915a558
			
		
	
	
		d2f915a558
		
	
	
	
	
		
			
			check nozzle temp e/flow_ratio before calculate the width Signed-off-by: qing.zhang <qing.zhang@bambulab.com> Change-Id: I5c95522f061671d4bf503258ef3cd6be714db631 (cherry picked from commit c15d6efdd36db1773ad762e6a09cf21e1a3d9c8b)
		
			
				
	
	
		
			222 lines
		
	
	
	
		
			6.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			222 lines
		
	
	
	
		
			6.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #ifndef _GCodeChecker_H_
 | |
| #define _GCodeChecker_H_
 | |
| 
 | |
| #include <iostream>
 | |
| #include <string>
 | |
| #include <vector>
 | |
| #include <array>
 | |
| 
 | |
| namespace BambuStudio {
 | |
| 
 | |
| enum class GCodeCheckResult : unsigned char
 | |
| {
 | |
|     Success,
 | |
|     ParseFailed,
 | |
|     CheckFailed,
 | |
|     Count
 | |
| };
 | |
| 
 | |
| enum class EMoveType : unsigned char
 | |
| {
 | |
|     Noop,
 | |
|     Retract,
 | |
|     Unretract,
 | |
|     Tool_change,
 | |
|     Color_change,
 | |
|     Pause_Print,
 | |
|     Custom_GCode,
 | |
|     Travel,
 | |
|     Wipe,
 | |
|     Extrude,
 | |
|     Count
 | |
| };
 | |
| 
 | |
| enum Axis {
 | |
|     X=0,
 | |
|     Y,
 | |
|     Z,
 | |
|     E,
 | |
|     F,
 | |
|     I,
 | |
|     J,
 | |
|     P,
 | |
|     NUM_AXES,
 | |
|     UNKNOWN_AXIS = NUM_AXES,
 | |
| };
 | |
| 
 | |
| enum ExtrusionRole : uint8_t {
 | |
|     erNone,
 | |
|     erPerimeter,
 | |
|     erExternalPerimeter,
 | |
|     erOverhangPerimeter,
 | |
|     erInternalInfill,
 | |
|     erSolidInfill,
 | |
|     erTopSolidInfill,
 | |
|     erBottomSurface,
 | |
|     erIroning,
 | |
|     erBridgeInfill,
 | |
|     erGapFill,
 | |
|     erSkirt,
 | |
|     erBrim,
 | |
|     erSupportMaterial,
 | |
|     erSupportMaterialInterface,
 | |
|     erSupportTransition,
 | |
|     erWipeTower,
 | |
|     erCustom,
 | |
|     // Extrusion role for a collection with multiple extrusion roles.
 | |
|     erMixed,
 | |
|     erCount
 | |
| };
 | |
| 
 | |
| class GCodeChecker {
 | |
| public:
 | |
|     class GCodeLine {
 | |
|     public:
 | |
|         GCodeLine() {}
 | |
|         const std::string cmd() const {
 | |
|             const char *cmd = GCodeChecker::skip_whitespaces(m_raw.c_str());
 | |
|             return std::string(cmd, GCodeChecker::skip_word(cmd) - cmd);
 | |
|         }
 | |
| 
 | |
|         bool has(Axis axis) const { return (m_mask & (1 << int(axis))) != 0;  }
 | |
|         double get(Axis axis) const { return m_axis[int(axis)]; }
 | |
| 
 | |
|         std::string   m_raw;
 | |
|         double        m_axis[NUM_AXES] = { 0.0f };
 | |
|         uint32_t      m_mask = 0;
 | |
|     };
 | |
| 
 | |
|     enum class EPositioningType : unsigned char
 | |
|     {
 | |
|         Absolute,
 | |
|         Relative
 | |
|     };
 | |
| 
 | |
|     GCodeChecker() {}
 | |
|     GCodeCheckResult parse_file(const std::string& path);
 | |
| 
 | |
| private:
 | |
|     bool include_chinese(const char* str);
 | |
|     GCodeCheckResult parse_line(const std::string& line);
 | |
| 
 | |
|     GCodeCheckResult parse_command(GCodeLine& gcode_line);
 | |
|     GCodeCheckResult parse_axis(GCodeLine& gcode_line);
 | |
|     GCodeCheckResult parse_G0_G1(GCodeLine& gcode_line);
 | |
|     GCodeCheckResult parse_G2_G3(GCodeLine& gcode_line);
 | |
|     GCodeCheckResult parse_G90(const GCodeLine& gcode_line);
 | |
|     GCodeCheckResult parse_G91(const GCodeLine& gcode_line);
 | |
|     GCodeCheckResult parse_G92(GCodeLine& gcode_line);
 | |
|     GCodeCheckResult parse_M82(const GCodeLine& gcode_line);
 | |
|     GCodeCheckResult parse_M83(const GCodeLine& gcode_line);
 | |
|     GCodeCheckResult parse_M104_M109(const GCodeLine &gcode_line);
 | |
| 
 | |
|     GCodeCheckResult parse_comment(GCodeLine& gcode_line);
 | |
| 
 | |
|     GCodeCheckResult check_line_width(const GCodeLine& gcode_line);
 | |
|     GCodeCheckResult check_G0_G1_width(const GCodeLine& gcode_line);
 | |
|     GCodeCheckResult check_G2_G3_width(const GCodeLine& gcode_line);
 | |
| 
 | |
|     double calculate_G1_width(const std::array<double, 3>& source,
 | |
|                              const std::array<double, 3>& target,
 | |
|                              double e, double height, bool is_bridge) const;
 | |
|     double calculate_G2_G3_width(const std::array<double, 2>& source,
 | |
|                                 const std::array<double, 2>& target,
 | |
|                                 const std::array<double, 2>& center,
 | |
|                                 bool is_ccw, double e, double height, bool is_bridge) const;
 | |
| 
 | |
| public:
 | |
|     static bool is_whitespace(char c) { return c == ' ' || c == '\t'; }
 | |
|     static bool is_end_of_line(char c) { return c == '\r' || c == '\n' || c == 0; }
 | |
|     static bool is_comment_line(char c) { return c == ';'; }
 | |
|     static bool is_end_of_gcode_line(char c) { return is_comment_line(c) || is_end_of_line(c); }
 | |
|     static bool is_end_of_word(char c) { return is_whitespace(c) || is_end_of_gcode_line(c); }
 | |
|     static const char*  skip_word(const char *c) { 
 | |
|         for (; ! is_end_of_word(*c); ++ c)
 | |
|             ; // silence -Wempty-body
 | |
|         return c;
 | |
|     }
 | |
|     static const char*  skip_whitespaces(const char *c) { 
 | |
|         for (; is_whitespace(*c); ++ c)
 | |
|             ; // silence -Wempty-body
 | |
|         return c;
 | |
|     }
 | |
|     static bool is_single_gcode_word(const char* c) {
 | |
|         c = skip_word(c);
 | |
|         c = skip_whitespaces(c);
 | |
|         return is_end_of_gcode_line(*c);
 | |
|     }
 | |
|     static bool starts_with(const std::string &comment, const std::string &tag) {
 | |
|         size_t tag_len = tag.size();
 | |
|         return comment.size() >= tag_len && comment.substr(0, tag_len) == tag;
 | |
|     }
 | |
|     static ExtrusionRole string_to_role(const std::string& role);
 | |
|     //BBS: Returns true if the number was parsed correctly into out and the number spanned the whole input string.
 | |
|     static bool parse_double_from_str(const std::string& input, double& out) {
 | |
|         size_t read = 0;
 | |
|         try {
 | |
|             out = std::stod(input, &read);
 | |
|             return input.size() == read;
 | |
|         } catch (...) {
 | |
|             return false;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     static bool parse_double_from_str(const std::string &input, std::vector<double> &out)
 | |
|     {
 | |
| 
 | |
|         std::string cmd=input;
 | |
|         size_t read = 0;
 | |
| 
 | |
|         while (cmd.size() >= 5)
 | |
|         {
 | |
|             int pt = 0;
 | |
|             for (pt = 0; pt < cmd.size(); pt++) {
 | |
|                 char temp = cmd[pt];
 | |
|                 if (temp == ',')
 | |
|                 {
 | |
|                     try {
 | |
|                         double num = std::stod(cmd.substr(0, pt), &read);
 | |
| 
 | |
|                         out.push_back(num);
 | |
|                         cmd =  cmd.substr(pt+1);
 | |
|                         break;
 | |
|                     } catch (...) {
 | |
|                         return false;
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         double num = std::stod(cmd, &read);
 | |
|         out.push_back(num);
 | |
| 
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
| private:
 | |
|     EPositioningType m_global_positioning_type = EPositioningType::Absolute;
 | |
|     EPositioningType m_e_local_positioning_type = EPositioningType::Absolute;
 | |
| 
 | |
|     std::array<double, 4> m_start_position = { 0.0, 0.0, 0.0, 0.0 };
 | |
|     std::array<double, 4> m_end_position = { 0.0, 0.0, 0.0, 0.0 };
 | |
|     std::array<double, 4> m_origin = { 0.0, 0.0, 0.0, 0.0 };
 | |
| 
 | |
|     //BBS: use these value to save information from comment
 | |
|     ExtrusionRole m_role = erNone;
 | |
|     bool m_wiping = false;
 | |
|     int m_layer_num = 0;
 | |
|     double m_height = 0.0;
 | |
|     double m_width = 0.0;
 | |
|     double z_height=0.0f;
 | |
|     double initial_layer_height=0.0f;
 | |
|     int                 filament_id;
 | |
|     double              flow_ratio  = 0;
 | |
|     double              nozzle_temp = 0.0f;
 | |
|     std::vector<double> filament_flow_ratio;
 | |
|     std::vector<double> nozzle_temperature;
 | |
|     std::vector<double> nozzle_temperature_initial_layer;
 | |
| };
 | |
| 
 | |
| }
 | |
| 
 | |
| #endif
 |