mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-30 12:11:15 -06:00 
			
		
		
		
	
							parent
							
								
									3ef34848c7
								
							
						
					
					
						commit
						4ba7cb7ede
					
				
					 3 changed files with 28 additions and 17 deletions
				
			
		|  | @ -427,39 +427,44 @@ std::string WipeTowerIntegration::post_process_wipe_tower_moves(const WipeTower: | |||
|     Vec2f pos = tcr.start_pos; | ||||
|     Vec2f transformed_pos = pos; | ||||
|     Vec2f old_pos(-1000.1f, -1000.1f); | ||||
|     std::string never_skip_tag = WipeTower::never_skip_tag(); | ||||
| 
 | ||||
|     while (gcode_str) { | ||||
|         std::getline(gcode_str, line);  // we read the gcode line by line
 | ||||
| 
 | ||||
|         // All G1 commands should be translated and rotated
 | ||||
|         // All G1 commands should be translated and rotated. X and Y coords are
 | ||||
|         // only pushed to the output when they differ from last time.
 | ||||
|         // WT generator can override this by appending the never_skip_tag
 | ||||
|         if (line.find("G1 ") == 0) { | ||||
|             bool never_skip = false; | ||||
|             auto it = line.find(never_skip_tag); | ||||
|             if (it != std::string::npos) { | ||||
|                 // remove the tag and remember we saw it
 | ||||
|                 never_skip = true; | ||||
|                 line.erase(it, it+never_skip_tag.size()); | ||||
|             } | ||||
|             std::ostringstream line_out; | ||||
|             std::istringstream line_str(line); | ||||
|             line_str >> std::noskipws;  // don't skip whitespace
 | ||||
|             char ch = 0; | ||||
|             while (line_str >> ch) { | ||||
|                 if (ch == 'X') | ||||
|                     line_str >> pos.x(); | ||||
|                 if (ch == 'X' || ch =='Y') | ||||
|                     line_str >> (ch == 'X' ? pos.x() : pos.y()); | ||||
|                 else | ||||
|                     if (ch == 'Y') | ||||
|                         line_str >> pos.y(); | ||||
|                     else | ||||
|                         line_out << ch; | ||||
|                     line_out << ch; | ||||
|             } | ||||
| 
 | ||||
|             transformed_pos = pos; | ||||
|             transformed_pos = Eigen::Rotation2Df(angle) * transformed_pos; | ||||
|             transformed_pos += translation; | ||||
|             transformed_pos = Eigen::Rotation2Df(angle) * pos + translation; | ||||
| 
 | ||||
|             if (transformed_pos != old_pos) { | ||||
|             if (transformed_pos != old_pos || never_skip) { | ||||
|                 line = line_out.str(); | ||||
|                 std::ostringstream oss; | ||||
|                 oss << std::fixed << std::setprecision(3) << "G1 "; | ||||
|                 if (transformed_pos.x() != old_pos.x()) | ||||
|                 if (transformed_pos.x() != old_pos.x() || never_skip) | ||||
|                     oss << " X" << transformed_pos.x() - extruder_offset.x(); | ||||
|                 if (transformed_pos.y() != old_pos.y()) | ||||
|                 if (transformed_pos.y() != old_pos.y() || never_skip) | ||||
|                     oss << " Y" << transformed_pos.y() - extruder_offset.y(); | ||||
| 
 | ||||
|                 oss << " "; | ||||
|                 line.replace(line.find("G1 "), 3, oss.str()); | ||||
|                 old_pos = transformed_pos; | ||||
|             } | ||||
|  |  | |||
|  | @ -1004,9 +1004,10 @@ void WipeTower::toolchange_Change( | |||
|     writer.append("[toolchange_gcode]\n"); | ||||
| 
 | ||||
|     // Travel to where we assume we are. Custom toolchange or some special T code handling (parking extruder etc)
 | ||||
|     // gcode could have left the extruder somewhere, we cannot just start extruding.
 | ||||
| 	Vec2f current_pos = writer.pos_rotated(); | ||||
|     writer.append(std::string("G1 X") + std::to_string(current_pos.x()) +  " Y" + std::to_string(current_pos.y()) +  "\n"); | ||||
|     // gcode could have left the extruder somewhere, we cannot just start extruding. We should also inform the
 | ||||
|     // postprocessor that we absolutely want to have this in the gcode, even if it thought it is the same as before.
 | ||||
|     Vec2f current_pos = writer.pos_rotated(); | ||||
|     writer.append(std::string("G1 X") + std::to_string(current_pos.x()) +  " Y" + std::to_string(current_pos.y()) + never_skip_tag() + "\n"); | ||||
| 
 | ||||
|     // The toolchange Tn command will be inserted later, only in case that the user does
 | ||||
|     // not provide a custom toolchange gcode.
 | ||||
|  |  | |||
|  | @ -17,9 +17,12 @@ class PrintConfig; | |||
| enum GCodeFlavor : unsigned char; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| class WipeTower | ||||
| { | ||||
| public: | ||||
|     static char const* never_skip_tag() { return "_GCODE_WIPE_TOWER_NEVER_SKIP_TAG"; } | ||||
| 
 | ||||
|     struct Extrusion | ||||
|     { | ||||
| 		Extrusion(const Vec2f &pos, float width, unsigned int tool) : pos(pos), width(width), tool(tool) {} | ||||
|  | @ -96,6 +99,8 @@ public: | |||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 	// Switch to a next layer.
 | ||||
| 	void set_layer( | ||||
| 		// Print height of this layer.
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Lukas Matena
						Lukas Matena