OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
Slic3r::SupportMaterialInternal Namespace Reference

Functions

static bool has_bridging_perimeters (const ExtrusionLoop &loop)
static bool has_bridging_perimeters (const ExtrusionEntityCollection &perimeters)
static bool has_bridging_fills (const ExtrusionEntityCollection &fills)
static bool has_bridging_extrusions (const Layer &layer)
static void collect_bridging_perimeter_areas (const ExtrusionLoop &loop, const float expansion_scaled, Polygons &out)
static void collect_bridging_perimeter_areas (const ExtrusionEntityCollection &perimeters, const float expansion_scaled, Polygons &out)
static void remove_bridges_from_contacts (const PrintConfig &print_config, const Layer &lower_layer, const Polygons &lower_layer_polygons, const LayerRegion &layerm, float fw, Polygons &contact_polygons)

Function Documentation

◆ collect_bridging_perimeter_areas() [1/2]

void Slic3r::SupportMaterialInternal::collect_bridging_perimeter_areas ( const ExtrusionEntityCollection & perimeters,
const float expansion_scaled,
Polygons & out )
static
1280 {
1281 for (const ExtrusionEntity *ee : perimeters.entities) {
1282 if (ee->is_collection()) {
1283 for (const ExtrusionEntity *ee2 : static_cast<const ExtrusionEntityCollection*>(ee)->entities) {
1284 assert(! ee2->is_collection());
1285 if (ee2->is_loop())
1286 collect_bridging_perimeter_areas(*static_cast<const ExtrusionLoop*>(ee2), expansion_scaled, out);
1287 }
1288 } else if (ee->is_loop())
1289 collect_bridging_perimeter_areas(*static_cast<const ExtrusionLoop*>(ee), expansion_scaled, out);
1290 }
1291 }
Definition ExtrusionEntityCollection.hpp:33
ExtrusionEntitiesPtr entities
Definition ExtrusionEntityCollection.hpp:39
Definition ExtrusionEntity.hpp:121
virtual bool is_loop() const
Definition ExtrusionEntity.hpp:125
virtual bool is_collection() const
Definition ExtrusionEntity.hpp:124
Definition ExtrusionEntity.hpp:468
static void collect_bridging_perimeter_areas(const ExtrusionLoop &loop, const float expansion_scaled, Polygons &out)
Definition SupportMaterial.cpp:1251

References collect_bridging_perimeter_areas(), Slic3r::ExtrusionEntityCollection::entities, Slic3r::ExtrusionEntity::is_collection(), and Slic3r::ExtrusionEntity::is_loop().

Here is the call graph for this function:

◆ collect_bridging_perimeter_areas() [2/2]

void Slic3r::SupportMaterialInternal::collect_bridging_perimeter_areas ( const ExtrusionLoop & loop,
const float expansion_scaled,
Polygons & out )
inlinestatic
1252 {
1253 assert(expansion_scaled >= 0.f);
1254 for (const ExtrusionPath &ep : loop.paths)
1255 if (ep.role() == erOverhangPerimeter && ! ep.polyline.empty()) {
1256 float exp = 0.5f * (float)scale_(ep.width) + expansion_scaled;
1257 if (ep.is_closed()) {
1258 if (ep.size() >= 3) {
1259 // This is a complete loop.
1260 // Add the outer contour first.
1261 Polygon poly;
1262 // Convert Points3 to Points
1263 for (const Point3 &p3 : ep.polyline.points)
1264 poly.points.emplace_back(p3.x(), p3.y());
1265 poly.points.pop_back();
1266 if (poly.area() < 0)
1267 poly.reverse();
1271 polygons_append(out, holes);
1272 }
1273 } else if (ep.size() >= 2) {
1274 // Offset the polyline.
1276 }
1277 }
1278 }
#define SUPPORT_SURFACES_OFFSET_PARAMETERS
Definition PrintObject.cpp:5148
ExtrusionPaths paths
Definition ExtrusionEntity.hpp:470
Definition ExtrusionEntity.hpp:175
Polyline3 polyline
Definition ExtrusionEntity.hpp:177
float width
Definition ExtrusionEntity.hpp:183
ExtrusionRole role() const override
Definition ExtrusionEntity.hpp:295
size_t size() const
Definition ExtrusionEntity.hpp:283
bool is_closed() const
Definition ExtrusionEntity.hpp:285
bool empty() const
Definition MultiPoint.hpp:150
Points3 points
Definition MultiPoint.hpp:129
Definition Point.hpp:283
Definition Polygon.hpp:31
#define scale_(val)
Definition libslic3r.h:106
void polygons_reverse(Polygons &polys)
Definition Polygon.hpp:177
@ erOverhangPerimeter
Definition ExtrusionEntity.hpp:30
std::vector< Polygon, PointsAllocator< Polygon > > Polygons
Definition Polygon.hpp:22
Slic3r::Polygons offset(const Slic3r::Polygon &polygon, const float delta, JoinType joinType, double miterLimit)
Definition ClipperUtils.cpp:582
void polygons_append(Polygons &dst, const ExPolygon &src)
Definition ExPolygon.hpp:411
const Polygons & holes(const ExPolygon &p)
Definition AGGRaster.hpp:31

References Slic3r::MultiPoint3::empty(), Slic3r::erOverhangPerimeter, Slic3r::holes(), Slic3r::ExtrusionPath::is_closed(), Slic3r::offset(), Slic3r::ExtrusionLoop::paths, Slic3r::MultiPoint3::points, Slic3r::polygons_append(), Slic3r::polygons_reverse(), Slic3r::ExtrusionPath::polyline, Slic3r::ExtrusionPath::role(), scale_, Slic3r::ExtrusionPath::size(), SUPPORT_SURFACES_OFFSET_PARAMETERS, and Slic3r::ExtrusionPath::width.

Referenced by collect_bridging_perimeter_areas(), and Slic3r::PrintObjectSupportMaterial::trim_support_layers_by_object().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ has_bridging_extrusions()

bool Slic3r::SupportMaterialInternal::has_bridging_extrusions ( const Layer & layer)
static
1241 {
1242 for (const LayerRegion *region : layer.regions()) {
1244 return true;
1245 if (region->fill_surfaces.has(stBottomBridge) && has_bridging_fills(region->fills))
1246 return true;
1247 }
1248 return false;
1249 }
Definition Layer.hpp:48
const LayerRegionPtrs & regions() const
Definition Layer.hpp:185
static bool has_bridging_fills(const ExtrusionEntityCollection &fills)
Definition SupportMaterial.cpp:1227
static bool has_bridging_perimeters(const ExtrusionLoop &loop)
Definition SupportMaterial.cpp:1205
@ stBottomBridge
Definition Surface.hpp:22

References has_bridging_fills(), has_bridging_perimeters(), Slic3r::Layer::regions(), and Slic3r::stBottomBridge.

Referenced by Slic3r::new_contact_layer().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ has_bridging_fills()

bool Slic3r::SupportMaterialInternal::has_bridging_fills ( const ExtrusionEntityCollection & fills)
static
1228 {
1229 for (const ExtrusionEntity *ee : fills.entities) {
1230 assert(ee->is_collection());
1231 for (const ExtrusionEntity *ee2 : static_cast<const ExtrusionEntityCollection*>(ee)->entities) {
1232 assert(! ee2->is_collection());
1233 assert(! ee2->is_loop());
1234 if (ee2->role() == erBridgeInfill || ee2->role() == erInternalBridgeInfill)
1235 return true;
1236 }
1237 }
1238 return false;
1239 }
@ erBridgeInfill
Definition ExtrusionEntity.hpp:36
@ erInternalBridgeInfill
Definition ExtrusionEntity.hpp:37

References Slic3r::ExtrusionEntityCollection::entities, Slic3r::erBridgeInfill, Slic3r::erInternalBridgeInfill, and Slic3r::ExtrusionEntity::is_collection().

Referenced by has_bridging_extrusions().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ has_bridging_perimeters() [1/2]

bool Slic3r::SupportMaterialInternal::has_bridging_perimeters ( const ExtrusionEntityCollection & perimeters)
static
1213 {
1214 for (const ExtrusionEntity *ee : perimeters.entities) {
1215 if (ee->is_collection()) {
1216 for (const ExtrusionEntity *ee2 : static_cast<const ExtrusionEntityCollection*>(ee)->entities) {
1217 assert(! ee2->is_collection());
1218 if (ee2->is_loop())
1219 if (has_bridging_perimeters(*static_cast<const ExtrusionLoop*>(ee2)))
1220 return true;
1221 }
1222 } else if (ee->is_loop() && has_bridging_perimeters(*static_cast<const ExtrusionLoop*>(ee)))
1223 return true;
1224 }
1225 return false;
1226 }

References Slic3r::ExtrusionEntityCollection::entities, has_bridging_perimeters(), Slic3r::ExtrusionEntity::is_collection(), and Slic3r::ExtrusionEntity::is_loop().

Here is the call graph for this function:

◆ has_bridging_perimeters() [2/2]

bool Slic3r::SupportMaterialInternal::has_bridging_perimeters ( const ExtrusionLoop & loop)
inlinestatic
1206 {
1207 for (const ExtrusionPath &ep : loop.paths)
1208 if (ep.role() == erOverhangPerimeter && ! ep.polyline.empty())
1209 return int(ep.size()) >= (ep.is_closed() ? 3 : 2);
1210 return false;
1211 }

References Slic3r::MultiPoint3::empty(), Slic3r::erOverhangPerimeter, Slic3r::ExtrusionPath::is_closed(), Slic3r::ExtrusionLoop::paths, Slic3r::ExtrusionPath::polyline, Slic3r::ExtrusionPath::role(), and Slic3r::ExtrusionPath::size().

Referenced by has_bridging_extrusions(), and has_bridging_perimeters().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ remove_bridges_from_contacts()

void Slic3r::SupportMaterialInternal::remove_bridges_from_contacts ( const PrintConfig & print_config,
const Layer & lower_layer,
const Polygons & lower_layer_polygons,
const LayerRegion & layerm,
float fw,
Polygons & contact_polygons )
static
1300 {
1301 // compute the area of bridging perimeters
1302 Polygons bridges;
1303 {
1304 // Surface supporting this layer, expanded by 0.5 * nozzle_diameter, as we consider this kind of overhang to be sufficiently supported.
1305 Polygons lower_grown_slices = expand(lower_layer_polygons,
1306 //FIXME to mimic the decision in the perimeter generator, we should use half the external perimeter width.
1307 0.5f * float(scale_(print_config.nozzle_diameter.get_at(layerm.region().config().outer_wall_filament_id-1))),
1309 // Collect perimeters of this layer.
1310 //FIXME split_at_first_point() could split a bridge mid-way
1311 #if 0
1312 Polylines overhang_perimeters = layerm.perimeters.as_polylines();
1313 // workaround for Clipper bug, see Slic3r::Polygon::clip_as_polyline()
1314 for (Polyline &polyline : overhang_perimeters)
1315 polyline.points[0].x += 1;
1316 // Trim the perimeters of this layer by the lower layer to get the unsupported pieces of perimeters.
1317 overhang_perimeters = diff_pl(overhang_perimeters, lower_grown_slices);
1318 #else
1319 Polylines overhang_perimeters = diff_pl(layerm.perimeters.as_polylines(), lower_grown_slices);
1320 #endif
1321
1322 // only consider straight overhangs
1323 // only consider overhangs having endpoints inside layer's slices
1324 // convert bridging polylines into polygons by inflating them with their thickness
1325 // since we're dealing with bridges, we can't assume width is larger than spacing,
1326 // so we take the largest value and also apply safety offset to be ensure no gaps
1327 // are left in between
1328 // BBS
1329 const PrintObjectConfig& object_config = layerm.layer()->object()->config();
1330 Flow perimeter_bridge_flow = layerm.bridging_flow(frPerimeter, object_config.thick_bridges);
1331 //FIXME one may want to use a maximum of bridging flow width and normal flow width, as the perimeters are calculated using the normal flow
1332 // and then turned to bridging flow, thus their centerlines are derived from non-bridging flow and expanding them by a bridging flow
1333 // may not expand them to the edge of their respective islands.
1334 const float w = float(0.5 * std::max(perimeter_bridge_flow.scaled_width(), perimeter_bridge_flow.scaled_spacing())) + scaled<float>(0.001);
1335 for (Polyline &polyline : overhang_perimeters)
1336 if (polyline.is_straight()) {
1337 // This is a bridge
1338 polyline.extend_start(fw);
1339 polyline.extend_end(fw);
1340 // Is the straight perimeter segment supported at both sides?
1341 Point pts[2] = { polyline.first_point(), polyline.last_point() };
1342 bool supported[2] = { false, false };
1343 for (size_t i = 0; i < lower_layer.lslices.size() && ! (supported[0] && supported[1]); ++ i)
1344 for (int j = 0; j < 2; ++ j)
1345 if (! supported[j] && lower_layer.lslices_bboxes[i].contains(pts[j]) && lower_layer.lslices[i].contains(pts[j]))
1346 supported[j] = true;
1347 if (supported[0] && supported[1])
1348 // Offset a polyline into a thick line.
1349 polygons_append(bridges, offset(polyline, w));
1350 }
1351 bridges = union_(bridges);
1352 }
1353 // remove the entire bridges and only support the unsupported edges
1354 //FIXME the brided regions are already collected as layerm.bridged. Use it?
1355 for (const Surface &surface : layerm.fill_surfaces.surfaces)
1356 if (surface.surface_type == stBottomBridge && surface.bridge_angle >= 0.0)
1357 polygons_append(bridges, surface.expolygon);
1358 //FIXME add the gap filled areas. Extrude the gaps with a bridge flow?
1359 // Remove the unsupported ends of the bridges from the bridged areas.
1360 //FIXME add supports at regular intervals to support long bridges!
1361 bridges = diff(bridges,
1362 // Offset unsupported edges into polygons.
1364 // Remove bridged areas from the supported areas.
1365 contact_polygons = diff(contact_polygons, bridges, ApplySafetyOffset::Yes);
1366
1367 #ifdef SLIC3R_DEBUG
1368 static int iRun = 0;
1369 SVG::export_expolygons(debug_out_path("support-top-contacts-remove-bridges-run%d.svg", iRun ++),
1370 { { { union_ex(offset(layerm.unsupported_bridge_edges, scale_(SUPPORT_MATERIAL_MARGIN), SUPPORT_SURFACES_OFFSET_PARAMETERS)) }, { "unsupported_bridge_edges", "orange", 0.5f } },
1371 { { union_ex(contact_polygons) }, { "contact_polygons", "blue", 0.5f } },
1372 { { union_ex(bridges) }, { "bridges", "red", "black", "", scaled<coord_t>(0.1f), 0.5f } } });
1373 #endif /* SLIC3R_DEBUG */
1374 }
#define SUPPORT_MATERIAL_MARGIN
Definition PrintObject.cpp:5149
virtual Polylines as_polylines() const
Definition ExtrusionEntity.hpp:155
Definition Flow.hpp:55
coord_t scaled_width() const
Definition Flow.hpp:64
coord_t scaled_spacing() const
Definition Flow.hpp:71
Flow bridging_flow(FlowRole role, bool thick_bridge=false) const
Definition LayerRegion.cpp:58
ExtrusionEntityCollection perimeters
Definition Layer.hpp:86
const PrintRegion & region() const
Definition Layer.hpp:52
SurfaceCollection fill_surfaces
Definition Layer.hpp:73
Layer * layer()
Definition Layer.hpp:50
Polylines unsupported_bridge_edges
Definition Layer.hpp:82
ExPolygons lslices
Definition Layer.hpp:170
std::vector< BoundingBox > lslices_bboxes
Definition Layer.hpp:172
PrintObject * object()
Definition Layer.hpp:143
Definition Point.hpp:199
Definition Polyline.hpp:25
const PrintObjectConfig & config() const
Definition Print.hpp:372
const PrintRegionConfig & config() const
Definition Print.hpp:154
static void export_expolygons(const char *path, const BoundingBox &bbox, const Slic3r::ExPolygons &expolygons, std::string stroke_outer="black", std::string stroke_holes="blue", coordf_t stroke_width=0)
Definition SVG.cpp:381
Surfaces surfaces
Definition SurfaceCollection.hpp:17
Slic3r::Polygons union_(const Slic3r::Polygons &subject)
Definition ClipperUtils.cpp:801
std::string debug_out_path(const char *name,...)
Definition utils.cpp:382
BoundingBox scaled(const BoundingBoxf &bb)
Definition BoundingBox.hpp:284
Slic3r::Polylines diff_pl(const Slic3r::Polyline &subject, const Slic3r::Polygons &clip)
Definition ClipperUtils.cpp:1099
Slic3r::Polygons expand(const Slic3r::Polygon &polygon, const float delta, JoinType joinType=DefaultJoinType, double miterLimit=DefaultMiterLimit)
Definition ClipperUtils.hpp:397
std::vector< Polyline > Polylines
Definition Polyline.hpp:22
@ frPerimeter
Definition Flow.hpp:20
zaa_minimize_perimeter_height PrintObjectConfig
Definition PrintConfig.hpp:2183
Slic3r::ExPolygons union_ex(const Slic3r::Polygons &subject, PolyFillType fill_type)
Definition ClipperUtils.cpp:1011
@ Yes
Definition ClipperUtils.hpp:51
Slic3r::Polygons diff(const Slic3r::Polygon &subject, const Slic3r::Polygon &clip, ApplySafetyOffset do_safety_offset)
Definition ClipperUtils.cpp:731

References Slic3r::ExtrusionEntity::as_polylines(), Slic3r::Surface::bridge_angle, Slic3r::LayerRegion::bridging_flow(), Slic3r::PrintObject::config(), Slic3r::PrintRegion::config(), Slic3r::debug_out_path(), Slic3r::diff(), Slic3r::diff_pl(), Slic3r::expand(), Slic3r::Surface::expolygon, Slic3r::SVG::export_expolygons(), Slic3r::LayerRegion::fill_surfaces, Slic3r::frPerimeter, Slic3r::LayerRegion::layer(), Slic3r::Layer::lslices, Slic3r::Layer::lslices_bboxes, Slic3r::Layer::object(), Slic3r::offset(), Slic3r::LayerRegion::perimeters, Slic3r::polygons_append(), Slic3r::PrintObjectConfig, Slic3r::LayerRegion::region(), scale_, Slic3r::scaled(), Slic3r::Flow::scaled_spacing(), Slic3r::Flow::scaled_width(), Slic3r::stBottomBridge, SUPPORT_MATERIAL_MARGIN, SUPPORT_SURFACES_OFFSET_PARAMETERS, Slic3r::Surface::surface_type, Slic3r::SurfaceCollection::surfaces, Slic3r::union_(), Slic3r::union_ex(), Slic3r::LayerRegion::unsupported_bridge_edges, and Slic3r::Yes.

Referenced by Slic3r::detect_overhangs().

Here is the call graph for this function:
Here is the caller graph for this function: