WIP: When iterating over PrintObject's regions, use the region count

by PrintObject::region_volumes. This is due to the way Print::apply()
works, it does not invalidate an existing PrintObject if a new region
is added to the print.
This commit is contained in:
bubnikv 2018-11-06 15:31:26 +01:00
parent 7c934ef951
commit 3eea327ef0
4 changed files with 26 additions and 28 deletions

View file

@ -445,7 +445,7 @@ void GCode::do_export(Print *print, const char *path, GCodePreviewData *preview_
boost::nowide::remove(path_tmp.c_str()); boost::nowide::remove(path_tmp.c_str());
throw std::runtime_error(std::string("G-code export to ") + path + " failed\nIs the disk full?\n"); throw std::runtime_error(std::string("G-code export to ") + path + " failed\nIs the disk full?\n");
} }
} catch (std::exception &ex) { } catch (std::exception & /* ex */) {
// Rethrow on any exception. std::runtime_exception and CanceledException are expected to be thrown. // Rethrow on any exception. std::runtime_exception and CanceledException are expected to be thrown.
// Close and remove the file. // Close and remove the file.
fclose(file); fclose(file);
@ -606,7 +606,7 @@ void GCode::_do_export(Print &print, FILE *file, GCodePreviewData *preview_data)
// get the minimum cross-section used in the print // get the minimum cross-section used in the print
std::vector<double> mm3_per_mm; std::vector<double> mm3_per_mm;
for (auto object : printable_objects) { for (auto object : printable_objects) {
for (size_t region_id = 0; region_id < print.regions().size(); ++region_id) { for (size_t region_id = 0; region_id < object->region_volumes.size(); ++ region_id) {
auto region = print.regions()[region_id]; auto region = print.regions()[region_id];
for (auto layer : object->layers()) { for (auto layer : object->layers()) {
auto layerm = layer->regions()[region_id]; auto layerm = layer->regions()[region_id];
@ -1442,7 +1442,7 @@ void GCode::process_layer(
}; };
for (size_t region_id = 0; region_id < print.regions().size(); ++ region_id) { for (size_t region_id = 0; region_id < print.regions().size(); ++ region_id) {
const LayerRegion *layerm = layer.regions()[region_id]; const LayerRegion *layerm = (region_id < layer.regions().size()) ? layer.regions()[region_id] : nullptr;
if (layerm == nullptr) if (layerm == nullptr)
continue; continue;
const PrintRegion &region = *print.regions()[region_id]; const PrintRegion &region = *print.regions()[region_id];

View file

@ -151,7 +151,7 @@ void ToolOrdering::collect_extruders(const PrintObject &object)
for (auto layer : object.layers()) { for (auto layer : object.layers()) {
LayerTools &layer_tools = this->tools_for_layer(layer->print_z); LayerTools &layer_tools = this->tools_for_layer(layer->print_z);
// What extruders are required to print this object layer? // What extruders are required to print this object layer?
for (size_t region_id = 0; region_id < object.print()->regions().size(); ++ region_id) { for (size_t region_id = 0; region_id < object.region_volumes.size(); ++ region_id) {
const LayerRegion *layerm = (region_id < layer->regions().size()) ? layer->regions()[region_id] : nullptr; const LayerRegion *layerm = (region_id < layer->regions().size()) ? layer->regions()[region_id] : nullptr;
if (layerm == nullptr) if (layerm == nullptr)
continue; continue;

View file

@ -184,7 +184,7 @@ void PrintObject::make_perimeters()
// but we don't generate any extra perimeter if fill density is zero, as they would be floating // but we don't generate any extra perimeter if fill density is zero, as they would be floating
// inside the object - infill_only_where_needed should be the method of choice for printing // inside the object - infill_only_where_needed should be the method of choice for printing
// hollow objects // hollow objects
for (size_t region_id = 0; region_id < m_print->regions().size(); ++ region_id) { for (size_t region_id = 0; region_id < this->region_volumes.size(); ++ region_id) {
const PrintRegion &region = *m_print->regions()[region_id]; const PrintRegion &region = *m_print->regions()[region_id];
if (! region.config().extra_perimeters || region.config().perimeters == 0 || region.config().fill_density == 0 || this->layer_count() < 2) if (! region.config().extra_perimeters || region.config().perimeters == 0 || region.config().fill_density == 0 || this->layer_count() < 2)
continue; continue;
@ -313,7 +313,7 @@ void PrintObject::prepare_infill()
// Debugging output. // Debugging output.
#ifdef SLIC3R_DEBUG_SLICE_PROCESSING #ifdef SLIC3R_DEBUG_SLICE_PROCESSING
for (size_t region_id = 0; region_id < this->print()->regions().size(); ++ region_id) { for (size_t region_id = 0; region_id < this->region_volumes.size(); ++ region_id) {
for (const Layer *layer : m_layers) { for (const Layer *layer : m_layers) {
LayerRegion *layerm = layer->m_regions[region_id]; LayerRegion *layerm = layer->m_regions[region_id];
layerm->export_region_slices_to_svg_debug("6_discover_vertical_shells-final"); layerm->export_region_slices_to_svg_debug("6_discover_vertical_shells-final");
@ -332,7 +332,7 @@ void PrintObject::prepare_infill()
m_print->throw_if_canceled(); m_print->throw_if_canceled();
#ifdef SLIC3R_DEBUG_SLICE_PROCESSING #ifdef SLIC3R_DEBUG_SLICE_PROCESSING
for (size_t region_id = 0; region_id < this->print()->regions().size(); ++ region_id) { for (size_t region_id = 0; region_id < this->region_volumes.size(); ++ region_id) {
for (const Layer *layer : m_layers) { for (const Layer *layer : m_layers) {
LayerRegion *layerm = layer->m_regions[region_id]; LayerRegion *layerm = layer->m_regions[region_id];
layerm->export_region_slices_to_svg_debug("7_discover_horizontal_shells-final"); layerm->export_region_slices_to_svg_debug("7_discover_horizontal_shells-final");
@ -351,7 +351,7 @@ void PrintObject::prepare_infill()
m_print->throw_if_canceled(); m_print->throw_if_canceled();
#ifdef SLIC3R_DEBUG_SLICE_PROCESSING #ifdef SLIC3R_DEBUG_SLICE_PROCESSING
for (size_t region_id = 0; region_id < this->print()->regions().size(); ++ region_id) { for (size_t region_id = 0; region_id < this->region_volumes.size(); ++ region_id) {
for (const Layer *layer : m_layers) { for (const Layer *layer : m_layers) {
LayerRegion *layerm = layer->m_regions[region_id]; LayerRegion *layerm = layer->m_regions[region_id];
layerm->export_region_slices_to_svg_debug("8_clip_surfaces-final"); layerm->export_region_slices_to_svg_debug("8_clip_surfaces-final");
@ -370,7 +370,7 @@ void PrintObject::prepare_infill()
m_print->throw_if_canceled(); m_print->throw_if_canceled();
#ifdef SLIC3R_DEBUG_SLICE_PROCESSING #ifdef SLIC3R_DEBUG_SLICE_PROCESSING
for (size_t region_id = 0; region_id < this->print()->regions().size(); ++ region_id) { for (size_t region_id = 0; region_id < this->region_volumes.size(); ++ region_id) {
for (const Layer *layer : m_layers) { for (const Layer *layer : m_layers) {
LayerRegion *layerm = layer->m_regions[region_id]; LayerRegion *layerm = layer->m_regions[region_id];
layerm->export_region_slices_to_svg_debug("9_prepare_infill-final"); layerm->export_region_slices_to_svg_debug("9_prepare_infill-final");
@ -818,7 +818,7 @@ void PrintObject::process_external_surfaces()
{ {
BOOST_LOG_TRIVIAL(info) << "Processing external surfaces..."; BOOST_LOG_TRIVIAL(info) << "Processing external surfaces...";
for (size_t region_id = 0; region_id < m_print->regions().size(); ++ region_id) { for (size_t region_id = 0; region_id < this->region_volumes.size(); ++region_id) {
const PrintRegion &region = *m_print->regions()[region_id]; const PrintRegion &region = *m_print->regions()[region_id];
BOOST_LOG_TRIVIAL(debug) << "Processing external surfaces for region " << region_id << " in parallel - start"; BOOST_LOG_TRIVIAL(debug) << "Processing external surfaces for region " << region_id << " in parallel - start";
@ -851,13 +851,13 @@ void PrintObject::discover_vertical_shells()
Polygons holes; Polygons holes;
}; };
std::vector<DiscoverVerticalShellsCacheEntry> cache_top_botom_regions(m_layers.size(), DiscoverVerticalShellsCacheEntry()); std::vector<DiscoverVerticalShellsCacheEntry> cache_top_botom_regions(m_layers.size(), DiscoverVerticalShellsCacheEntry());
bool top_bottom_surfaces_all_regions = m_print->regions().size() > 1 && ! m_config.interface_shells.value; bool top_bottom_surfaces_all_regions = this->region_volumes.size() > 1 && ! m_config.interface_shells.value;
if (top_bottom_surfaces_all_regions) { if (top_bottom_surfaces_all_regions) {
// This is a multi-material print and interface_shells are disabled, meaning that the vertical shell thickness // This is a multi-material print and interface_shells are disabled, meaning that the vertical shell thickness
// is calculated over all materials. // is calculated over all materials.
// Is the "ensure vertical wall thickness" applicable to any region? // Is the "ensure vertical wall thickness" applicable to any region?
bool has_extra_layers = false; bool has_extra_layers = false;
for (size_t idx_region = 0; idx_region < m_print->regions().size(); ++ idx_region) { for (size_t idx_region = 0; idx_region < this->region_volumes.size(); ++ idx_region) {
const PrintRegion &region = *m_print->get_region(idx_region); const PrintRegion &region = *m_print->get_region(idx_region);
if (region.config().ensure_vertical_shell_thickness.value && if (region.config().ensure_vertical_shell_thickness.value &&
(region.config().top_solid_layers.value > 1 || region.config().bottom_solid_layers.value > 1)) { (region.config().top_solid_layers.value > 1 || region.config().bottom_solid_layers.value > 1)) {
@ -874,7 +874,7 @@ void PrintObject::discover_vertical_shells()
tbb::blocked_range<size_t>(0, m_layers.size(), grain_size), tbb::blocked_range<size_t>(0, m_layers.size(), grain_size),
[this, &cache_top_botom_regions](const tbb::blocked_range<size_t>& range) { [this, &cache_top_botom_regions](const tbb::blocked_range<size_t>& range) {
const SurfaceType surfaces_bottom[2] = { stBottom, stBottomBridge }; const SurfaceType surfaces_bottom[2] = { stBottom, stBottomBridge };
const size_t num_regions = m_print->regions().size(); const size_t num_regions = this->region_volumes.size();
for (size_t idx_layer = range.begin(); idx_layer < range.end(); ++ idx_layer) { for (size_t idx_layer = range.begin(); idx_layer < range.end(); ++ idx_layer) {
m_print->throw_if_canceled(); m_print->throw_if_canceled();
const Layer &layer = *m_layers[idx_layer]; const Layer &layer = *m_layers[idx_layer];
@ -935,7 +935,7 @@ void PrintObject::discover_vertical_shells()
BOOST_LOG_TRIVIAL(debug) << "Discovering vertical shells in parallel - end : cache top / bottom"; BOOST_LOG_TRIVIAL(debug) << "Discovering vertical shells in parallel - end : cache top / bottom";
} }
for (size_t idx_region = 0; idx_region < m_print->regions().size(); ++ idx_region) { for (size_t idx_region = 0; idx_region < this->region_volumes.size(); ++ idx_region) {
PROFILE_BLOCK(discover_vertical_shells_region); PROFILE_BLOCK(discover_vertical_shells_region);
const PrintRegion &region = *m_print->get_region(idx_region); const PrintRegion &region = *m_print->get_region(idx_region);
@ -1227,7 +1227,7 @@ void PrintObject::bridge_over_infill()
{ {
BOOST_LOG_TRIVIAL(info) << "Bridge over infill..."; BOOST_LOG_TRIVIAL(info) << "Bridge over infill...";
for (size_t region_id = 0; region_id < m_print->regions().size(); ++ region_id) { for (size_t region_id = 0; region_id < this->region_volumes.size(); ++ region_id) {
const PrintRegion &region = *m_print->regions()[region_id]; const PrintRegion &region = *m_print->regions()[region_id];
// skip bridging in case there are no voids // skip bridging in case there are no voids
@ -1444,14 +1444,14 @@ void PrintObject::_slice()
layer->lower_layer = prev; layer->lower_layer = prev;
} }
// Make sure all layers contain layer region objects for all regions. // Make sure all layers contain layer region objects for all regions.
for (size_t region_id = 0; region_id < this->print()->regions().size(); ++ region_id) for (size_t region_id = 0; region_id < this->region_volumes.size(); ++ region_id)
layer->add_region(this->print()->regions()[region_id]); layer->add_region(this->print()->regions()[region_id]);
prev = layer; prev = layer;
} }
} }
// Slice all non-modifier volumes. // Slice all non-modifier volumes.
for (size_t region_id = 0; region_id < this->print()->regions().size(); ++ region_id) { for (size_t region_id = 0; region_id < this->region_volumes.size(); ++ region_id) {
BOOST_LOG_TRIVIAL(debug) << "Slicing objects - region " << region_id; BOOST_LOG_TRIVIAL(debug) << "Slicing objects - region " << region_id;
std::vector<ExPolygons> expolygons_by_layer = this->_slice_region(region_id, slice_zs, false); std::vector<ExPolygons> expolygons_by_layer = this->_slice_region(region_id, slice_zs, false);
m_print->throw_if_canceled(); m_print->throw_if_canceled();
@ -1463,14 +1463,14 @@ void PrintObject::_slice()
} }
// Slice all modifier volumes. // Slice all modifier volumes.
if (this->print()->regions().size() > 1) { if (this->region_volumes.size() > 1) {
for (size_t region_id = 0; region_id < this->print()->regions().size(); ++ region_id) { for (size_t region_id = 0; region_id < this->region_volumes.size(); ++ region_id) {
BOOST_LOG_TRIVIAL(debug) << "Slicing modifier volumes - region " << region_id; BOOST_LOG_TRIVIAL(debug) << "Slicing modifier volumes - region " << region_id;
std::vector<ExPolygons> expolygons_by_layer = this->_slice_region(region_id, slice_zs, true); std::vector<ExPolygons> expolygons_by_layer = this->_slice_region(region_id, slice_zs, true);
m_print->throw_if_canceled(); m_print->throw_if_canceled();
// loop through the other regions and 'steal' the slices belonging to this one // loop through the other regions and 'steal' the slices belonging to this one
BOOST_LOG_TRIVIAL(debug) << "Slicing modifier volumes - stealing " << region_id << " start"; BOOST_LOG_TRIVIAL(debug) << "Slicing modifier volumes - stealing " << region_id << " start";
for (size_t other_region_id = 0; other_region_id < this->print()->regions().size(); ++ other_region_id) { for (size_t other_region_id = 0; other_region_id < this->region_volumes.size(); ++ other_region_id) {
if (region_id == other_region_id) if (region_id == other_region_id)
continue; continue;
for (size_t layer_id = 0; layer_id < expolygons_by_layer.size(); ++ layer_id) { for (size_t layer_id = 0; layer_id < expolygons_by_layer.size(); ++ layer_id) {
@ -1497,7 +1497,7 @@ void PrintObject::_slice()
BOOST_LOG_TRIVIAL(debug) << "Slicing objects - removing top empty layers"; BOOST_LOG_TRIVIAL(debug) << "Slicing objects - removing top empty layers";
while (! m_layers.empty()) { while (! m_layers.empty()) {
const Layer *layer = m_layers.back(); const Layer *layer = m_layers.back();
for (size_t region_id = 0; region_id < this->print()->regions().size(); ++ region_id) for (size_t region_id = 0; region_id < this->region_volumes.size(); ++ region_id)
if (layer->m_regions[region_id] != nullptr && ! layer->m_regions[region_id]->slices.empty()) if (layer->m_regions[region_id] != nullptr && ! layer->m_regions[region_id]->slices.empty())
// Non empty layer. // Non empty layer.
goto end; goto end;
@ -1756,7 +1756,7 @@ void PrintObject::_make_perimeters()
// but we don't generate any extra perimeter if fill density is zero, as they would be floating // but we don't generate any extra perimeter if fill density is zero, as they would be floating
// inside the object - infill_only_where_needed should be the method of choice for printing // inside the object - infill_only_where_needed should be the method of choice for printing
// hollow objects // hollow objects
for (size_t region_id = 0; region_id < m_print->regions().size(); ++ region_id) { for (size_t region_id = 0; region_id < this->region_volumes.size(); ++ region_id) {
const PrintRegion &region = *m_print->regions()[region_id]; const PrintRegion &region = *m_print->regions()[region_id];
if (! region.config().extra_perimeters || region.config().perimeters == 0 || region.config().fill_density == 0 || this->layer_count() < 2) if (! region.config().extra_perimeters || region.config().perimeters == 0 || region.config().fill_density == 0 || this->layer_count() < 2)
continue; continue;
@ -1928,7 +1928,7 @@ void PrintObject::discover_horizontal_shells()
{ {
BOOST_LOG_TRIVIAL(trace) << "discover_horizontal_shells()"; BOOST_LOG_TRIVIAL(trace) << "discover_horizontal_shells()";
for (size_t region_id = 0; region_id < this->print()->regions().size(); ++ region_id) { for (size_t region_id = 0; region_id < this->region_volumes.size(); ++ region_id) {
for (int i = 0; i < int(m_layers.size()); ++ i) { for (int i = 0; i < int(m_layers.size()); ++ i) {
m_print->throw_if_canceled(); m_print->throw_if_canceled();
LayerRegion *layerm = m_layers[i]->regions()[region_id]; LayerRegion *layerm = m_layers[i]->regions()[region_id];
@ -2102,7 +2102,7 @@ void PrintObject::discover_horizontal_shells()
} // for each region } // for each region
#ifdef SLIC3R_DEBUG_SLICE_PROCESSING #ifdef SLIC3R_DEBUG_SLICE_PROCESSING
for (size_t region_id = 0; region_id < this->print()->regions().size(); ++ region_id) { for (size_t region_id = 0; region_id < this->region_volumes.size(); ++ region_id) {
for (const Layer *layer : m_layers) { for (const Layer *layer : m_layers) {
const LayerRegion *layerm = layer->m_regions[region_id]; const LayerRegion *layerm = layer->m_regions[region_id];
layerm->export_region_slices_to_svg_debug("5_discover_horizontal_shells"); layerm->export_region_slices_to_svg_debug("5_discover_horizontal_shells");
@ -2118,7 +2118,7 @@ void PrintObject::discover_horizontal_shells()
void PrintObject::combine_infill() void PrintObject::combine_infill()
{ {
// Work on each region separately. // Work on each region separately.
for (size_t region_id = 0; region_id < this->print()->regions().size(); ++ region_id) { for (size_t region_id = 0; region_id < this->region_volumes.size(); ++ region_id) {
const PrintRegion *region = this->print()->regions()[region_id]; const PrintRegion *region = this->print()->regions()[region_id];
const int every = region->config().infill_every_layers.value; const int every = region->config().infill_every_layers.value;
if (every < 2 || region->config().fill_density == 0.) if (every < 2 || region->config().fill_density == 0.)

View file

@ -44,8 +44,6 @@ _constant()
int region_count() int region_count()
%code%{ RETVAL = THIS->print()->regions().size(); %}; %code%{ RETVAL = THIS->print()->regions().size(); %};
int region_volumes_count()
%code%{ RETVAL = THIS->region_volumes.size(); %};
Ref<Print> print(); Ref<Print> print();
Ref<ModelObject> model_object(); Ref<ModelObject> model_object();
Ref<StaticPrintConfig> config() Ref<StaticPrintConfig> config()