FIX: auto-arrange ignores wipe tower due to supports

Wipe tower is needed if support base and interface use different materials.
Jira: STUDIO-1336

Change-Id: I006ece952aac1a0f0a57721c2cd1b52b2ceee28a
(cherry picked from commit 1a387e4b1607dee36f5abe499892f027e244fbeb)
This commit is contained in:
Arthur 2022-11-15 15:12:04 +08:00 committed by Lane.Wei
parent fb4f30a4a4
commit 9f96c8adec
7 changed files with 57 additions and 54 deletions

View file

@ -836,7 +836,7 @@ static void process_arrangeable(const ArrangePolygon &arrpoly,
item.binId(arrpoly.bed_idx);
item.priority(arrpoly.priority);
item.itemId(arrpoly.itemid);
item.extrude_id = arrpoly.extrude_ids.back();
item.extrude_id = arrpoly.extrude_ids.front();
item.height = arrpoly.height;
item.name = arrpoly.name;
//BBS: add virtual object logic

View file

@ -2923,7 +2923,7 @@ double ModelInstance::get_auto_brim_width() const
return get_auto_brim_width(DeltaT, adhcoeff);
}
void ModelInstance::get_arrange_polygon(void* ap) const
void ModelInstance::get_arrange_polygon(void *ap, const Slic3r::DynamicPrintConfig &config_global) const
{
// static const double SIMPLIFY_TOLERANCE_MM = 0.1;
@ -2962,6 +2962,16 @@ void ModelInstance::get_arrange_polygon(void* ap) const
ret.extrude_ids = volume->get_extruders();
if (ret.extrude_ids.empty()) //the default extruder
ret.extrude_ids.push_back(1);
// get per-object support extruders
auto op = object->get_config_value<ConfigOptionBool>(config_global, "enable_support");
bool is_support_enabled = op && op->getBool();
if (is_support_enabled) {
auto op1 = object->get_config_value<ConfigOptionInt>(config_global, "support_filament");
auto op2 = object->get_config_value<ConfigOptionInt>(config_global, "support_interface_filament");
if (op1) ret.extrude_ids.push_back(op1->getInt());
if (op2) ret.extrude_ids.push_back(op2->getInt());
}
}
indexed_triangle_set FacetsAnnotation::get_facets(const ModelVolume& mv, EnforcerBlockerType type) const

View file

@ -1111,7 +1111,7 @@ public:
// Getting the input polygon for arrange
// We use void* as input type to avoid including Arrange.hpp in Model.hpp.
void get_arrange_polygon(void* arrange_polygon) const;
void get_arrange_polygon(void *arrange_polygon, const Slic3r::DynamicPrintConfig &config = Slic3r::DynamicPrintConfig()) const;
// Apply the arrange result on the ModelInstance
void apply_arrange_result(const Vec2d& offs, double rotation)

View file

@ -88,9 +88,9 @@ void duplicate_objects(Model &model, size_t copies_num)
// Set up arrange polygon for a ModelInstance and Wipe tower
template<class T>
arrangement::ArrangePolygon get_arrange_poly(T obj)
arrangement::ArrangePolygon get_arrange_poly(T obj, const Slic3r::DynamicPrintConfig& config)
{
ArrangePolygon ap = obj.get_arrange_polygon();
ArrangePolygon ap = obj.get_arrange_polygon(config);
//BBS: always set bed_idx to 0 to use original transforms with no bed_idx
//if this object is not arranged, it can keep the original transforms
//ap.bed_idx = ap.translation.x() / bed_stride_x(plater);
@ -110,14 +110,14 @@ arrangement::ArrangePolygon get_arrange_poly(T obj)
}
template<>
arrangement::ArrangePolygon get_arrange_poly(ModelInstance* inst)
arrangement::ArrangePolygon get_arrange_poly(ModelInstance* inst, const Slic3r::DynamicPrintConfig& config)
{
return get_arrange_poly(PtrWrapper{ inst });
return get_arrange_poly(PtrWrapper{ inst },config);
}
ArrangePolygon get_instance_arrange_poly(ModelInstance* instance, const Slic3r::DynamicPrintConfig& config)
{
ArrangePolygon ap = get_arrange_poly(PtrWrapper{ instance });
ArrangePolygon ap = get_arrange_poly(PtrWrapper{ instance }, config);
//BBS: add temperature information
if (config.has("curr_bed_type")) {
@ -127,20 +127,20 @@ ArrangePolygon get_instance_arrange_poly(ModelInstance* instance, const Slic3r::
const ConfigOptionInts* bed_opt = config.option<ConfigOptionInts>(get_bed_temp_key(curr_bed_type));
if (bed_opt != nullptr)
ap.bed_temp = bed_opt->get_at(ap.extrude_ids.back()-1);
ap.bed_temp = bed_opt->get_at(ap.extrude_ids.front()-1);
const ConfigOptionInts* bed_opt_1st_layer = config.option<ConfigOptionInts>(get_bed_temp_1st_layer_key(curr_bed_type));
if (bed_opt_1st_layer != nullptr)
ap.first_bed_temp = bed_opt_1st_layer->get_at(ap.extrude_ids.back()-1);
ap.first_bed_temp = bed_opt_1st_layer->get_at(ap.extrude_ids.front()-1);
}
if (config.has("nozzle_temperature")) //get the print temperature
ap.print_temp = config.opt_int("nozzle_temperature", ap.extrude_ids.back() - 1);
ap.print_temp = config.opt_int("nozzle_temperature", ap.extrude_ids.front() - 1);
if (config.has("nozzle_temperature_initial_layer")) //get the nozzle_temperature_initial_layer
ap.first_print_temp = config.opt_int("nozzle_temperature_initial_layer", ap.extrude_ids.back() - 1);
ap.first_print_temp = config.opt_int("nozzle_temperature_initial_layer", ap.extrude_ids.front() - 1);
if (config.has("temperature_vitrification")) {
ap.vitrify_temp = config.opt_int("temperature_vitrification", ap.extrude_ids.back() - 1);
ap.vitrify_temp = config.opt_int("temperature_vitrification", ap.extrude_ids.front() - 1);
}
// get brim width

View file

@ -71,10 +71,10 @@ template<class T> struct PtrWrapper
explicit PtrWrapper(T* p) : ptr{ p } {}
arrangement::ArrangePolygon get_arrange_polygon() const
arrangement::ArrangePolygon get_arrange_polygon(const Slic3r::DynamicPrintConfig &config = Slic3r::DynamicPrintConfig()) const
{
arrangement::ArrangePolygon ap;
ptr->get_arrange_polygon(&ap);
ptr->get_arrange_polygon(&ap, config);
return ap;
}
@ -86,12 +86,12 @@ template<class T> struct PtrWrapper
};
template<class T>
arrangement::ArrangePolygon get_arrange_poly(T obj);
arrangement::ArrangePolygon get_arrange_poly(T obj, const DynamicPrintConfig &config = DynamicPrintConfig());
template<>
arrangement::ArrangePolygon get_arrange_poly(ModelInstance* inst);
arrangement::ArrangePolygon get_arrange_poly(ModelInstance* inst, const DynamicPrintConfig& config);
ArrangePolygon get_instance_arrange_poly(ModelInstance* instance, const Slic3r::DynamicPrintConfig& config);
ArrangePolygon get_instance_arrange_poly(ModelInstance* instance, const DynamicPrintConfig& config);
}
#endif // MODELARRANGE_HPP