mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-31 04:31:15 -06:00 
			
		
		
		
	ENH: add load_model_objects_and_custom_gcodes
Add cmd line option to pass layer change gcode. This is useful for lithophane auto change colors. Cmd: --custom-gcode custom_gcode_toolchange.json Examples of the input json file can be found in the jira. Jira: STUDIO-4070 Change-Id: I5beb5ff7d6d81028e95013e79f955e498cd3ba30 (cherry picked from commit bed6152b95c965ea87958d94ec069d8c883a8037)
This commit is contained in:
		
							parent
							
								
									f250d6f5c7
								
							
						
					
					
						commit
						ef2cc4b65c
					
				
					 4 changed files with 97 additions and 0 deletions
				
			
		|  | @ -655,6 +655,11 @@ int CLI::run(int argc, char **argv) | |||
|         } | ||||
|     } | ||||
| 
 | ||||
|     std::string custom_gcode_file; | ||||
|     ConfigOptionString* custom_gcode_option = m_config.option<ConfigOptionString>("load_custom_gcodes"); | ||||
|     if (custom_gcode_option) | ||||
|         custom_gcode_file = custom_gcode_option->value; | ||||
| 
 | ||||
|     /*for (const std::string& file : m_input_files)
 | ||||
|         if (is_gcode_file(file) && boost::filesystem::exists(file)) { | ||||
|             start_as_gcodeviewer = true; | ||||
|  | @ -845,6 +850,41 @@ int CLI::run(int argc, char **argv) | |||
|         } | ||||
|     //}
 | ||||
| 
 | ||||
|     //load custom gcode file
 | ||||
|     std::map<int, CustomGCode::Info> custom_gcodes_map; | ||||
|     if (!custom_gcode_file.empty()) { | ||||
|         // parse the custom gcode json file
 | ||||
|         std::string file = custom_gcode_file; | ||||
|         if(!boost::filesystem::exists(file)) { | ||||
|             boost::nowide::cerr << __FUNCTION__ << ": can not find custom_gcode file: " << file << std::endl; | ||||
|             record_exit_reson(outfile_dir, CLI_FILE_NOTFOUND, 0, cli_errors[CLI_FILE_NOTFOUND], sliced_info); | ||||
|             flush_and_exit(CLI_FILE_NOTFOUND); | ||||
|         } | ||||
|         try { | ||||
|             nlohmann::json jj; | ||||
|             boost::nowide::ifstream ifs(file); | ||||
|             ifs >> jj; | ||||
|             ifs.close(); | ||||
| 
 | ||||
|             int plate_id = 0; | ||||
|             if (plate_to_slice == 0) | ||||
|                 plate_id = 0; | ||||
|             else | ||||
|                 plate_id = plate_to_slice-1; | ||||
| 
 | ||||
|             CustomGCode::Info info; | ||||
|             info.from_json(jj); | ||||
| 
 | ||||
|             custom_gcodes_map.emplace(plate_id, info); | ||||
|             BOOST_LOG_TRIVIAL(info) << boost::format("load custom_gcode from file %1% success, store custom gcodes to plate %2%")%file %(plate_id+1); | ||||
|         } | ||||
|         catch (std::exception &ex) { | ||||
|             boost::nowide::cerr << __FUNCTION__<< ":Loading custom-gcode file \"" << file << "\" failed: " << ex.what() << std::endl; | ||||
|             record_exit_reson(outfile_dir, CLI_CONFIG_FILE_ERROR, 0, cli_errors[CLI_CONFIG_FILE_ERROR], sliced_info); | ||||
|             flush_and_exit(CLI_CONFIG_FILE_ERROR); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     auto load_config_file = [config_substitution_rule](const std::string& file, DynamicPrintConfig& config, std::string& config_type, | ||||
|                                 std::string& config_name, std::string& filament_id, std::string& config_from) { | ||||
|         if (! boost::filesystem::exists(file)) { | ||||
|  | @ -1774,6 +1814,19 @@ int CLI::run(int argc, char **argv) | |||
|         m_models.emplace_back(std::move(m)); | ||||
|     } | ||||
| 
 | ||||
|     //load custom gcodes into model if needed
 | ||||
|     if ((custom_gcodes_map.size() > 0)&&(m_models.size() > 0)) | ||||
|     { | ||||
|         m_models[0].plates_custom_gcodes = custom_gcodes_map; | ||||
|         /*m_models[0].plates_custom_gcodes.clear();
 | ||||
| 
 | ||||
|         for (auto& custom_gcode: custom_gcodes_map) | ||||
|         { | ||||
|             BOOST_LOG_TRIVIAL(info) << boost::format("insert custom_gocde %1% into plate %2%")%plate_id; | ||||
|             m_models[0].plates_custom_gcodes.emplace(custom_gcode.first, custom_gcode.second); | ||||
|         }*/ | ||||
|     } | ||||
| 
 | ||||
|     // Apply command line options to a more specific DynamicPrintConfig which provides normalize()
 | ||||
|     // (command line options override --load files)
 | ||||
|     m_print_config.apply(m_extra_config, true); | ||||
|  |  | |||
|  | @ -756,6 +756,7 @@ int ConfigBase::load_from_json(const std::string &file, ConfigSubstitutionContex | |||
|     try { | ||||
|         boost::nowide::ifstream ifs(file); | ||||
|         ifs >> j; | ||||
|         ifs.close(); | ||||
| 
 | ||||
|         const ConfigDef* config_def = this->def(); | ||||
|         if (config_def == nullptr) { | ||||
|  |  | |||
|  | @ -3,6 +3,7 @@ | |||
| 
 | ||||
| #include <string> | ||||
| #include <vector> | ||||
| #include <nlohmann/json.hpp> | ||||
| 
 | ||||
| namespace Slic3r { | ||||
| 
 | ||||
|  | @ -43,6 +44,24 @@ struct Item | |||
|     std::string extra;      // this field is used for the extra data like :
 | ||||
|                             // - G-code text for the Type::Custom 
 | ||||
|                             // - message text for the Type::PausePrint
 | ||||
|     void from_json(const nlohmann::json& j) { | ||||
|         std::string type_str; | ||||
|         j.at("type").get_to(type_str); | ||||
|         std::map<std::string,Type> str2type = { {"ColorChange", ColorChange }, | ||||
|             {"PausePrint",PausePrint}, | ||||
|             {"ToolChange",ToolChange}, | ||||
|             {"Template",Template}, | ||||
|             {"Custom",Custom}, | ||||
|             {"Unknown",Unknown} }; | ||||
|         type = Unknown; | ||||
|         if (str2type.find(type_str) != str2type.end()) | ||||
|             type = str2type[type_str]; | ||||
|         j.at("print_z").get_to(print_z); | ||||
|         j.at("color").get_to(color); | ||||
|         j.at("extruder").get_to(extruder); | ||||
|         if(j.contains("extra")) | ||||
|             j.at("extra").get_to(extra); | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| enum Mode | ||||
|  | @ -71,6 +90,24 @@ struct Info | |||
|                 (rhs.gcodes == this->gcodes ); | ||||
|     } | ||||
|     bool operator!=(const Info& rhs) const { return !(*this == rhs); } | ||||
| 
 | ||||
|     void from_json(const nlohmann::json& j) { | ||||
|         std::string mode_str; | ||||
|         if (j.contains("mode")) | ||||
|             j.at("mode").get_to(mode_str); | ||||
|         if (mode_str == "SingleExtruder") mode = SingleExtruder; | ||||
|         else if (mode_str == "MultiAsSingle") mode = MultiAsSingle; | ||||
|         else if (mode_str == "MultiExtruder") mode = MultiExtruder; | ||||
|         else mode = Undef; | ||||
| 
 | ||||
|         auto j_gcodes = j.at("gcodes"); | ||||
|         gcodes.reserve(j_gcodes.size()); | ||||
|         for (auto& jj : j_gcodes) { | ||||
|             Item item; | ||||
|             item.from_json(jj); | ||||
|             gcodes.push_back(item); | ||||
|         } | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| // If loaded configuration has a "colorprint_heights" option (if it was imported from older Slicer), 
 | ||||
|  |  | |||
|  | @ -5247,6 +5247,12 @@ CLIMiscConfigDef::CLIMiscConfigDef() | |||
|     def->tooltip = L("Render with a software renderer. The bundled MESA software renderer is loaded instead of the default OpenGL driver."); | ||||
|     def->min = 0;*/ | ||||
| #endif /* _MSC_VER */ | ||||
| 
 | ||||
|     def = this->add("load_custom_gcodes", coString); | ||||
|     def->label = L("Load custom gcode"); | ||||
|     def->tooltip = L("Load custom gcode from json"); | ||||
|     def->cli_params = "custom_gcode_toolchange.json"; | ||||
|     def->set_default_value(new ConfigOptionString()); | ||||
| } | ||||
| 
 | ||||
| const CLIActionsConfigDef    cli_actions_config_def; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Arthur
						Arthur