mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-11-02 20:51:23 -07:00 
			
		
		
		
	Added "mode" variable for custom_gcode_per_print_z
This commit is contained in:
		
							parent
							
								
									20fd874ff2
								
							
						
					
					
						commit
						89fcd7f95a
					
				
					 10 changed files with 47 additions and 26 deletions
				
			
		| 
						 | 
				
			
			@ -1088,7 +1088,7 @@ namespace Slic3r {
 | 
			
		|||
                return;
 | 
			
		||||
            pt::ptree code_tree = main_tree.front().second;
 | 
			
		||||
 | 
			
		||||
            m_model->custom_gcode_per_print_z.clear();
 | 
			
		||||
            m_model->custom_gcode_per_print_z.gcodes.clear();
 | 
			
		||||
 | 
			
		||||
            for (const auto& code : code_tree)
 | 
			
		||||
            {
 | 
			
		||||
| 
						 | 
				
			
			@ -1100,7 +1100,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.push_back(Model::CustomGCode{print_z, gcode, extruder, color}) ;
 | 
			
		||||
                m_model->custom_gcode_per_print_z.gcodes.push_back(Model::CustomGCode{print_z, gcode, extruder, color}) ;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -2631,12 +2631,12 @@ bool _3MF_Exporter::_add_custom_gcode_per_print_z_file_to_archive( mz_zip_archiv
 | 
			
		|||
{
 | 
			
		||||
    std::string out = "";
 | 
			
		||||
 | 
			
		||||
    if (!model.custom_gcode_per_print_z.empty())
 | 
			
		||||
    if (!model.custom_gcode_per_print_z.gcodes.empty())
 | 
			
		||||
    {
 | 
			
		||||
        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)
 | 
			
		||||
        for (const Model::CustomGCode& code : model.custom_gcode_per_print_z.gcodes)
 | 
			
		||||
        {
 | 
			
		||||
            pt::ptree& code_tree = main_tree.add("code", "");
 | 
			
		||||
            // store minX and maxZ
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -653,7 +653,7 @@ void AMFParserContext::endElement(const char * /* name */)
 | 
			
		|||
        int extruder = atoi(m_value[2].c_str());
 | 
			
		||||
        const std::string& color = m_value[3];
 | 
			
		||||
 | 
			
		||||
        m_model.custom_gcode_per_print_z.push_back(Model::CustomGCode{height, gcode, extruder, color});
 | 
			
		||||
        m_model.custom_gcode_per_print_z.gcodes.push_back(Model::CustomGCode{height, gcode, extruder, color});
 | 
			
		||||
 | 
			
		||||
        for (std::string& val: m_value)
 | 
			
		||||
            val.clear();
 | 
			
		||||
| 
						 | 
				
			
			@ -1250,14 +1250,14 @@ bool store_amf(const char *path, Model *model, const DynamicPrintConfig *config)
 | 
			
		|||
        stream << "  </constellation>\n";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!model->custom_gcode_per_print_z.empty())
 | 
			
		||||
    if (!model->custom_gcode_per_print_z.gcodes.empty())
 | 
			
		||||
    {
 | 
			
		||||
        std::string out = "";
 | 
			
		||||
        pt::ptree tree;
 | 
			
		||||
 | 
			
		||||
        pt::ptree& main_tree = tree.add("custom_gcodes_per_height", "");
 | 
			
		||||
 | 
			
		||||
        for (const Model::CustomGCode& code : model->custom_gcode_per_print_z)
 | 
			
		||||
        for (const Model::CustomGCode& code : model->custom_gcode_per_print_z.gcodes)
 | 
			
		||||
        {
 | 
			
		||||
            pt::ptree& code_tree = main_tree.add("code", "");
 | 
			
		||||
            // store minX and maxZ
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -462,13 +462,13 @@ void ToolOrdering::assign_custom_gcodes(const Print &print)
 | 
			
		|||
	// Only valid for non-sequential print.
 | 
			
		||||
	assert(! print.config().complete_objects.value);
 | 
			
		||||
 | 
			
		||||
	const std::vector<Model::CustomGCode>	&custom_gcode_per_print_z = print.model().custom_gcode_per_print_z;
 | 
			
		||||
	if (custom_gcode_per_print_z.empty())
 | 
			
		||||
	const Model::CustomGCodeInfo	&custom_gcode_per_print_z = print.model().custom_gcode_per_print_z;
 | 
			
		||||
	if (custom_gcode_per_print_z.gcodes.empty())
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	unsigned int 							 num_extruders = *std::max_element(m_all_printing_extruders.begin(), m_all_printing_extruders.end()) + 1;
 | 
			
		||||
	std::vector<unsigned char> 				 extruder_printing_above(num_extruders, false);
 | 
			
		||||
	auto 									 custom_gcode_it = custom_gcode_per_print_z.rbegin();
 | 
			
		||||
	auto 									 custom_gcode_it = custom_gcode_per_print_z.gcodes.rbegin();
 | 
			
		||||
	// If printing on a single extruder machine, make the tool changes trigger color change (M600) events.
 | 
			
		||||
	bool 									 tool_changes_as_color_changes = num_extruders == 1;
 | 
			
		||||
	// From the last layer to the first one:
 | 
			
		||||
| 
						 | 
				
			
			@ -478,8 +478,8 @@ void ToolOrdering::assign_custom_gcodes(const Print &print)
 | 
			
		|||
		for (unsigned int i : lt.extruders)
 | 
			
		||||
			extruder_printing_above[i] = true;
 | 
			
		||||
		// Skip all custom G-codes above this layer and skip all extruder switches.
 | 
			
		||||
		for (; custom_gcode_it != custom_gcode_per_print_z.rend() && (custom_gcode_it->print_z > lt.print_z + EPSILON || custom_gcode_it->gcode == ExtruderChangeCode); ++ custom_gcode_it);
 | 
			
		||||
		if (custom_gcode_it == custom_gcode_per_print_z.rend())
 | 
			
		||||
		for (; custom_gcode_it != custom_gcode_per_print_z.gcodes.rend() && (custom_gcode_it->print_z > lt.print_z + EPSILON || custom_gcode_it->gcode == ExtruderChangeCode); ++ custom_gcode_it);
 | 
			
		||||
		if (custom_gcode_it == custom_gcode_per_print_z.gcodes.rend())
 | 
			
		||||
			// Custom G-codes were processed.
 | 
			
		||||
			break;
 | 
			
		||||
		// Some custom G-code is configured for this layer or a layer below.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -126,7 +126,7 @@ Model Model::read_from_file(const std::string& input_file, DynamicPrintConfig* c
 | 
			
		|||
    if (add_default_instances)
 | 
			
		||||
        model.add_default_instances();
 | 
			
		||||
 | 
			
		||||
    update_custom_gcode_per_print_z_from_config(model.custom_gcode_per_print_z, config);
 | 
			
		||||
    update_custom_gcode_per_print_z_from_config(model.custom_gcode_per_print_z.gcodes, config);
 | 
			
		||||
 | 
			
		||||
    return model;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -163,7 +163,7 @@ Model Model::read_from_archive(const std::string& input_file, DynamicPrintConfig
 | 
			
		|||
    if (add_default_instances)
 | 
			
		||||
        model.add_default_instances();
 | 
			
		||||
 | 
			
		||||
    update_custom_gcode_per_print_z_from_config(model.custom_gcode_per_print_z, config);
 | 
			
		||||
    update_custom_gcode_per_print_z_from_config(model.custom_gcode_per_print_z.gcodes, config);
 | 
			
		||||
 | 
			
		||||
    return model;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1846,7 +1846,7 @@ arrangement::ArrangePolygon ModelInstance::get_arrange_polygon() const
 | 
			
		|||
std::vector<std::pair<double, unsigned int>> custom_tool_changes(const Model &model, size_t num_extruders)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<std::pair<double, unsigned int>> custom_tool_changes;
 | 
			
		||||
    for (const Model::CustomGCode &custom_gcode : model.custom_gcode_per_print_z)
 | 
			
		||||
    for (const Model::CustomGCode &custom_gcode : model.custom_gcode_per_print_z.gcodes)
 | 
			
		||||
        if (custom_gcode.gcode == ExtruderChangeCode) {
 | 
			
		||||
            // If extruder count in PrinterSettings was changed, use default (0) extruder for extruders, more than num_extruders
 | 
			
		||||
            custom_tool_changes.emplace_back(custom_gcode.print_z, static_cast<unsigned int>(custom_gcode.extruder > num_extruders ? 1 : custom_gcode.extruder));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -772,7 +772,28 @@ public:
 | 
			
		|||
        std::string color;      // if gcode is equal to PausePrintCode, 
 | 
			
		||||
                                // this field is used for save a short message shown on Printer display 
 | 
			
		||||
    };
 | 
			
		||||
    std::vector<CustomGCode> custom_gcode_per_print_z;
 | 
			
		||||
    
 | 
			
		||||
    struct CustomGCodeInfo
 | 
			
		||||
    {
 | 
			
		||||
        enum MODE
 | 
			
		||||
        {
 | 
			
		||||
            SingleExtruder,   // single extruder printer preset is selected
 | 
			
		||||
            MultiAsSingle,    // multiple extruder printer preset is selected, but 
 | 
			
		||||
                              // this mode works just for Single extruder print 
 | 
			
		||||
                              // (For all print from objects settings is used just one extruder) 
 | 
			
		||||
            MultiExtruder     // multiple extruder printer preset is selected
 | 
			
		||||
        } mode;
 | 
			
		||||
        
 | 
			
		||||
        std::vector<CustomGCode> gcodes;
 | 
			
		||||
 | 
			
		||||
        bool operator==(const CustomGCodeInfo& rhs) const
 | 
			
		||||
        {
 | 
			
		||||
            return  (rhs.mode   == this->mode   ) &&
 | 
			
		||||
                    (rhs.gcodes == this->gcodes );
 | 
			
		||||
        }
 | 
			
		||||
        bool operator!=(const CustomGCodeInfo& rhs) const { return !(*this == rhs); }
 | 
			
		||||
    } 
 | 
			
		||||
    custom_gcode_per_print_z;
 | 
			
		||||
    
 | 
			
		||||
    // Default constructor assigns a new ID to the model.
 | 
			
		||||
    Model() { assert(this->id().valid()); }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -723,7 +723,7 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_
 | 
			
		|||
			model_object_status.emplace(model_object->id(), ModelObjectStatus::New);
 | 
			
		||||
    } else {
 | 
			
		||||
        if (m_model.custom_gcode_per_print_z != model.custom_gcode_per_print_z) {
 | 
			
		||||
            update_apply_status(custom_per_printz_gcodes_tool_changes_differ(m_model.custom_gcode_per_print_z, model.custom_gcode_per_print_z) ?
 | 
			
		||||
            update_apply_status(custom_per_printz_gcodes_tool_changes_differ(m_model.custom_gcode_per_print_z.gcodes, model.custom_gcode_per_print_z.gcodes) ?
 | 
			
		||||
            	// The Tool Ordering and the Wipe Tower are no more valid.
 | 
			
		||||
            	this->invalidate_steps({ psWipeTower, psGCodeExport }) :
 | 
			
		||||
            	// There is no change in Tool Changes stored in custom_gcode_per_print_z, therefore there is no need to update Tool Ordering.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1011,7 +1011,7 @@ void GLCanvas3D::LegendTexture::fill_color_print_legend_items(  const GLCanvas3D
 | 
			
		|||
                                                                std::vector<float>& colors,
 | 
			
		||||
                                                                std::vector<std::string>& cp_legend_items)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<Model::CustomGCode> custom_gcode_per_print_z = wxGetApp().plater()->model().custom_gcode_per_print_z;
 | 
			
		||||
    std::vector<Model::CustomGCode> custom_gcode_per_print_z = wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes;
 | 
			
		||||
 | 
			
		||||
    const int extruders_cnt = wxGetApp().extruders_edited_cnt();
 | 
			
		||||
    if (extruders_cnt == 1) 
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -564,7 +564,7 @@ void Preview::update_view_type(bool slice_completed)
 | 
			
		|||
{
 | 
			
		||||
    const DynamicPrintConfig& config = wxGetApp().preset_bundle->project_config;
 | 
			
		||||
 | 
			
		||||
    const wxString& choice = !wxGetApp().plater()->model().custom_gcode_per_print_z.empty() /*&&
 | 
			
		||||
    const wxString& choice = !wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes.empty() /*&&
 | 
			
		||||
                             (wxGetApp().extruders_edited_cnt()==1 || !slice_completed) */? 
 | 
			
		||||
                                _(L("Color Print")) :
 | 
			
		||||
                                config.option<ConfigOptionFloats>("wiping_volumes_matrix")->values.size() > 1 ?
 | 
			
		||||
| 
						 | 
				
			
			@ -595,7 +595,7 @@ void Preview::create_double_slider()
 | 
			
		|||
 | 
			
		||||
    Bind(wxCUSTOMEVT_TICKSCHANGED, [this](wxEvent&) {
 | 
			
		||||
        Model& model = wxGetApp().plater()->model();
 | 
			
		||||
        model.custom_gcode_per_print_z = m_slider->GetTicksValues();
 | 
			
		||||
        model.custom_gcode_per_print_z.gcodes = m_slider->GetTicksValues();
 | 
			
		||||
        m_schedule_background_process();
 | 
			
		||||
 | 
			
		||||
        update_view_type(false);
 | 
			
		||||
| 
						 | 
				
			
			@ -664,7 +664,7 @@ void Preview::update_double_slider(const std::vector<double>& layers_z, bool kee
 | 
			
		|||
    bool   snap_to_min = force_sliders_full_range || m_slider->is_lower_at_min();
 | 
			
		||||
	bool   snap_to_max  = force_sliders_full_range || m_slider->is_higher_at_max();
 | 
			
		||||
 | 
			
		||||
    std::vector<Model::CustomGCode> &ticks_from_model = wxGetApp().plater()->model().custom_gcode_per_print_z;
 | 
			
		||||
    std::vector<Model::CustomGCode> &ticks_from_model = wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes;
 | 
			
		||||
    check_slider_values(ticks_from_model, layers_z);
 | 
			
		||||
 | 
			
		||||
    m_slider->SetSliderValues(layers_z);
 | 
			
		||||
| 
						 | 
				
			
			@ -837,7 +837,7 @@ void Preview::load_print_as_fff(bool keep_z_range)
 | 
			
		|||
        colors.push_back("#808080"); // gray color for pause print or custom G-code 
 | 
			
		||||
 | 
			
		||||
        if (!gcode_preview_data_valid)
 | 
			
		||||
            color_print_values = wxGetApp().plater()->model().custom_gcode_per_print_z;
 | 
			
		||||
            color_print_values = wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes;
 | 
			
		||||
    }
 | 
			
		||||
    else if (gcode_preview_data_valid || (m_gcode_preview_data->extrusion.view_type == GCodePreviewData::Extrusion::Tool) )
 | 
			
		||||
    {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2791,7 +2791,7 @@ void Plater::priv::reset()
 | 
			
		|||
    // The hiding of the slicing results, if shown, is not taken care by the background process, so we do it here
 | 
			
		||||
    this->sidebar->show_sliced_info_sizer(false);
 | 
			
		||||
 | 
			
		||||
    model.custom_gcode_per_print_z.clear();
 | 
			
		||||
    model.custom_gcode_per_print_z.gcodes.clear();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Plater::priv::mirror(Axis axis)
 | 
			
		||||
| 
						 | 
				
			
			@ -5349,9 +5349,9 @@ std::vector<std::string> Plater::get_extruder_colors_from_plater_config() const
 | 
			
		|||
std::vector<std::string> Plater::get_colors_for_color_print() const
 | 
			
		||||
{
 | 
			
		||||
    std::vector<std::string> colors = get_extruder_colors_from_plater_config();
 | 
			
		||||
    colors.reserve(colors.size() + p->model.custom_gcode_per_print_z.size());
 | 
			
		||||
    colors.reserve(colors.size() + p->model.custom_gcode_per_print_z.gcodes.size());
 | 
			
		||||
 | 
			
		||||
    for (const Model::CustomGCode& code : p->model.custom_gcode_per_print_z)
 | 
			
		||||
    for (const Model::CustomGCode& code : p->model.custom_gcode_per_print_z.gcodes)
 | 
			
		||||
        if (code.gcode == ColorChangeCode)
 | 
			
		||||
            colors.emplace_back(code.color);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -877,7 +877,7 @@ void PresetBundle::load_config_file_config(const std::string &name_or_path, bool
 | 
			
		|||
        // 4) Load the project config values (the per extruder wipe matrix etc).
 | 
			
		||||
        this->project_config.apply_only(config, s_project_options);
 | 
			
		||||
 | 
			
		||||
        update_custom_gcode_per_print_z_from_config(GUI::wxGetApp().plater()->model().custom_gcode_per_print_z, &this->project_config);
 | 
			
		||||
        update_custom_gcode_per_print_z_from_config(GUI::wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes, &this->project_config);
 | 
			
		||||
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue