mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-31 04:31:15 -06:00 
			
		
		
		
	Synchronized mode of color_print data to/from 3mf/amf
+ Code refactoring " CustomGCode extracted to separate namespace and file
This commit is contained in:
		
							parent
							
								
									3d9ac0ada1
								
							
						
					
					
						commit
						1ed313ab79
					
				
					 19 changed files with 247 additions and 132 deletions
				
			
		|  | @ -1092,6 +1092,14 @@ namespace Slic3r { | |||
| 
 | ||||
|             for (const auto& code : code_tree) | ||||
|             { | ||||
|                 if (code.first == "mode") | ||||
|                 { | ||||
|                     pt::ptree tree = code.second; | ||||
|                     std::string mode = tree.get<std::string>("<xmlattr>.value"); | ||||
|                     m_model->custom_gcode_per_print_z.mode = mode == CustomGCode::SingleExtruderMode ? CustomGCode::Mode::SingleExtruder : | ||||
|                                                              mode == CustomGCode::MultiAsSingleMode  ? CustomGCode::Mode::MultiAsSingle  : | ||||
|                                                              CustomGCode::Mode::MultiExtruder; | ||||
|                 } | ||||
|                 if (code.first != "code") | ||||
|                     continue; | ||||
|                 pt::ptree tree = code.second; | ||||
|  | @ -1100,7 +1108,7 @@ namespace Slic3r { | |||
|                 int extruder        = tree.get<int>         ("<xmlattr>.extruder"   ); | ||||
|                 std::string color   = tree.get<std::string> ("<xmlattr>.color"      ); | ||||
| 
 | ||||
|                 m_model->custom_gcode_per_print_z.gcodes.push_back(Model::CustomGCode{print_z, gcode, extruder, color}) ; | ||||
|                 m_model->custom_gcode_per_print_z.gcodes.push_back(CustomGCode::Item{print_z, gcode, extruder, color}) ; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | @ -2615,7 +2623,7 @@ bool _3MF_Exporter::_add_custom_gcode_per_print_z_file_to_archive( mz_zip_archiv | |||
|         pt::ptree tree; | ||||
|         pt::ptree& main_tree = tree.add("custom_gcodes_per_print_z", ""); | ||||
| 
 | ||||
|         for (const Model::CustomGCode& code : model.custom_gcode_per_print_z.gcodes) | ||||
|         for (const CustomGCode::Item& code : model.custom_gcode_per_print_z.gcodes) | ||||
|         { | ||||
|             pt::ptree& code_tree = main_tree.add("code", ""); | ||||
|             // store minX and maxZ
 | ||||
|  | @ -2623,7 +2631,13 @@ bool _3MF_Exporter::_add_custom_gcode_per_print_z_file_to_archive( mz_zip_archiv | |||
|             code_tree.put("<xmlattr>.gcode"     , code.gcode    ); | ||||
|             code_tree.put("<xmlattr>.extruder"  , code.extruder ); | ||||
|             code_tree.put("<xmlattr>.color"     , code.color    ); | ||||
|         }        | ||||
|         } | ||||
| 
 | ||||
|         pt::ptree& mode_tree = main_tree.add("mode", ""); | ||||
|         // store mode of a custom_gcode_per_print_z 
 | ||||
|         mode_tree.put("<xmlattr>.value", model.custom_gcode_per_print_z.mode == CustomGCode::Mode::SingleExtruder ? CustomGCode::SingleExtruderMode : | ||||
|                                          model.custom_gcode_per_print_z.mode == CustomGCode::Mode::MultiAsSingle ?  CustomGCode::MultiAsSingleMode : | ||||
|                                          CustomGCode::MultiExtruderMode); | ||||
| 
 | ||||
|         if (!tree.empty()) | ||||
|         { | ||||
|  |  | |||
|  | @ -13,6 +13,7 @@ | |||
| #include "../Utils.hpp" | ||||
| #include "../I18N.hpp" | ||||
| #include "../Geometry.hpp" | ||||
| #include "../CustomGCode.hpp" | ||||
| 
 | ||||
| #include "AMF.hpp" | ||||
| 
 | ||||
|  | @ -156,6 +157,7 @@ struct AMFParserContext | |||
|         NODE_TYPE_PRINTABLE,            // amf/constellation/instance/mirrorz
 | ||||
|         NODE_TYPE_CUSTOM_GCODE,         // amf/custom_code_per_height
 | ||||
|         NODE_TYPE_GCODE_PER_HEIGHT,     // amf/custom_code_per_height/code
 | ||||
|         NODE_TYPE_CUSTOM_GCODE_MODE,    // amf/custom_code_per_height/mode
 | ||||
|         NODE_TYPE_METADATA,             // anywhere under amf/*/metadata
 | ||||
|     }; | ||||
| 
 | ||||
|  | @ -308,12 +310,18 @@ void AMFParserContext::startElement(const char *name, const char **atts) | |||
|             else | ||||
|                 this->stop(); | ||||
|         }  | ||||
|         else if (strcmp(name, "code") == 0 && m_path[1] == NODE_TYPE_CUSTOM_GCODE) { | ||||
|             node_type_new = NODE_TYPE_GCODE_PER_HEIGHT; | ||||
|             m_value[0] = get_attribute(atts, "height"); | ||||
|             m_value[1] = get_attribute(atts, "gcode"); | ||||
|             m_value[2] = get_attribute(atts, "extruder"); | ||||
|             m_value[3] = get_attribute(atts, "color"); | ||||
|         else if (m_path[1] == NODE_TYPE_CUSTOM_GCODE) { | ||||
|             if (strcmp(name, "code") == 0) { | ||||
|                 node_type_new = NODE_TYPE_GCODE_PER_HEIGHT; | ||||
|                 m_value[0] = get_attribute(atts, "print_z"); | ||||
|                 m_value[1] = get_attribute(atts, "gcode"); | ||||
|                 m_value[2] = get_attribute(atts, "extruder"); | ||||
|                 m_value[3] = get_attribute(atts, "color"); | ||||
|             } | ||||
|             else if (strcmp(name, "mode") == 0) { | ||||
|                 node_type_new = NODE_TYPE_CUSTOM_GCODE_MODE; | ||||
|                 m_value[0] = get_attribute(atts, "value"); | ||||
|             } | ||||
|         } | ||||
|         break; | ||||
|     case 3: | ||||
|  | @ -632,18 +640,29 @@ void AMFParserContext::endElement(const char * /* name */) | |||
|         break; | ||||
| 
 | ||||
|     case NODE_TYPE_GCODE_PER_HEIGHT: { | ||||
|         double height = double(atof(m_value[0].c_str())); | ||||
|         double print_z = double(atof(m_value[0].c_str())); | ||||
|         const std::string& gcode = m_value[1]; | ||||
|         int extruder = atoi(m_value[2].c_str()); | ||||
|         const std::string& color = m_value[3]; | ||||
| 
 | ||||
|         m_model.custom_gcode_per_print_z.gcodes.push_back(Model::CustomGCode{height, gcode, extruder, color}); | ||||
|         m_model.custom_gcode_per_print_z.gcodes.push_back(CustomGCode::Item{print_z, gcode, extruder, color}); | ||||
| 
 | ||||
|         for (std::string& val: m_value) | ||||
|             val.clear(); | ||||
|         break; | ||||
|         } | ||||
| 
 | ||||
|     case NODE_TYPE_CUSTOM_GCODE_MODE: { | ||||
|         const std::string& mode = m_value[0]; | ||||
| 
 | ||||
|         m_model.custom_gcode_per_print_z.mode = mode == CustomGCode::SingleExtruderMode ? CustomGCode::Mode::SingleExtruder : | ||||
|                                                 mode == CustomGCode::MultiAsSingleMode  ? CustomGCode::Mode::MultiAsSingle  : | ||||
|                                                                                           CustomGCode::Mode::MultiExtruder; | ||||
|         for (std::string& val: m_value) | ||||
|             val.clear(); | ||||
|         break; | ||||
|         } | ||||
| 
 | ||||
|     case NODE_TYPE_METADATA: | ||||
|         if ((m_config != nullptr) && strncmp(m_value[0].c_str(), SLIC3R_CONFIG_TYPE, strlen(SLIC3R_CONFIG_TYPE)) == 0) | ||||
|             m_config->load_from_gcode_string(m_value[1].c_str()); | ||||
|  | @ -1237,16 +1256,23 @@ bool store_amf(const char *path, Model *model, const DynamicPrintConfig *config) | |||
| 
 | ||||
|         pt::ptree& main_tree = tree.add("custom_gcodes_per_height", ""); | ||||
| 
 | ||||
|         for (const Model::CustomGCode& code : model->custom_gcode_per_print_z.gcodes) | ||||
|         for (const CustomGCode::Item& code : model->custom_gcode_per_print_z.gcodes) | ||||
|         { | ||||
|             pt::ptree& code_tree = main_tree.add("code", ""); | ||||
|             // store minX and maxZ
 | ||||
|             // store custom_gcode_per_print_z gcodes information 
 | ||||
|             code_tree.put("<xmlattr>.print_z"   , code.print_z  ); | ||||
|             code_tree.put("<xmlattr>.gcode"     , code.gcode    ); | ||||
|             code_tree.put("<xmlattr>.extruder"  , code.extruder ); | ||||
|             code_tree.put("<xmlattr>.color"     , code.color    ); | ||||
|         } | ||||
| 
 | ||||
|         pt::ptree& mode_tree = main_tree.add("mode", ""); | ||||
|         // store mode of a custom_gcode_per_print_z 
 | ||||
|         mode_tree.put("<xmlattr>.value",  | ||||
|                       model->custom_gcode_per_print_z.mode == CustomGCode::Mode::SingleExtruder ? CustomGCode::SingleExtruderMode :  | ||||
|                       model->custom_gcode_per_print_z.mode == CustomGCode::Mode::MultiAsSingle  ? | ||||
|                       CustomGCode::MultiAsSingleMode  : CustomGCode::MultiExtruderMode); | ||||
| 
 | ||||
|         if (!tree.empty()) | ||||
|         { | ||||
|             std::ostringstream oss; | ||||
|  | @ -1259,6 +1285,7 @@ bool store_amf(const char *path, Model *model, const DynamicPrintConfig *config) | |||
| 
 | ||||
|             // Post processing("beautification") of the output string
 | ||||
|             boost::replace_all(out, "><code", ">\n  <code"); | ||||
|             boost::replace_all(out, "><mode", ">\n  <mode"); | ||||
|             boost::replace_all(out, "><", ">\n<"); | ||||
| 
 | ||||
|             stream << out << "\n"; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 YuSanka
						YuSanka