|
|
|
|
@@ -491,23 +491,20 @@ void ArrangeJob::on_exception(const std::exception_ptr &eptr)
|
|
|
|
|
|
|
|
|
|
void ArrangeJob::process()
|
|
|
|
|
{
|
|
|
|
|
const GLCanvas3D::ArrangeSettings &settings =
|
|
|
|
|
static_cast<const GLCanvas3D*>(m_plater->canvas3D())->get_arrange_settings();
|
|
|
|
|
auto & partplate_list = m_plater->get_partplate_list();
|
|
|
|
|
auto& print = wxGetApp().plater()->get_partplate_list().get_current_fff_print();
|
|
|
|
|
|
|
|
|
|
const Slic3r::DynamicPrintConfig& global_config = wxGetApp().preset_bundle->full_config();
|
|
|
|
|
if (params.avoid_extrusion_cali_region && global_config.opt_bool("scan_first_layer"))
|
|
|
|
|
partplate_list.preprocess_nonprefered_areas(m_unselected, MAX_NUM_PLATES);
|
|
|
|
|
|
|
|
|
|
update_arrange_params(params, *m_plater, m_selected);
|
|
|
|
|
update_arrange_params(params, m_plater->config(), m_selected);
|
|
|
|
|
update_selected_items_inflation(m_selected, m_plater->config(), params);
|
|
|
|
|
update_unselected_items_inflation(m_unselected, m_plater->config(), params);
|
|
|
|
|
update_selected_items_axis_align(m_selected, m_plater->config(), params);
|
|
|
|
|
|
|
|
|
|
Points bedpts = get_shrink_bedpts(m_plater->config(),params);
|
|
|
|
|
double scaled_exclusion_gap = scale_(1);
|
|
|
|
|
partplate_list.preprocess_exclude_areas(params.excluded_regions, 1, scaled_exclusion_gap);
|
|
|
|
|
|
|
|
|
|
partplate_list.preprocess_exclude_areas(params.excluded_regions, 1, scale_(1));
|
|
|
|
|
|
|
|
|
|
BOOST_LOG_TRIVIAL(debug) << "arrange bedpts:" << bedpts[0].transpose() << ", " << bedpts[1].transpose() << ", " << bedpts[2].transpose() << ", " << bedpts[3].transpose();
|
|
|
|
|
|
|
|
|
|
@@ -518,8 +515,8 @@ void ArrangeJob::process()
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
BOOST_LOG_TRIVIAL(debug)<< "Arrange full params: "<< params.to_json();
|
|
|
|
|
BOOST_LOG_TRIVIAL(debug) << "items selected before arrange: ";
|
|
|
|
|
BOOST_LOG_TRIVIAL(warning)<< "Arrange full params: "<< params.to_json();
|
|
|
|
|
BOOST_LOG_TRIVIAL(info) << boost::format("arrange: items selected before arranging: %1%") % m_selected.size();
|
|
|
|
|
for (auto selected : m_selected)
|
|
|
|
|
BOOST_LOG_TRIVIAL(debug) << selected.name << ", extruder: " << selected.extrude_ids.back() << ", bed: " << selected.bed_idx
|
|
|
|
|
<< ", bed_temp: " << selected.first_bed_temp << ", print_temp: " << selected.print_temp;
|
|
|
|
|
@@ -533,7 +530,7 @@ void ArrangeJob::process()
|
|
|
|
|
// sort by item id
|
|
|
|
|
std::sort(m_selected.begin(), m_selected.end(), [](auto a, auto b) {return a.itemid < b.itemid; });
|
|
|
|
|
{
|
|
|
|
|
BOOST_LOG_TRIVIAL(debug) << "items selected after arrange: ";
|
|
|
|
|
BOOST_LOG_TRIVIAL(info) << boost::format("arrange: items unselected before arranging: %1%") % m_unselected.size();
|
|
|
|
|
for (auto selected : m_selected)
|
|
|
|
|
BOOST_LOG_TRIVIAL(debug) << selected.name << ", extruder: " << selected.extrude_ids.back() << ", bed: " << selected.bed_idx
|
|
|
|
|
<< ", bed_temp: " << selected.first_bed_temp << ", print_temp: " << selected.print_temp
|
|
|
|
|
@@ -707,23 +704,6 @@ double bed_stride_y(const Plater* plater) {
|
|
|
|
|
return (1. + LOGICAL_BED_GAP) * beddepth;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
arrangement::ArrangeParams get_arrange_params(Plater *p)
|
|
|
|
|
{
|
|
|
|
|
const GLCanvas3D::ArrangeSettings &settings =
|
|
|
|
|
static_cast<const GLCanvas3D*>(p->canvas3D())->get_arrange_settings();
|
|
|
|
|
|
|
|
|
|
arrangement::ArrangeParams params;
|
|
|
|
|
params.allow_rotations = settings.enable_rotation;
|
|
|
|
|
params.min_obj_distance = scaled(settings.distance);
|
|
|
|
|
//BBS: add specific params
|
|
|
|
|
params.is_seq_print = settings.is_seq_print;
|
|
|
|
|
params.bed_shrink_x = settings.bed_shrink_x;
|
|
|
|
|
params.bed_shrink_y = settings.bed_shrink_y;
|
|
|
|
|
|
|
|
|
|
return params;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// call before get selected and unselected
|
|
|
|
|
arrangement::ArrangeParams init_arrange_params(Plater *p)
|
|
|
|
|
{
|
|
|
|
|
@@ -742,8 +722,6 @@ arrangement::ArrangeParams init_arrange_params(Plater *p)
|
|
|
|
|
params.avoid_extrusion_cali_region = settings.avoid_extrusion_cali_region;
|
|
|
|
|
params.is_seq_print = settings.is_seq_print;
|
|
|
|
|
params.min_obj_distance = scaled(settings.distance);
|
|
|
|
|
params.bed_shrink_x = settings.bed_shrink_x;
|
|
|
|
|
params.bed_shrink_y = settings.bed_shrink_y;
|
|
|
|
|
params.align_to_y_axis = settings.align_to_y_axis;
|
|
|
|
|
|
|
|
|
|
int state = p->get_prepare_state();
|
|
|
|
|
@@ -753,28 +731,12 @@ arrangement::ArrangeParams init_arrange_params(Plater *p)
|
|
|
|
|
params.is_seq_print = plate->get_real_print_seq() == PrintSequence::ByObject;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (params.is_seq_print)
|
|
|
|
|
if (params.is_seq_print) {
|
|
|
|
|
params.min_obj_distance = std::max(params.min_obj_distance, scaled(params.cleareance_radius + 0.001)); // +0.001mm to avoid clearance check fail due to rounding error
|
|
|
|
|
params.bed_shrink_x = BED_SHRINK_SEQ_PRINT;
|
|
|
|
|
params.bed_shrink_y = BED_SHRINK_SEQ_PRINT;
|
|
|
|
|
}
|
|
|
|
|
return params;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//after get selected call this to update bed_shrink
|
|
|
|
|
void update_arrange_params(arrangement::ArrangeParams ¶ms, const Plater &p, const arrangement::ArrangePolygons &selected)
|
|
|
|
|
{
|
|
|
|
|
const GLCanvas3D::ArrangeSettings &settings = static_cast<const GLCanvas3D *>(p.canvas3D())->get_arrange_settings();
|
|
|
|
|
auto & print = wxGetApp().plater()->get_partplate_list().get_current_fff_print();
|
|
|
|
|
double skirt_distance = print.has_skirt() ? print.config().skirt_distance.value : 0;
|
|
|
|
|
// Note: skirt_distance is now defined between outermost brim and skirt, not the object and skirt.
|
|
|
|
|
// So we can't do max but do adding instead.
|
|
|
|
|
params.brim_skirt_distance = skirt_distance;
|
|
|
|
|
params.bed_shrink_x = settings.bed_shrink_x + params.brim_skirt_distance;
|
|
|
|
|
params.bed_shrink_y = settings.bed_shrink_y + params.brim_skirt_distance;
|
|
|
|
|
// for sequential print, we need to inflate the bed because cleareance_radius is so large
|
|
|
|
|
if (params.is_seq_print) {
|
|
|
|
|
float shift_dist = params.cleareance_radius / 2 - 5;
|
|
|
|
|
params.bed_shrink_x -= shift_dist;
|
|
|
|
|
params.bed_shrink_y -= shift_dist;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}} // namespace Slic3r::GUI
|
|
|
|
|
|