Merge upstream main: Python plugins, Bambu device rework, macOS fixes

Resolved 4 conflicts:
- PrintConfig.hpp / Preset.cpp: upstream restored calib_flowrate_topinfill_special_order
  (removed in the prior merge, now re-added and re-registered); kept it alongside our
  IMEX options (imex_parallel_mode, imex_head_filament_map).
- Plater.cpp: kept our <sstream> include plus upstream's <optional> and plugin includes.
- tests/fff_print/test_gcodewriter.cpp: both sides appended disjoint scenarios after a
  shared base. Reconstructed as upstream's full file (base + its 3 toolchange/H2C
  scenarios + the boost/filesystem include its helper needs) followed by our 10
  set_pressure_advance / set_temperature scenarios. 22 scenarios total, no duplicates.
This commit is contained in:
Clifford Garwood
2026-07-19 18:33:58 -04:00
730 changed files with 2322299 additions and 1241524 deletions
+80 -11
View File
@@ -999,6 +999,9 @@ void PrintConfigDef::init_common_params()
def->tooltip = L("Select the network agent implementation for printer communication.");
def->mode = comAdvanced;
def->cli = ConfigOptionDef::nocli;
// Plugin-backed (see ConfigOptionDef::is_plugin_backed), but edited through the Choice widget above
// rather than a plugin_picker field.
def->plugin_type = "printer-connection";
def->set_default_value(new ConfigOptionString(""));
def = this->add("print_host", coString);
@@ -1096,6 +1099,17 @@ void PrintConfigDef::init_common_params()
def = this->add("preset_name", coString);
def->set_default_value(new ConfigOptionString());
}
def = this->add("plugin_config_overrides", coString);
def->label = L("Capabilities");
def->tooltip = L("Configuration for the plugin capabilities this preset uses, overriding the global "
"Capabilities configuration. Stored as a raw JSON array and edited through the dialog "
"behind the button, never typed in directly.");
// Never shown as a text field: GUIType::plugin_config renders a button that opens PluginsConfigDialog.
def->gui_type = ConfigOptionDef::GUIType::plugin_config;
def->mode = comAdvanced;
def->cli = ConfigOptionDef::nocli;
def->set_default_value(new ConfigOptionString(""));
}
void PrintConfigDef::init_fff_params()
@@ -2036,7 +2050,7 @@ void PrintConfigDef::init_fff_params()
def = this->add("initial_layer_travel_acceleration", coFloatsOrPercents);
def->label = L("First layer travel");
def->tooltip = L("Travel acceleration of first layer.\nThe percentage value is relative to Travel Acceleration.");
def->sidetext = L("mm/s² or %");
def->sidetext = L(u8"mm/s² or %");
def->min = 0;
def->mode = comAdvanced;
def->ratio_over = "travel_acceleration";
@@ -2047,7 +2061,7 @@ void PrintConfigDef::init_fff_params()
def->label = L("Bridge");
def->category = L("Speed");
def->tooltip = L("Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration.");
def->sidetext = L("mm/s² or %");
def->sidetext = L(u8"mm/s² or %");
def->min = 0;
def->mode = comAdvanced;
def->ratio_over = "outer_wall_acceleration";
@@ -3471,7 +3485,7 @@ void PrintConfigDef::init_fff_params()
def->label = L("Sparse infill");
def->category = L("Speed");
def->tooltip = L("Acceleration of sparse infill. If the value is expressed as a percentage (e.g. 100%), it will be calculated based on the default acceleration.");
def->sidetext = L("mm/s² or %");
def->sidetext = L(u8"mm/s² or %");
def->min = 0;
def->mode = comAdvanced;
def->ratio_over = "default_acceleration";
@@ -3482,7 +3496,7 @@ void PrintConfigDef::init_fff_params()
def->label = L("Internal solid infill");
def->category = L("Speed");
def->tooltip = L("Acceleration of internal solid infill. If the value is expressed as a percentage (e.g. 100%), it will be calculated based on the default acceleration.");
def->sidetext = L("mm/s² or %");
def->sidetext = L(u8"mm/s² or %");
def->min = 0;
def->mode = comAdvanced;
def->ratio_over = "default_acceleration";
@@ -3938,7 +3952,7 @@ void PrintConfigDef::init_fff_params()
"The shift is applied once every number of layers set by Layers between ripple offset, so layers within the same group are printed identically.");
def->min = 0;
def->max = 100;
def->sidetext = ("%");
def->sidetext = "%";
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionPercent(50));
@@ -4146,7 +4160,7 @@ void PrintConfigDef::init_fff_params()
"value that the firmware would silently drop, and the fan never receives a value below the one "
"you know it can actually spool at."
"\nSet to 0 to deactivate.");
def->sidetext = L("%");
def->sidetext = "%";
def->min = 0;
def->max = 100;
def->mode = comAdvanced;
@@ -4666,6 +4680,11 @@ void PrintConfigDef::init_fff_params()
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionInt(2));
// ORCA: special flag for flow rate calibration
def = this->add("calib_flowrate_topinfill_special_order", coBool);
def->mode = comDevelop;
def->set_default_value(new ConfigOptionBool(false));
def = this->add("ironing_type", coEnum);
def->label = L("Ironing type");
def->category = L("Quality");
@@ -5096,7 +5115,7 @@ void PrintConfigDef::init_fff_params()
def = this->add("input_shaping_freq_x", coFloat);
def->label = L("X");
def->tooltip = L("Resonant frequency for the X axis input shaper.\nZero will use the firmware frequency.\nTo disable input shaping, use the Disable type.\nRRF: X and Y values are equal.");
def->sidetext = "Hz";
def->sidetext = L("Hz"); // Hertz, CIS languages need translation
def->min = 0;
def->max = 1000;
def->mode = comExpert;
@@ -5105,7 +5124,7 @@ void PrintConfigDef::init_fff_params()
def = this->add("input_shaping_freq_y", coFloat);
def->label = L("Y");
def->tooltip = L("Resonant frequency for the Y axis input shaper.\nZero will use the firmware frequency.\nTo disable input shaping, use the Disable type.");
def->sidetext = "Hz";
def->sidetext = L("Hz"); // Hertz, CIS languages need translation
def->min = 0;
def->max = 1000;
def->mode = comExpert;
@@ -5502,7 +5521,23 @@ void PrintConfigDef::init_fff_params()
def->height = 5;
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionString());
def = this->add("plugins", coStrings);
def->label = L("Plugins Used");
def->tooltip = L("Plugin capabilities referenced by this preset, stored as name;uuid;capability.");
def->mode = comDevelop;
def->set_default_value(new ConfigOptionStrings());
def = this->add("slicing_pipeline_plugin", coStrings);
def->label = L("Slicing Pipeline Plugin");
def->tooltip = L("Python plugin(s) invoked at each slicing pipeline step to read and modify intermediate slicing data, "
"including a final G-code post-processing step. Research/experimental.");
def->gui_type = ConfigOptionDef::GUIType::plugin_picker;
def->plugin_type = "slicing-pipeline";
def->full_width = true;
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionStrings());
def = this->add("printer_model", coString);
def->label = L("Printer type");
def->tooltip = L("Type of the printer.");
@@ -7267,7 +7302,7 @@ void PrintConfigDef::init_fff_params()
def->label = L("Minimal");
def->tooltip = L("This is the chamber temperature at which printing should start, while the chamber continues heating "
"toward the \"Target\" chamber temperature. For example, set the Target to 60 and the Minimal to 50 to "
"begin printing once the chamber reaches 50°C, without waiting for the full 60°C.\n\n"
"begin printing once the chamber reaches 50℃, without waiting for the full 60℃.\n\n"
"It sets a G-code variable named chamber_minimal_temperature, which can be passed to your print start macro "
"or a heat soak macro, like this: PRINT_START (other variables) CHAMBER_MIN_TEMP=[chamber_minimal_temperature].\n\n"
"Unlike the \"Target\" chamber temperature, this option does not emit any M141/M191 commands; it only exposes "
@@ -7944,6 +7979,30 @@ void PrintConfigDef::init_fff_params()
def->min = 0;
def->set_default_value(new ConfigOptionPercent(85));
def = this->add("filament_dev_ams_drying_ams_limitations", coStrings);
def->set_default_value(new ConfigOptionStrings{""});
def = this->add("filament_dev_ams_drying_temperature", coFloats);
def->set_default_value(new ConfigOptionFloats{0});
def = this->add("filament_dev_ams_drying_time", coFloats);
def->set_default_value(new ConfigOptionFloats{0});
def = this->add("filament_dev_ams_drying_heat_distortion_temperature", coFloats);
def->set_default_value(new ConfigOptionFloats{0});
def = this->add("filament_dev_chamber_drying_bed_temperature", coFloats);
def->set_default_value(new ConfigOptionFloats{0});
def = this->add("filament_dev_chamber_drying_time", coFloats);
def->set_default_value(new ConfigOptionFloats{0});
def = this->add("filament_dev_drying_softening_temperature", coFloats);
def->set_default_value(new ConfigOptionFloats{0});
def = this->add("filament_dev_drying_cooling_temperature", coFloats);
def->set_default_value(new ConfigOptionFloats{0});
// Declare retract values for filament profile, overriding the printer's extruder profile.
for (auto& opt_key : filament_extruder_override_keys) {
const std::string filament_prefix = "filament_";
@@ -9139,7 +9198,6 @@ void PrintConfigDef::handle_legacy(t_config_option_key &opt_key, std::string &va
"internal_bridge_support_thickness", "top_area_threshold", "reduce_wall_solid_infill","filament_load_time","filament_unload_time",
"smooth_coefficient", "overhang_totally_speed", "silent_mode",
"overhang_speed_classic", "filament_prime_volume",
"calib_flowrate_topinfill_special_order",
"anisotropic_surfaces", // superseded by top_surface_fill_order / bottom_surface_fill_order
};
@@ -9379,6 +9437,17 @@ std::set<std::string> printer_options_with_variant_2 = {
std::set<std::string> empty_options;
std::set<std::string> filament_dev_options = {
"filament_dev_ams_drying_ams_limitations",
"filament_dev_ams_drying_temperature",
"filament_dev_ams_drying_time",
"filament_dev_ams_drying_heat_distortion_temperature",
"filament_dev_chamber_drying_bed_temperature",
"filament_dev_chamber_drying_time",
"filament_dev_drying_softening_temperature",
"filament_dev_drying_cooling_temperature"
};
DynamicPrintConfig DynamicPrintConfig::full_print_config()
{
return DynamicPrintConfig((const PrintRegionConfig&)FullPrintConfig::defaults());