2298{
2299#ifdef SLIC3R_DEBUG
2300 static int iRun = 0;
2301#endif
2302
2303 if (top_contacts.empty())
2304
2305 return;
2306
2307 BOOST_LOG_TRIVIAL(debug) << "PrintObjectSupportMaterial::generate_base_layers() in parallel - start";
2308 tbb::parallel_for(
2309 tbb::blocked_range<size_t>(0, intermediate_layers.size()),
2310 [&
object, &bottom_contacts, &top_contacts, &intermediate_layers, &layer_support_areas](
const tbb::blocked_range<size_t>&
range) {
2311
2312 int idx_top_contact_above = -2;
2313 int idx_bottom_contact_overlapping = -2;
2314 int idx_object_layer_above = -2;
2315
2316 for (int idx_intermediate = int(range.end()) - 1; idx_intermediate >= int(range.begin()); -- idx_intermediate)
2317 {
2318 BOOST_LOG_TRIVIAL(trace) << "Support generator - generate_base_layers - creating layer " <<
2319 idx_intermediate << " of " << intermediate_layers.size();
2320 SupportGeneratorLayer &layer_intermediate = *intermediate_layers[idx_intermediate];
2321
2322 assert(idx_intermediate == 0 || layer_intermediate.print_z >= intermediate_layers[idx_intermediate - 1]->print_z);
2323
2324
2325
2326 Polygons polygons_new;
2327
2328
2329 idx_object_layer_above = idx_lower_or_equal(object.layers().begin(), object.layers().end(), idx_object_layer_above,
2330 [&layer_intermediate](const Layer* layer) { return layer->print_z <= layer_intermediate.print_z + EPSILON; });
2331
2332
2333 Polygons polygons_trimming;
2334
2335
2336
2337
2338
2339
2340
2341
2342 idx_top_contact_above = idx_lower_or_equal(top_contacts, idx_top_contact_above,
2343 [&layer_intermediate](const SupportGeneratorLayer *layer){ return layer->bottom_z <= layer_intermediate.print_z - EPSILON; });
2344
2345 for (int idx_top_contact_overlapping = idx_top_contact_above; idx_top_contact_overlapping >= 0; -- idx_top_contact_overlapping) {
2346 SupportGeneratorLayer &layer_top_overlapping = *top_contacts[idx_top_contact_overlapping];
2347 if (layer_top_overlapping.print_z < layer_intermediate.bottom_z + EPSILON)
2348 break;
2349
2350 assert(! (layer_intermediate.print_z > layer_top_overlapping.bottom_z + EPSILON && layer_intermediate.bottom_z < layer_top_overlapping.bottom_z - EPSILON));
2351 if (layer_intermediate.print_z <= layer_top_overlapping.print_z + EPSILON && layer_intermediate.bottom_z >= layer_top_overlapping.bottom_z - EPSILON)
2352
2353 polygons_append(polygons_trimming, layer_top_overlapping.polygons);
2354 }
2355
2356 if (idx_object_layer_above < 0) {
2357
2358
2359
2360 polygons_new = layer_support_areas.front();
2361 double first_layer_z = object.layers().front()->print_z;
2362 for (int i = idx_top_contact_above + 1; i < int(top_contacts.size()); ++ i) {
2363 SupportGeneratorLayer &contacts = *top_contacts[i];
2364 if (contacts.print_z > first_layer_z + EPSILON)
2365 break;
2366 assert(contacts.bottom_z > layer_intermediate.print_z - EPSILON);
2367 polygons_append(polygons_new, contacts.polygons);
2368 }
2369 } else
2370 polygons_new = layer_support_areas[idx_object_layer_above];
2371
2372
2373
2374
2375
2376
2377
2378
2379 idx_bottom_contact_overlapping = idx_lower_or_equal(bottom_contacts, idx_bottom_contact_overlapping,
2380 [&layer_intermediate](const SupportGeneratorLayer *layer){ return layer->bottom_print_z() <= layer_intermediate.print_z - EPSILON; });
2381
2382 for (int i = idx_bottom_contact_overlapping; i >= 0; -- i) {
2383 SupportGeneratorLayer &layer_bottom_overlapping = *bottom_contacts[i];
2384 if (layer_bottom_overlapping.print_z < layer_intermediate.bottom_print_z() + EPSILON)
2385 break;
2386
2387 assert(! (layer_intermediate.print_z > layer_bottom_overlapping.print_z + EPSILON && layer_intermediate.bottom_z < layer_bottom_overlapping.print_z - EPSILON));
2388 if (layer_intermediate.print_z <= layer_bottom_overlapping.print_z + EPSILON && layer_intermediate.bottom_z >= layer_bottom_overlapping.bottom_print_z() - EPSILON)
2389
2390 polygons_append(polygons_trimming, layer_bottom_overlapping.polygons);
2391 }
2392
2393 #ifdef SLIC3R_DEBUG
2394 {
2395 BoundingBox bbox = get_extents(polygons_new);
2396 bbox.merge(get_extents(polygons_trimming));
2397 ::Slic3r::SVG svg(debug_out_path("support-intermediate-layers-raw-%d-%lf.svg", iRun, layer_intermediate.print_z), bbox);
2398 svg.draw(union_ex(polygons_new), "blue", 0.5f);
2399 svg.draw(to_polylines(polygons_new), "blue");
2400 svg.draw(union_safety_offset_ex(polygons_trimming), "red", 0.5f);
2401 svg.draw(to_polylines(polygons_trimming), "red");
2402 }
2403 #endif
2404
2405
2406 if (polygons_trimming.empty())
2407 layer_intermediate.polygons = std::move(polygons_new);
2408 else
2409 layer_intermediate.polygons = diff(
2410 polygons_new,
2411 polygons_trimming,
2412 ApplySafetyOffset::Yes);
2413 layer_intermediate.layer_type = SupporLayerType::Base;
2414
2415 #if 0
2416
2417
2418 $base->{$i} = diff(
2419 offset2(
2420 $base->{$i},
2421 $fillet_radius_scaled,
2422 -$fillet_radius_scaled,
2423 # Use a geometric offsetting for filleting.
2424 JT_ROUND,
2425 0.2*$fillet_radius_scaled),
2426 $trim_polygons,
2427 false);
2428 }
2429 #endif
2430 }
2431 });
2432 BOOST_LOG_TRIVIAL(debug) << "PrintObjectSupportMaterial::generate_base_layers() in parallel - end";
2433
2434#ifdef SLIC3R_DEBUG
2435 for (SupportGeneratorLayersPtr::const_iterator it = intermediate_layers.begin(); it != intermediate_layers.end(); ++it)
2437 debug_out_path(
"support-intermediate-layers-untrimmed-%d-%lf.svg", iRun, (*it)->print_z),
2439 ++ iRun;
2440#endif
2441
2443}
auto range(Cont &&cont)
Definition libslic3r.h:356