FIX: empty layer replacement may crash
When there are multiple empty layers needs to be replaced, error_msg is assigned multiple times simutaneously by tbb, which causes problem. Jira: STUDIO-3320 Change-Id: I52a48c9fe284d15aeb8e4e9e5d1db7e0c3321ad6 (cherry picked from commit fba54c063637a1bab4d835e2e5f8558b2affa4e6)
This commit is contained in:
parent
bc2357e9a3
commit
501e73913c
|
@ -675,9 +675,10 @@ std::string fix_slicing_errors(PrintObject* object, LayerPtrs &layers, const std
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_LOG_TRIVIAL(debug) << "Slicing objects - fixing slicing errors in parallel - begin";
|
BOOST_LOG_TRIVIAL(debug) << "Slicing objects - fixing slicing errors in parallel - begin";
|
||||||
|
std::atomic<bool> is_replaced = false;
|
||||||
tbb::parallel_for(
|
tbb::parallel_for(
|
||||||
tbb::blocked_range<size_t>(0, buggy_layers.size()),
|
tbb::blocked_range<size_t>(0, buggy_layers.size()),
|
||||||
[&layers, &throw_if_canceled, &buggy_layers, &error_msg](const tbb::blocked_range<size_t>& range) {
|
[&layers, &throw_if_canceled, &buggy_layers, &is_replaced](const tbb::blocked_range<size_t>& range) {
|
||||||
for (size_t buggy_layer_idx = range.begin(); buggy_layer_idx < range.end(); ++ buggy_layer_idx) {
|
for (size_t buggy_layer_idx = range.begin(); buggy_layer_idx < range.end(); ++ buggy_layer_idx) {
|
||||||
throw_if_canceled();
|
throw_if_canceled();
|
||||||
size_t idx_layer = buggy_layers[buggy_layer_idx];
|
size_t idx_layer = buggy_layers[buggy_layer_idx];
|
||||||
|
@ -724,7 +725,7 @@ std::string fix_slicing_errors(PrintObject* object, LayerPtrs &layers, const std
|
||||||
}
|
}
|
||||||
if (!expolys.empty()) {
|
if (!expolys.empty()) {
|
||||||
//BBS
|
//BBS
|
||||||
error_msg = L("Empty layers around bottom are replaced by nearest normal layers.");
|
is_replaced = true;
|
||||||
layerm->slices.set(union_ex(expolys), stInternal);
|
layerm->slices.set(union_ex(expolys), stInternal);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -735,6 +736,9 @@ std::string fix_slicing_errors(PrintObject* object, LayerPtrs &layers, const std
|
||||||
throw_if_canceled();
|
throw_if_canceled();
|
||||||
BOOST_LOG_TRIVIAL(debug) << "Slicing objects - fixing slicing errors in parallel - end";
|
BOOST_LOG_TRIVIAL(debug) << "Slicing objects - fixing slicing errors in parallel - end";
|
||||||
|
|
||||||
|
if(is_replaced)
|
||||||
|
error_msg = L("Empty layers around bottom are replaced by nearest normal layers.");
|
||||||
|
|
||||||
// remove empty layers from bottom
|
// remove empty layers from bottom
|
||||||
while (! layers.empty() && (layers.front()->lslices.empty() || layers.front()->empty())) {
|
while (! layers.empty() && (layers.front()->lslices.empty() || layers.front()->empty())) {
|
||||||
delete layers.front();
|
delete layers.front();
|
||||||
|
|
Loading…
Reference in New Issue